关于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;
}
对吗??
展开
 我来答
哈哈我是贾马尔
2019-03-31
知道答主
回答量:34
采纳率:100%
帮助的人:4.5万
展开全部
我的理解是,读数据的时候,是从机控制总线,因此必须提前把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,不过也不影响逻辑,怎样容易怎样理解呗
czm0605010127
2023-12-10 · TA获得超过1164个赞
知道小有建树答主
回答量:637
采纳率:96%
帮助的人:37.8万
展开全部
数据发送方在SCL从高低变化后,就可以随时改变SDA的值,只要SCL没有被拉高,随便改变SDA的数值。然后SCL从低到高后,接收方就可以读取数据了,只要SCL=1,是否延时读还是立即读都可以的。
可以理解为SCL=0时发送方准备数据,控制SDA,SCL=1时,接收方读取SDA的值,这是IIC协议定义的。
主机在接收(读取)数据时,应该释放SDA总线,即SDA=1;否则数据发送方无法真实改变SDA的值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
API双鱼
推荐于2017-10-10 · TA获得超过106个赞
知道答主
回答量:17
采纳率:0%
帮助的人:8715
展开全部
读取字节前,先释放SDA。SDA=1不是将端口固定位高电平,而是关闭单片机内部下MOG管,让SDA线的电平由信号决定。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
菜鸟想上王者
2020-05-13
知道答主
回答量:3
采纳率:0%
帮助的人:1394
展开全部
每当由写操作改为读操作,即,从输出 操作改为输入 操作时,都需要先向端口 写“1”,截止场效应管,然后才能正常读取输入的数据。
平时的应用,一个端口,只负责了单一的功能 ,不是输入,就是输出, 在总线应用的时候,一个端口,分时复用,一会输入,一会输出,所以,在变化的时候,要写入 1.
或者,理解为,不写1, 那么收到的第一个字节,在同一根线上,就是相当于线与吧。如果是0,那么第一个字节,就出错了。所以,只能是1.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小卜不坏
2012-07-25
知道答主
回答量:3
采纳率:0%
帮助的人:2.8万
展开全部
当scl=1时,数据稳定才可以读数据。0到1的变化表示一个时钟开始,开始读数据了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式