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Ω。阻值过大会导致上升沿变缓,限制通信速率;阻值过小则增加功耗。
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 线的“线与”特性:
- 多个主设备同时发送数据,谁先拉低 SDA 谁就赢得仲裁。
- 失去仲裁的主设备必须释放总线,转为从模式。
4.4 ACK/NACK 机制:可靠传输的基石
I2C 协议要求每个传输的字节后都必须跟随一个应答位(ACK/NACK),由接收方控制。这是 I2C 实现可靠通信的核心机制。
| 应答类型 | SDA 电平(第 9 个时钟) | 含义 | 典型场景 |
|---|---|---|---|
| ACK(应答) | 低电平 | 接收成功,可以继续发送下一字节 | 正常数据传输 |
| NACK(非应答) | 高电平 | 接收失败或传输结束 | 从设备忙、地址未匹配、读操作结束 |
ACK/NACK 时序细节:
- 发送方在第 1-8 个时钟周期发送 8 位数据。
- 发送方在第 9 个时钟周期释放 SDA 线(设为高阻)。
- 接收方在第 9 个时钟周期拉低 SDA(ACK)或保持高电平(NACK)。
- 主设备检测到 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 数据搬运需求。
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 接口更合适。