4. I2C 总线详解:两线制、地址机制、主从模式与 ACK/NACK

I2C(Inter-Integrated Circuit)总线是嵌入式系统中应用最广泛的板级通信协议之一,由 Philips 公司在 1980 年代开发。它仅需两根信号线即可挂载多个设备,非常适合多串口扩展场景中控制器的配置与状态读取。本节将深入剖析 I2C 的物理层、协议层核心机制。

4.1 两线制物理层:SCL 与 SDA

I2C 总线使用两根双向开漏线:

  • SCL(Serial Clock Line):串行时钟线,由主设备驱动,用于同步数据传输。
  • SDA(Serial Data Line):串行数据线,用于双向传输地址和数据。

两根线均通过上拉电阻连接到 VCC(通常为 3.3V 或 5V)。当总线空闲时,SCL 和 SDA 均为高电平。由于采用开漏结构,多个设备可以“线与”连接,任何设备拉低总线都不会造成短路。

设计要点: 上拉电阻的阻值选择直接影响总线速度和功耗。标准模式(100kHz)常用 4.7kΩ,快速模式(400kHz)常用 2.2kΩ。阻值过大会导致上升沿变缓,限制通信速率;阻值过小则增加功耗。
I2C 总线物理连接拓扑 R R VCC SCL SDA 主设备 (MCU) 从设备 1 (SC16IS752) 从设备 2 (EEPROM) 所有设备 SCL 引脚并联,SDA 引脚并联;总线空闲时均为高电平。 任一设备拉低 SDA 即表示开始传输;主设备控制 SCL 节奏。

4.2 地址机制:7 位与 10 位地址

I2C 总线上的每个从设备都有一个唯一的地址。主设备通过发送地址来选择要通信的从设备。

地址模式 地址位宽 最大设备数 兼容性
7 位地址 7 bit 112(保留 16 个) 所有设备均支持
10 位地址 10 bit 1024 需主从设备均支持

在 7 位地址模式下,地址字节的高 7 位为设备地址,最低位(LSB)为读写标志位:

  • 0:主设备将要写入从设备(写操作)。
  • 1:主设备将要读取从设备(读操作)。
地址冲突案例: 以 SC16IS752 为例,其 I2C 地址由芯片的 A0、A1 引脚电平决定。若两个 SC16IS752 的 A0/A1 配置相同,则地址冲突,总线无法正常工作。设计时需为每个芯片分配唯一的地址组合。

4.3 主从模式与总线仲裁

I2C 总线采用多主从架构,但任一时刻只能有一个主设备控制总线。主设备负责产生时钟信号、发起通信、决定传输方向。从设备被动响应主设备的命令。

主从角色切换: 在多主设备系统中,当多个主设备同时尝试控制总线时,通过总线仲裁机制解决冲突。仲裁基于 SDA 线的“线与”特性:

  1. 多个主设备同时发送数据,谁先拉低 SDA 谁就赢得仲裁。
  2. 失去仲裁的主设备必须释放总线,转为从模式。
I2C 主从通信流程(写操作示例) 主设备发起 START 发送 7 位地址 + W 等待 ACK 发送数据字节 等待 ACK 主设备发起 STOP 每个字节后从设备必须回复 ACK(拉低 SDA)或 NACK(保持高电平)。

4.4 ACK/NACK 机制:可靠传输的基石

I2C 协议要求每个传输的字节后都必须跟随一个应答位(ACK/NACK),由接收方控制。这是 I2C 实现可靠通信的核心机制。

应答类型 SDA 电平(第 9 个时钟) 含义 典型场景
ACK(应答) 低电平 接收成功,可以继续发送下一字节 正常数据传输
NACK(非应答) 高电平 接收失败或传输结束 从设备忙、地址未匹配、读操作结束

ACK/NACK 时序细节:

  1. 发送方在第 1-8 个时钟周期发送 8 位数据。
  2. 发送方在第 9 个时钟周期释放 SDA 线(设为高阻)。
  3. 接收方在第 9 个时钟周期拉低 SDA(ACK)或保持高电平(NACK)。
  4. 主设备检测到 NACK 后,通常发送 STOP 终止通信或重试。
常见调试陷阱: 若 SDA 在第 9 个时钟始终为高电平,可能原因包括:从设备地址错误、从设备未上电、总线被拉死(SCL/SDA 卡在低电平)、上拉电阻缺失。使用逻辑分析仪观察第 9 个时钟的 SDA 电平是快速定位 I2C 问题的首选方法。

4.5 I2C 总线时序与速率标准

I2C 总线定义了多种工作模式,速率差异显著:

模式 最大时钟频率 最大传输速率 典型应用
标准模式(Sm) 100 kHz 100 kbit/s 低速传感器、EEPROM
快速模式(Fm) 400 kHz 400 kbit/s 多串口扩展芯片、音频编解码
快速模式+(Fm+) 1 MHz 1 Mbit/s 高带宽外设、显示驱动
高速模式(Hs) 3.4 MHz 3.4 Mbit/s 视频、高速数据采集

对于 SPI 转 UART 芯片(如 SC16IS752),I2C 接口通常支持快速模式(400kHz),足以满足 115200bps 甚至更高波特率的 UART 数据搬运需求。

I2C 单字节写时序(含 ACK) SCL SDA 地址 + 写标志 (8 bit) ACK 数据 ACK 第 9 个时钟周期:从设备拉低 SDA 表示 ACK,保持高电平表示 NACK

4.6 I2C 与 SPI 对比:选型依据

在串口扩展方案中,I2C 和 SPI 各有优劣。下表帮助你在设计时做出选择:

对比维度 I2C SPI
信号线数量 2 根(SCL + SDA) 4 根(SCLK + MOSI + MISO + CS)
设备寻址 软件地址(7/10 bit) 硬件片选(CS 引脚)
传输速率 最高 3.4 Mbps(Hs 模式) 最高数十 Mbps
从设备数量 理论 112 个(7 位地址) 受限于 MCU 引脚数
硬件复杂度 低(开漏 + 上拉电阻) 中(推挽输出)
典型场景 配置管理、低速数据流 高速数据流、实时性要求高
课程选型建议: 当 MCU 引脚资源紧张且需要挂载多个串口扩展芯片时,优先选择 I2C 接口的 UART 扩展芯片(如 SC16IS752 的 I2C 模式)。若对 UART 数据吞吐量要求极高(如每个端口 921600bps 以上),则 SPI 接口更合适。