概念
通信过程
- 这个传送方向是0主机到从机还是1从机到主机,加上地址刚好8位
- 首个字节一定是主机到从机,后续发送器【此时不一定是主机】和接收器取决于传输方向(1则是从机发送到主机)
- 可以连续发送
- 发送过程中不允许修改方向
- 主机发送停止信号
信号
- 起始信号
- 发送信号
- 应答信号
- 停止信号
- 空闲状态SDA和SCL【用于什么时候发送,什么时候接收】都是1
- 起始和停止主机发出
通信问题
1.时钟需要相同【SCL线】,不然不知道什么时候开始
2.如何识别111000还是10这样的数据
发送开始,SCL【用于什么时候发送,什么时候接收】拉低期间,SDA才可以发送数据(修改01),然后SCL高电平期间,从机读取数据(注意,读取的是低电平期间的数据)
3.如果我要收发(不单向,会怎么样)
- 只能分两次
- 但是总线可能会被抢走怎么办(不要释放总线,直接开一个新的发就行)
仲裁,谁抢到了主机
1.IIC设置开漏输出,只能输出高电平
2.线与逻辑,设备拉低为0,则整个SDA为0
如果多个设备同时尝试发送起始信号,它们会进入仲裁阶段。
I²C 总线协议要求设备在发送数据时同时监控 SDA 的实际电平。如果设备发送的电平与 SDA 总线的实际电平不一致(例如,设备发送高电平但总线是低电平),该设备就退出仲裁。
假设有两个设备 A 和 B,同时尝试发送数据:
- 设备 A 和设备 B都同时发送数据位。
- 如果设备 A发送的是逻辑 1(高电平),而设备 B发送的是逻辑 0(低电平),由于线与逻辑的特性,总线上的 SDA 会变为逻辑 0。
- 设备 A监控总线发现 SDA 电平与自己发送的不一致(A想发送高电平,但总线是低电平),于是设备 A退出仲裁。
- 设备 B继续传输,抢到了主机权。
仲裁的结果:
- 仲裁的优先级由设备发送的地址或数据决定。发送低电平(逻辑 0)的设备优先级更高,因为它可以拉低 SDA 总线。