镜中风铃 发表于 2012-11-13 23:16:35

关于 DS1302的 读操作

/**
* 读一个字节
*/
uint8 read_ds1302_byte(void)
{
        uint8 i, dat=0;


       
        for (i=0;i<8;i++)
        {          
                       
                dat >>= 1;
                                  
                if (SDA)
                     dat |= 0x80;
                SCK = 1;
                SCK = 0;
                       
               
}

        return dat;
}


上面的读操作是正确的 但是我想 第一次循环的时候在没有出现下降沿的时候IF 语句根本判断不出来是高电平还是低电平啊,于是我换成这种写法

/**
* 读一个字节
*/
uint8 read_ds1302_byte(void)
{
        uint8 i, dat=0;


       
        for (i=0;i<8;i++)
        {          
                       
                  
                            dat >>= 1;
                                  
               

                           SCK = 1;
               
                          SCK = 0;
                                       if (SDA)
                                dat |= 0x80;
                       
               
}

        return dat;
}

但是结果是错的,作为菜鸟我感觉糊涂了 望论坛里的朋友指点,还有这种写法:
/**
* 读一个字节
*/
uint8 read_ds1302_byte(void)
{
        uint8 i,k,dat=0;


       
        for (i=0;i<8;i++)
        {          
                       
                  
                            dat >>= 1;
                                  
                                k = SDA;

                           SCK = 1;
               
                          SCK = 0;
                                       if (k)
                                dat |= 0x80;
                       
               
}

        return dat;
}

跟 错误的写法有什么区别吗??

sf49ers 发表于 2012-11-13 23:38:45

不能光看这个函数。read之前先有个write命令,结合write一起看。我觉得可能在write最后已经产生下降沿了。
最后一个程序增加了下降沿到读IO的延时,因为下降沿到数据稳定最多会有几百纳秒延时,他这么写就不用加nop延时

小风呼呼 发表于 2012-11-14 17:33:10

我觉得应该好好看看读取时序图。下降沿到来前,SDA数据已经准备好了,可以进行判断。下降沿过后就是下一个数据准备好了,判断操作过后再一个下降沿又是1bit准备好了,依次读取8bit组成了一个字节。那个错误写法就把时序弄乱了。
楼主学的是小宋老师的视频吧?
页: [1]
查看完整版本: 关于 DS1302的 读操作