I2C通信

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.剩余未解决问题

  1. 发送方/接收方 vs 主机/从机

    • 主机不一定是发送方,从机不一定是接收方。
    • 读操作时,从机是发送方,主机是接收方。
  2. 时钟拉伸(Clock Stretching)

    • 从机拉低 SCL 强制主机等待。
    • 这是 SCL 开漏结构的重要作用。
  3. 多主机仲裁

    • 两个主机同时发,靠线与逐位仲裁。
    • 输的一方退出,赢的一方继续。
相关推荐
qq_456168281 天前
通信协议学习笔记汇总
嵌入式·开源协议
番茄灭世神1 天前
PN学堂GD32教程第12篇——SPI与Nor Flash
c语言·stm32·单片机·嵌入式·gd32·总线协议
潘潘的嵌入式日记2 天前
大彩串口屏型号怎么看?DC80480M070 命名拆解与选型
嵌入式·硬件·串口屏·选型·大彩·型号命名
蓝天居士2 天前
PY32F系列MCU在OTA时App区概率性跑不起来的根因分析(5)
mcu·嵌入式
Zwawa2 天前
传感器模块都在交出什么:从模拟电压到数字协议
c语言·单片机·嵌入式
会周易的程序员2 天前
STVM OSAL 层架构设计文档
c++·物联网·嵌入式·虚拟机·iot·软plc·iec61131
蓝天居士2 天前
PY32F系列MCU在OTA时App区概率性跑不起来的根因分析(6)
mcu·嵌入式
Jason_zhao_MR2 天前
电力数据采集核心板选型指南
linux·嵌入式硬件·fpga开发·嵌入式
G.E.M.小白3 天前
【Linux嵌入式蜂鸣器驱动开发】原理图分析、寄存器寻址、完整驱动+应用+Makefile
嵌入式·imx6ull·linux驱动开发·蜂鸣器驱动