微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大家看看我这个DS1302 通信程序哪错了

大家看看我这个DS1302 通信程序哪错了

时间:10-02 整理:3721RD 点击:
编译成功了,可是时间无法显示,我测试过了,其他模块没有问题,就是这个模块不知道哪错了。
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写数据时,时钟引脚没有任何变化,那么后来修改调通也不知道是否真的调通了

表示关注中

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top