关于 DS1302的 读操作

2020-02-02 09:23发布

/**
* 读一个字节
*/
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;
}

跟 错误的写法有什么区别吗??
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
sf49ers
1楼-- · 2020-02-02 11:13
 精彩回答 2  元偷偷看……
小风呼呼
2楼-- · 2020-02-02 14:31
我觉得应该好好看看读取时序图。下降沿到来前,SDA数据已经准备好了,可以进行判断。下降沿过后就是下一个数据准备好了,判断操作过后再一个下降沿又是1bit准备好了,依次读取8bit组成了一个字节。那个错误写法就把时序弄乱了。
楼主学的是小宋老师的视频吧?

一周热门 更多>