#define RTC_PORT 2
#define RTC_CE 1
#define RTC_IO 3
#define RTC_SCLK 5
void Init_DS1302(void);
U8 DS1302Read(U8 cmd);
U8 DS1302ReadByte(void);
void DS1302WriteByte(U8 dat);
void DS1302Write(U8 cmd,U8 dat);
void Init_DS1302(void)
{
GPIO_SetDir(RTC_PORT,1u<<RTC_CE,1);
GPIO_SetDir(RTC_PORT,1u<<RTC_SCLK,1);
GPIO_SetDir(RTC_PORT,1u<<RTC_IO,1);
DS1302Write(0x80,0x00);
DS1302Write(0x82,0x00);
DS1302Write(0x84,0x20);
DS1302Write(0x86,0x09);
DS1302Write(0x88,0x25);
DS1302Write(0x8A,0x12);
DS1302Write(0x8C,0x10);
DS1302Write(0x8E,0x06);
DS1302Write(0x90,0x01);
DS1302Write(0xC0,0xf0);
DS1302Write(0x8E,0x80);
}
U8 DS1302Read(U8 cmd)
{
U8 dat;
GPIO_ClearValue(RTC_PORT,1u<<RTC_CE);
GPIO_ClearValue(RTC_PORT,1u<<RTC_SCLK);
GPIO_SetValue(RTC_PORT,1u<<RTC_CE);
DS1302WriteByte(cmd);
dat=DS1302ReadByte();
GPIO_ClearValue(RTC_PORT,1u<<RTC_SCLK);
GPIO_ClearValue(RTC_PORT,1u<<RTC_CE);
return dat;
}
void DS1302Write(U8 cmd, U8 dat)
{
GPIO_ClearValue(RTC_PORT,1u<<RTC_CE);
GPIO_ClearValue(RTC_PORT,1u<<RTC_SCLK);
GPIO_SetValue(RTC_PORT,1u<<RTC_CE);
DS1302WriteByte(cmd);
DS1302WriteByte(dat);
GPIO_ClearValue(RTC_PORT,1u<<RTC_SCLK);
GPIO_ClearValue(RTC_PORT,1u<<RTC_CE);
}
void DS1302WriteByte(U8 dat)
{
U8 i;
GPIO_SetDir(RTC_PORT,1u<<RTC_IO,1);
for(i=0;i<8;i++)
{
GPIO_ClearValue(RTC_PORT,1u<<RTC_SCLK);
// sleep(1);
if(dat&0x01)
{
GPIO_SetValue(RTC_PORT,1u<<RTC_IO);
}
else
{
GPIO_ClearValue(RTC_PORT,1u<<RTC_IO);
}
// sleep(1);
GPIO_SetValue(RTC_PORT,1u<<RTC_SCLK);
// sleep(1);
dat>>=1;
sleep(1);
}
}
U8 DS1302ReadByte(void)
{
U8 i,dat=0;
GPIO_SetDir(RTC_PORT,1u<<RTC_IO,0);
for(i=0;i<8;i++)
{
dat>>=1;
GPIO_ClearValue(RTC_PORT,1u<<RTC_SCLK);
// sleep(1);
GPIO_SetValue(RTC_PORT,1u<<RTC_SCLK);
// sleep(1);
if((GPIO_ReadValue(RTC_PORT)&(1u<<RTC_IO))!=0)
{
dat|=0x80;
}
}
return dat;
}
原理图如下