2026.10.10 I2C通信协议复习
part1:I2C定义理解
采取的是双线同步半双工 的方式,即主机与从机之间由两根通信线连接,同一时刻总线上只能有一个主机 控制 SCL 发起传输,但数据方向可以是主机→从机(写),也可以是从机→主机(读),故为半双工模式,这两根通信线分别是时钟线SCL和数据线SDA,SDA上的变化遵从SCL的变化,故为同步模式
补充:I2C并不只是一主一从总线,也可以是多主多从总线,下述均以一主一从为例说明
part2:I2C通信的电路理解
- I2C通信的两根通信线上,都必须外接上拉电阻 ,也就是要配置成开漏输出模式,使得在没有通信状态下自动被上拉电阻拉高至vcc(即高电平1),我们以SDA为例,完整电路自vcc开始应该是vcc连接上拉电阻,再接SDA,经nmos管(这里是设备内部的)后接到GND ,由于这个电阻是弱上拉电阻,当nmos管被导通后,SDA上的电平会由于GND的作用被强下拉到低电平0,细究电路原理,是因为nmos管导通后会有一个极小的电阻,由分压公式可以推出这个电阻的分压约为0.035V,跟0V十分接近,故相当于低电平逻辑0连接SDA,而上拉电阻等阻值的计算需要根据器件和通信速率等来决定
- "线与":总线上,任意一个设备输出低电平,整条线都会输出低电平,反之,只有当所有设备输出的都不是低电平时,整条线才是高电平,可以用上面的电路逻辑推出
part3:I2C通信的基本构成部分和数据帧
①六个构成部分
注:SCL完全由主机控制,SDA只有在主机释放后从机才获得控制权
1. START(起始条件)
- SCL 高时,SDA 由高变低。
- 主机发起,占用总线。
2. STOP(停止条件)
- SCL 高时,SDA 由低变高。
- 主机发起,释放总线
3. 发送一个字节
- 发送方把 8 位数据放到 SDA 上。
- SCL 低时改变 SDA(由主机决定输入的值来决定),SCL 高时保持稳定,此时从机读取数据。
- MSB(最高有效位) 先发。
4. 接收一个字节
- 主机释放SDA总线
- SCL 低时改变 SDA(由从机决定输入的值来决定),主机在每个 SCL 高电平期间采样 SDA。
- 收满 8 位组成一个字节。
- 也是 MSB 先收。
5. 发送应答(ACK/NACK)
- 接收方在第 9 个时钟发出。
- 拉低 SDA = ACK ,释放 SDA = NACK。
6. 接收应答(ACK/NACK)
- 发送方在第 9 个时钟读 SDA。
- 读到低 = 对方 ACK;读到高 = 对方 NACK。
②数据帧的组成
1.写操作
scss
START → 发送字节(从机地址+W) → 接收应答 → 发送字节(数据) → 接收应答 → STOP
2.读操作
scss
START → 发送字节(从机地址+W) → 接收应答 → 发送字节(寄存器地址) → 接收应答
① ③ ⑥ ③ ⑥
→ Repeated START → 发送字节(从机地址+R) → 接收应答
① ③ ⑥
→ 接收字节(数据) → 发送应答(NACK) → STOP
④ ⑤ ②
注:连续读和连续写时,每次对寄存器地址发送或读取数据后,寄存器地址都会自增
4.剩余未解决问题
-
发送方/接收方 vs 主机/从机
- 主机不一定是发送方,从机不一定是接收方。
- 读操作时,从机是发送方,主机是接收方。
-
时钟拉伸(Clock Stretching)
- 从机拉低 SCL 强制主机等待。
- 这是 SCL 开漏结构的重要作用。
-
多主机仲裁
- 两个主机同时发,靠线与逐位仲裁。
- 输的一方退出,赢的一方继续。