I2C总线协议

IIC总线协议

1.0 IIC总线结构

  1. 数据线SDA:传输数据
    时钟线SCL:同步时钟

  2. 总线每个上每个器件地址唯一

  3. 总线上数据的传输速率(比特率)
    在标准模式 (Sm ) 下可达 100 kbit/s
    在快速模式 (Fm ) 下可达 400 kbit/s
    在快速增强模式 (Fm+) 下可达 1 Mbit/s
    在高速模式 (HSm) 下可达 3.4 Mbit/s

  4. IIC总线传输时高位先行(MSB First)
    下图源自 AT24C02 Datasheet

  5. 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. 地址错误
  2. 从机为忙状态
  3. 从机故障

1.4 数据传输

I2C以字节为单位传输数据


每个字节传输后,接收方需发送 ACK(低电平)或NAK(高电平) 信号。

1.5 停止位

在SCL高电平时,向SDA发送上升沿

与起始位对比:都是在SCL为高电平时操作SDA,但是起始位为拉低(下降沿),停止位是拉高(上升沿)

1.6 示例

1.7 I2C总线死锁

  1. 在主机与从机通信器件,主机异常复位导致的死锁 环境:软件模拟I2C协议,SDA使用开漏输出

解决方法:总线访问忙检测超过设置时间进行总线恢复操作 总线恢复操作:手动输出SCL脉冲,使得从设备结束通信释放总线 1. 发送至少 9 个 SCL 脉冲(对应 I2C 规范中的 “时钟延展” 恢复流程)。 2. 发送一个 STOP 条件(SDA 从低→高,SCL 保持高)。
2. 死锁原因:
其一:
主机: I2C主机检测SDA信号为, 认为总线处于忙状态等待总线释放
从机: I2C从机等待SCL信号从高至低,释放应答信号
总结: 主机等待从机释放SDA, 从机等待主机释放SCL, 互相等待造成死锁

(13)I2C死锁解决方式二选一_哔哩哔哩_bilibili

以上图片源自B站UP主-铁头山羊

posted @ 2025-03-23 16:26  林接接  阅读(95)  评论(0)    收藏  举报