大家看看我这个DS1302 通信程序哪错了
void DS1302ByteWrite(unsigned char dat)
{
unsigned char mask;
for (mask=0x01; mask!=0; mask<<=1)
{
if ((mask&dat) != 0)
DS1302_IO = 1;
else
DS1302_IO = 0;
DS1302_CK = 1;
}
DS1302_IO = 1;
}
unsigned char DS1302ByteRead()
{
unsigned char mask;
unsigned char dat = 0;
for (mask=0x01; mask!=0; mask<<=1)
{
if (DS1302_IO != 0)
{
dat |= mask;
}
DS1302_CK = 1;
DS1302_CK = 0;
}
return dat;
}
void DS1302SingleWrite(uint8 reg,uint8 dat)
{
DS1302_CE = 1;
DS1302ByteWrite((reg<<1)|0x80);
DS1302ByteWrite(dat);
DS1302_CE = 0;
}
uint8 DS1302SingleRead(uint8 reg)
{
uint8 dat;
DS1302_CE = 1;
DS1302ByteWrite((reg<<1)|0x81);
dat = DS1302ByteRead();
DS1302_CE = 0;
return dat;
}
void DS1302BurstWrite(uint8 *dat)
{
uint8 i;
DS1302_CE = 1;
DS1302ByteWrite(0xBE);
for(i = 0;i < 8;i++)
DS1302ByteWrite(dat);
DS1302_CE = 0;
}
void DS1302BurstRead(uint8 *dat)
{
uint8 i;
DS1302_CE = 1;
DS1302ByteWrite(0xBF);
for(i = 0;i < 8;i++)
dat = DS1302ByteRead();
DS1302_CE = 0;
}
void InitDS1302()
{
uint8 dat;
struct sTime code InintTime = {
0x2017,0x05,0x14,0x11,0x11,0x00,0x07
};
DS1302_CE = 0;
DS1302_CK = 0;
dat = DS1302SingleRead(0);
if((dat&0x80) == 0x80)
{
DS1302SingleWrite(7,0x00);
SetRealTime(&InintTime);
}
}
1302的年份只有后两位,也就是2017只有17这两位,1302日历的顺序是年,星期,月,日,时,分,秒,在1302初始化时你判断了时钟是否被暂停,现在要测试程序,就不需要判断了,直接对时钟初始化就好了
我改了可以了不是二楼的问题,不过我改了不知道为什么这么改
这个函数为什么读取结束后要加
#############
DS1302_CK = 1;
DS1302_IO = 0;
DS1302_IO = 1;
DS1302_CK = 0;
###############
uint8 DS1302SingleRead(uint8 reg)
{
uint8 dat;
DS1302_CE = 1;
DS1302ByteWrite((reg<<1)|0x81);
dat = DS1302ByteRead();
DS1302_CE = 0;
DS1302_CK = 1;
DS1302_IO = 0;
DS1302_IO = 1;
DS1302_CK = 0;
return dat;
}
还有初始化DS13的函数不判断与可保持时间
void InitDS1302()
{
uint8 dat;
struct sTime code InintTime = {
0x2017,0x05,0x15,0x22,0x12,0x00,0x02
};
DS1302_CE = 0;
DS1302_CK = 0;
//dat = DS1302SingleRead(0);
//if((dat&0x8 ) != 0)
{
DS1302SingleWrite(7,0x00);
SetRealTime(&InintTime);
DS1302SingleWrite(7,0x80);
}
}
看下时序图
时序图没有没有这个部分
刚看了一下,后面修改的那部分最好还是不要,因为说不清起了什么左右,另外在void DS1302ByteWrite(unsigned char dat)里,只有 DS1302_CK = 1; ,而没有 DS1302_CK = 0; ,这样在向1302写数据时,时钟引脚没有任何变化,那么后来修改调通也不知道是否真的调通了
表示关注中