关于iic总线。看过很多资料,很多都相互矛盾。在主机读取数据之前,是否需要拉高sda=1??问题很长,看补充

有一本书中:scl从高变低,主机接受数据??scl从低变高,主机发送数据??还有文献并没有如此规定。答案究竟如何??
在主机接受数据时,sda和scl究竟如何变化?
这是郭天祥写的读程序:
uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
接收数据是在scl从低变高的瞬间吗?
如果改为:
uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=0;
delay();
scl=1;
delay();
k=(k<<1)|sda;

}
return k;
}
对吗??

我的理解是,读数据的时候,是从机控制总线,因此必须提前把sda释放(也就是拉高)。否则从机将不能改变总线。sda为1后,主机控制scl=1,然后,从机根据自己要发送的数据选择将sda置为1或0(即在scl=1时,从机改变sda)。
而在发送数据时,主机控制总线,在scl=0时,sda被主机改变;scl=1时,sda不变,并被从机读取。(scl=0时,主机改变sda)
应答时,相当于读取一位数据,同样是在scl=1时,由从机改变sda。
而起始、结束时,是由 主机 控制sda。在scl为1时,sda的任何改变都将被视为起始、终止信号。
个人理解,如有错误请赐教!
ps 当然也可以理解为 在读取时仍然是在scl=0时,从机改变sda,不过也不影响逻辑,怎样容易怎样理解呗
温馨提示:答案为网友推荐,仅供参考
第1个回答  2023-12-10
数据发送方在SCL从高低变化后,就可以随时改变SDA的值,只要SCL没有被拉高,随便改变SDA的数值。然后SCL从低到高后,接收方就可以读取数据了,只要SCL=1,是否延时读还是立即读都可以的。
可以理解为SCL=0时发送方准备数据,控制SDA,SCL=1时,接收方读取SDA的值,这是IIC协议定义的。
主机在接收(读取)数据时,应该释放SDA总线,即SDA=1;否则数据发送方无法真实改变SDA的值。
第2个回答  推荐于2017-10-10
读取字节前,先释放SDA。SDA=1不是将端口固定位高电平,而是关闭单片机内部下MOG管,让SDA线的电平由信号决定。本回答被网友采纳
第3个回答  2020-05-13
每当由写操作改为读操作,即,从输出 操作改为输入 操作时,都需要先向端口 写“1”,截止场效应管,然后才能正常读取输入的数据。
平时的应用,一个端口,只负责了单一的功能 ,不是输入,就是输出, 在总线应用的时候,一个端口,分时复用,一会输入,一会输出,所以,在变化的时候,要写入 1.
或者,理解为,不写1, 那么收到的第一个字节,在同一根线上,就是相当于线与吧。如果是0,那么第一个字节,就出错了。所以,只能是1.
第4个回答  2012-07-25
当scl=1时,数据稳定才可以读数据。0到1的变化表示一个时钟开始,开始读数据了
相似回答