DS1302读取数据问题

2019-07-16 03:39发布

本帖最后由 cjunrong 于 2012-11-20 16:14 编辑

    各位,我用单片机驱动DS1302的时候遇到了一点问题,在读取数据的时候,使用下面的程序时读取的数值总是错误的,
        for(i=0;i<8;i++)
        {
                ds1302_SCLK=1;
                ds1302_SCLK=0;
                if(ds1302_IO==1)
                        date=date|0x80;
                date>>=1;
        }

而使用下面的程序的时候就是正确的

        for(i=0;i<8;i++)
       {
                if(ds1302_IO)
                        date|=0x80;                        //每次传输低字节
               ds1302_SCLK=0;
              date>>=1;                      //右移一位
                 ds1302_SCLK=1;
        }

看资料说是在下降沿读走数据,而这对于这两个函数断,为啥第一个不行,而第二个行,小弟实在是搞不明白,还望哪位大侠指点一下...!         

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
3htech
1楼-- · 2019-07-16 09:36
两个程序有着根本的区别。
要注意读数据时,SCLK的状态。
yatoo
2楼-- · 2019-07-16 12:55
要是 下降沿时候 芯片送出数据的话,你的程序貌似没有错....
yatoo
3楼-- · 2019-07-16 17:43
 精彩回答 2  元偷偷看……
lstcspring
4楼-- · 2019-07-16 19:39
先把数据写到端口上,再通过时钟信号,将这个信号移出
cjunrong
5楼-- · 2019-07-16 20:49
lstcspring 发表于 2012-11-20 20:55
先把数据写到端口上,再通过时钟信号,将这个信号移出

好的,非常感谢...!祝生活愉快
cjunrong
6楼-- · 2019-07-17 00:40
yatoo 发表于 2012-11-20 17:16
这儿说的很明白,,数据的第一位,是紧接着命令最后一位的下降沿,期间需要保持RST高。。。。

你的第一 ...

你好,非常感谢...!我看了之后做了修改,还是不行,因为在写完地址的最后一个字节后sclk是处于高电平的状态,进入读状态的时候第一次ds1302_SCLK=1;sclk并没有发生变化,所以应该是没有使sclk错过一个周期。也许是我还没能彻底理解你的意思或者理解错了,以下是修改还是不行的结果(/**/中间被注释掉的是可以正常工作的)
uchar ds1302_read_byte(uchar address)
{
        unsigned char date,i,temp;
        temp=address;
        ds1302_CE=0;
        ds1302_SCLK=0;
        ds1302_IO=0;
        ds1302_CE=1;
        //写地址
        for(i=0;i<8;i++)
        {       
                ds1302_SCLK=0;
                ds1302_IO=temp&0x01;
                temp>>=1;
                ds1302_SCLK=1;
        }
        //读数据
        for(i=0;i<8;i++)
        {
                ds1302_SCLK=0;
                if(ds1302_IO==1)
                        date=date|0x80;
                date>>=1;
                ds1302_SCLK=1;
                /*if(ds1302_IO)
                        date|=0x80;                        //每次传输低字节
                ds1302_SCLK=0;
                date>>=1;                        //右移一位
                ds1302_SCLK=1; */
        }
        ds1302_CE=0;
        return date;
}

也许像版祝所说的,先把数据写到端口上,再通过时钟信号,将这个信号移出。也很有可能是我还没能理解你的意思!
非常谢谢,祝生活愉快...!



一周热门 更多>