标题: 单片机24c02读取问题 有几句源代码不理解 [打印本页]

作者: Yubug    时间: 2018-4-8 17:49
标题: 单片机24c02读取问题 有几句源代码不理解
uchar iicre_byte(void)  
{  
uchar i;
uchar dat;
scl=0;  
delay();  
sda=1;  
delay(); //////////???????????
     for(i=0;i<8;i++)  
     {  
        scl=1;  
        delay();  
        dat=dat<<1;  
        if(sda)  
       {  
        dat++;
       }  
        scl=0;  
       delay();  
      }  
return dat;
}




uchar read_byte()
{
                uchar i,k;


                for(i=0;i<8;i++)
                {
                scl=1;      
                k=(k<<1)|sda;   
                scl=0;
                }
                scl=0;
                sda=1;
                return k;
}
这两个程序都可以完成读取。第一个for前面加的scl,delay,sda,delay是什么意思?要不要不是都行吗,求指点。


作者: Yubug    时间: 2018-4-8 22:05
或者说按我的理解应该放在for语句后面~~~前后一样?
作者: 51jia    时间: 2018-4-8 23:47
个人觉得,怎么写代码没关系,只要能满足I2C协议条件就行。
作者: arthuryu    时间: 2018-4-9 07:57
前面一个比较安全。后面一个与主频相关。因为I2C协议对时间间隔是有要求的。
作者: HC6800-ES-V2.0    时间: 2018-4-9 08:29
你将I2C通讯时序搞清楚了,这些语句及排列就可以搞明白了。
第一个程序,可能有程序员自己的习惯,编写的程序留有余地——时钟信号与数据信号间,留了反应时间。
第二个程序,有全盘考虑,在其它操作时,已经先确定了两线的信号,所以这里不再设置。

可以这样说:第一个程序移植性较好,第二段程序移植性不好。你可以在网上找找I2C的通用程序,那个移植性肯定非常好,对照一下,可以学到很多东西。
作者: Yubug    时间: 2018-4-9 08:52
51jia 发表于 2018-4-8 23:47
个人觉得,怎么写代码没关系,只要能满足I2C协议条件就行。

我删掉第九位sda的置高程序也没有问题~干了,条件这么宽松吗,还是我没有真正理解?
作者: werrfccd    时间: 2018-4-9 10:01
严格按照时序来写就没错
作者: 1433864957    时间: 2018-4-9 10:45
zh俄格问题有点难,研究研究
作者: 自强不息的波波    时间: 2018-4-9 13:29
适当的短暂延时有助于系统稳定,适当重复操作可以提高系统的耐操性。高手写的程序和新手写的程序的差别。
作者: Yubug    时间: 2018-4-9 14:19
HC6800-ES-V2.0 发表于 2018-4-9 08:29
你将I2C通讯时序搞清楚了,这些语句及排列就可以搞明白了。
第一个程序,可能有程序员自己的习惯,编写的 ...

谢谢了。
我查了查,他们说第一个的那几句是置数据线为输入方式。最近有点忙,有时间在细细的查查
作者: 51jia    时间: 2018-4-9 23:26
Yubug 发表于 2018-4-9 08:52
我删掉第九位sda的置高程序也没有问题~干了,条件这么宽松吗,还是我没有真正理解?

I2C协议只要时间大于4.7us就行。
作者: hulujia    时间: 2018-4-10 16:55
这个学习的时候老师说得有5us的时延,有严格的时序,你可以看看时序图




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1