关于DS1302的读数据时序

2019-03-24 19:01发布

   遇到一个奇怪的事情,开发板上的读取DS1302的时序与datasheet上的不一致,却能正常读写;我按照我的理解改写后,确不能读写。具体如下:    1.  该图是DS1302的读时序,可以看到数据是下降沿后输出。也就是在SCLK下降沿后,I/O上输出串行数据,该数据需要单片机对其接收。对于这种方式,用一种不太恰当的说法就是“10D10D10D......”,其中1、0表示SCLK的输出,D表示单片机接收数据    2.  开发板上的程序如下:        Write_Ds1302_Byte(address);   //写入“读”控制命令
     for (i=0;i<8;i++)   //循环8次 读取数据
       {  
        if(SDA)
            temp|=0x80;   //每次传输低字节
        SCK=0;
        temp>>=1;   //右移一位
        SCK=1;
        _nop_();
       }
        同样用上述表达方式,这个程序的流程是“D01D01D01......”,这显然是与datasheet上的说法不同。    3.  用2的程序,可以正常读写;若把它的流程改为与datasheet一致,即“10D10D......”,显示却不能正常读写。        改程序只需改for循环内部,改后如下:            SCK=0;        //上一个函数已将SCK给1,故给0即产生下降沿  
        if(SDA)
            temp|=0x80;   //每次传输低字节
         temp>>=1;   //右移一位
         SCK=1;
        _nop_();
  是我理解错了,还是datasheet上的图有误?求指教!   此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
蚂蚁逛街
1楼-- · 2019-03-25 18:05
谢谢版主小小白,自己顶个~
abo6016
2楼-- · 2019-03-25 23:13
是我没看仔细,我晕= = 下次会注意,我看成是写指令了= =还在纳闷。。
zdl133447567
3楼-- · 2019-03-26 03:06

这个帖子不错,也帮助我解决了问题。

    我说下我的想法吧 ,进入for循环后,先右移一次,再读取数据 。假设原来是00000000 右移后,低位0溢出,高位补0,也就是说开始的最低位是没有意义的。我们再想一下这个问题,第一次读取的数据放在最高位,把他移到最低位只需要七次,如果先读取数据再右移的话,那么第一次读取的数据会被溢出,而且最高位会补0.所以会出错。

    也就是说我们希望的是读取八次,但是只需要移动七次。

 

蚂蚁逛街
4楼-- · 2019-03-26 08:08
"我们希望的是读取八次,但是只需要移动七次"
  精辟!
常见泽1
5楼-- · 2019-03-26 09:35
 精彩回答 2  元偷偷看……
07031529
6楼-- · 2019-03-26 11:18
嗯,,这个说明两方面的知识,
1.时序问题
2.移位问题,
都是有一点小纠结,但是都是很经典,这个移位以及他应该放的位置 与前个控制字的scl是否制0,有关,,

一周热门 更多>