标题: 关于IIC通信格式的问题 [打印本页]

作者: zhangzhao2423    时间: 2021-10-27 14:39
标题: 关于IIC通信格式的问题


如图,iic通信有起始位,终止位,写字节,读字节,还有写应答和读应答
在读字节里,一开始把数据线和时钟线同时拉低,读出的字节全部是00,而把数据线拉高,时钟线拉低读出的数据正常
或者只把时钟线拉低,数据线不管也是可以正常读取字节的,请问为什么不能把数据线拉低。


作者: 笨笨兔    时间: 2021-10-27 15:29
你还是好好读一读I2C协议吧.
作者: zhangzhao2423    时间: 2021-10-27 15:50
笨笨兔 发表于 2021-10-27 15:29
你还是好好读一读I2C协议吧.

讲啊,没看协议我就不再上面问了。有时候你就是看十遍也不一定能想得通,但是经别人一点拨,就云开雾散了。言归正传。。。
在发送字节时,数据线和时钟线我都拉低,然后字节的最高位与0X80按位与运算,给数据线,时钟线拉高延时,时钟线拉低,循环八次。没问题
在读字节时,为什么数据线不能拉高?比如我先发送字节(地址字节寻找从机),从机发送应答后数据线拉高,问题来了,我在读字节里先给数据线拉低会是什么结果?请高手指点一下
作者: 188610329    时间: 2021-10-27 16:39
zhangzhao2423 发表于 2021-10-27 15:50
讲啊,没看协议我就不再上面问了。有时候你就是看十遍也不一定能想得通,但是经别人一点拨,就云开雾散了 ...

你在理解上, 有一个误区,  那就是:   I2C 通信,不存在终止位,和起始位。

不同于 Uart 传输,有起始位,和终止位,因为他们是占位的,因此我们Uart传输一个字节的数据,需要10个bit传输,就是 起始位 + 8位数据 + 终止位。

但是,I2C 没有 起始位,终止位,只存在 起始信号 和 终止信号 他们是不占位的。 换句话说,他们可以在任何时候发出。
只要  时钟线(CLK) 在高电平, 这个时候数据线 从0=>1 就是终止信号, 数据线 从1=>0 就是起始信号,数据线 从1=>0=>1 就是再启动信号(说白了,就是停了在开)。
因此,在I2C传输时,数据线是只能在 时钟线(CLK)低电平时发生变化,不然,就是在发送 起始/终止信号,那么后续,你以为的“数据传输”,一定是不会正常发生的。
作者: 188610329    时间: 2021-10-27 16:48
然后现在来回答,你的应答问题,
数据线时钟线“ 同时拉低” 是不可以的,因为理论上是不存在“同时”的必定有先后,正常操作,除了发送 开始/终止 信号, 都是必须先 拉低 时钟线, 然后拉高/拉低数据线。
然后,接受应答信号时,其实就是返回 ACK/NAK  也就是说,会返回 0/1 , 我们知道电平只能被拉低不能被拉高,所以你必须先把数据线置1,然后发送时钟后,客户机才能返回 0/1,拉低/拉高数据线,让你知道返回的是 ACK/NAK , 当然如果你不判断是ACK/NAK 也没有关系。这个位忽略,不读结果就可以了。
作者: Y_G_G    时间: 2021-10-27 17:00
这IIC其实是很简单的,把IIC协议秒一遍基本就能明白一个大概了
1,IIC没有起始位和停止位,那叫起始信号,的停止信号,协议中有说明,这个信号由主机发送
2,应答信号,每次发送或者接收完一个字节的数据,后面要跟上一个一天天信号
发送数据的时候,应答信号由从机给出,用来告诉主机,已经接收完数据了,下一步要干嘛,这是接收到缓存而已,并没有写入IIC器件
读取数据的时候,应答信号由主机给出,用来告诉已经读取完数据了,下一步要干嘛
作者: wwh2382    时间: 2021-10-27 17:41
昨天有人发的“I2C总线读写应答机制详解”,你不妨看看:
http://www.51hei.com/bbs/dpj-213612-1.html
作者: yzwzfyz    时间: 2021-10-28 09:41
A和B之间在一根线D上通讯。如果A出1,B出0,D上是1是0呢。
明白这个道理之后就知道【为什么不能把数据线拉低。】了。
作者: zhangzhao2423    时间: 2021-10-28 10:07
188610329 发表于 2021-10-27 16:48
然后现在来回答,你的应答问题,
数据线时钟线“ 同时拉低” 是不可以的,因为理论上是不存在“同时”的 ...

电平只能被拉低不能被拉高,那为什么还要置1呢
不是说不能拉高吗
作者: zhangzhao2423    时间: 2021-10-28 10:10
yzwzfyz 发表于 2021-10-28 09:41
A和B之间在一根线D上通讯。如果A出1,B出0,D上是1是0呢。
明白这个道理之后就知道【为什么不能把数据线拉 ...

我软件置0,它硬件置1,数据线电平信号不会改变为1 吗?
作者: Y_G_G    时间: 2021-10-28 10:36
zhangzhao2423 发表于 2021-10-28 10:10
我软件置0,它硬件置1,数据线电平信号不会改变为1 吗?

数据线置1只是8051的操作
SDA=1;可以让8051内部读取到这个端口的电平状态,可以理解为释放这个端口
而不是说让这个端口输出高电平
而别的单片机就不一定是这样的了
所谓硬件置1......
24Cxx的数据输出是OD输出,它只能输出低电平,也就是说它只能吸入电流,没法输出电流,这就是为什么要上拉电阻的原因
所以,软件输出0,端口就是0
作者: 188610329    时间: 2021-10-28 13:05
zhangzhao2423 发表于 2021-10-28 10:07
电平只能被拉低不能被拉高,那为什么还要置1呢
不是说不能拉高吗

你置了1 才能被拉低.

你置了0 永远拉不高,

你不信邪可以做实验, 置0以后, 用5V接限流电阻到IO, 看看能不能读出个1 来?
作者: yaosongjin    时间: 2021-10-28 14:03
信号输入脚配置成了输入模式,再设置输出应该是没用的啊
作者: 冰火风轮    时间: 2021-10-28 15:51
把 拉高 拉低的说法换成释放和占用就好理解些吧
作者: yzwzfyz    时间: 2021-10-29 09:57
本帖最后由 yzwzfyz 于 2021-10-30 11:19 编辑

楼主需要补一下硬件知识。硬件上0、1是如何表达的,重点是输出端的电路形式,注意0、1输出各是多少伏电压。
当两个输出端口接在一起时呢?




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