IIC总线协议
1.0 IIC总线结构
- 数据线SDA:传输数据
时钟线SCL:同步时钟
- 总线每个上每个器件地址唯一
- 总线上数据的传输速率(比特率)
在标准模式 (Sm ) 下可达 100 kbit/s
在快速模式 (Fm ) 下可达 400 kbit/s
在快速增强模式 (Fm+) 下可达 1 Mbit/s
在高速模式 (HSm) 下可达 3.4 Mbit/s
- IIC总线传输时高位先行(MSB First)
下图源自 AT24C02 Datasheet
- SDA线为了实现总线的线与特性需要设置为开漏+上拉结构,由外部上拉电阻决定,上拉电阻越大,信号上升时间越长,总线最大速率越低,抗干扰能力越弱,反之。(一般取4.7k,10k,100k) 同时上拉电阻过小,会导致低电平实际电压过高,影响数据传输
I2C总线上的电阻 - 功能与阻值范围的确定_哔哩哔哩_bilibili
1.1 逻辑线与
1.2 起始位
在SCL高电平时,向SDA发送下降沿
1.3 寻址
发送从机地址(7位 or 10位)
(7位地址)
R/W#位:填写数据传输的方向
R/W# = 0, 写
R/W# = 1, 读
0 - Ack - Acknowledge
1 - NAK - Not Acknowledge
为什么NAK要设置为1生效?
因为当iic总线空闲时, SDA线会被上拉电阻拉至高电平, 所以当NAK(无回复)时, NAK = 1;
寻址阶段出现NAK的原因:
1.4 数据传输
I2C以字节为单位传输数据
每个字节传输后,接收方需发送 ACK(低电平)或NAK(高电平) 信号。
1.5 停止位
在SCL高电平时,向SDA发送上升沿
与起始位对比:都是在SCL为高电平时操作SDA,但是起始位为拉低(下降沿),停止位是拉高(上升沿)
1.6 示例
1.7 I2C总线死锁
- 在主机与从机通信器件,主机异常复位导致的死锁 环境:软件模拟I2C协议,SDA使用开漏输出
解决方法:总线访问忙检测超过设置时间进行总线恢复操作 总线恢复操作:手动输出SCL脉冲,使得从设备结束通信释放总线 1. 发送至少 9 个 SCL 脉冲(对应 I2C 规范中的 “时钟延展” 恢复流程)。 2. 发送一个 STOP 条件(SDA 从低→高,SCL 保持高)。
2. 死锁原因:
其一:
主机: I2C主机检测SDA信号为低, 认为总线处于忙状态等待总线释放
从机: I2C从机等待SCL信号从高至低,释放应答信号
总结: 主机等待从机释放SDA, 从机等待主机释放SCL, 互相等待造成死锁
(13)I2C死锁解决方式二选一_哔哩哔哩_bilibili
以上图片源自B站UP主-铁头山羊
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |