关于iic总线。看过很多资料,很多都相互矛盾。在主机读取数据之前,是否需要拉高sda=1??问题很长,看补充
有一本书中:scl从高变低,主机接受数据??scl从低变高,主机发送数据??还有文献并没有如此规定。答案究竟如何??在主机接受数据时,sda和scl究竟如何变化?这是郭天...
有一本书中: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和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,不过也不影响逻辑,怎样容易怎样理解呗
而在发送数据时,主机控制总线,在scl=0时,sda被主机改变;scl=1时,sda不变,并被从机读取。(scl=0时,主机改变sda)
应答时,相当于读取一位数据,同样是在scl=1时,由从机改变sda。
而起始、结束时,是由 主机 控制sda。在scl为1时,sda的任何改变都将被视为起始、终止信号。
个人理解,如有错误请赐教!
ps 当然也可以理解为 在读取时仍然是在scl=0时,从机改变sda,不过也不影响逻辑,怎样容易怎样理解呗
展开全部
数据发送方在SCL从高低变化后,就可以随时改变SDA的值,只要SCL没有被拉高,随便改变SDA的数值。然后SCL从低到高后,接收方就可以读取数据了,只要SCL=1,是否延时读还是立即读都可以的。
可以理解为SCL=0时发送方准备数据,控制SDA,SCL=1时,接收方读取SDA的值,这是IIC协议定义的。
主机在接收(读取)数据时,应该释放SDA总线,即SDA=1;否则数据发送方无法真实改变SDA的值。
可以理解为SCL=0时发送方准备数据,控制SDA,SCL=1时,接收方读取SDA的值,这是IIC协议定义的。
主机在接收(读取)数据时,应该释放SDA总线,即SDA=1;否则数据发送方无法真实改变SDA的值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
读取字节前,先释放SDA。SDA=1不是将端口固定位高电平,而是关闭单片机内部下MOG管,让SDA线的电平由信号决定。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
每当由写操作改为读操作,即,从输出 操作改为输入 操作时,都需要先向端口 写“1”,截止场效应管,然后才能正常读取输入的数据。
平时的应用,一个端口,只负责了单一的功能 ,不是输入,就是输出, 在总线应用的时候,一个端口,分时复用,一会输入,一会输出,所以,在变化的时候,要写入 1.
或者,理解为,不写1, 那么收到的第一个字节,在同一根线上,就是相当于线与吧。如果是0,那么第一个字节,就出错了。所以,只能是1.
平时的应用,一个端口,只负责了单一的功能 ,不是输入,就是输出, 在总线应用的时候,一个端口,分时复用,一会输入,一会输出,所以,在变化的时候,要写入 1.
或者,理解为,不写1, 那么收到的第一个字节,在同一根线上,就是相当于线与吧。如果是0,那么第一个字节,就出错了。所以,只能是1.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当scl=1时,数据稳定才可以读数据。0到1的变化表示一个时钟开始,开始读数据了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询