I2C总线协议深度解析:地址/时序/仲裁¶
难度:🟢 入门 | 领域:嵌入式通信协议 | 关键词:I2C, SCL/SDA, 仲裁 | 阅读时间:约 16 分钟
日常类比¶
教室里老师(串行时钟线 Serial Clock Line, SCL)打拍子,学生(串行数据线 Serial Data Line, SDA)轮流发言;两人抢答时,谁先“说 0”谁继续——这就是开漏线与仲裁。I2C(Inter-Integrated Circuit)用两根线完成寻址、应答与多主共存[1]。
摘要¶
覆盖开漏与上拉、7/10 位地址、START/STOP/重复启动、时钟拉伸、速度模式与总线恢复。速率与电阻取值为规范与应用笔记常见量级,长线与大电容场景须实测上升沿[1][3]。
1. 物理层:开漏与上拉¶
| 信号 | 方向 | 作用 |
|---|---|---|
| SDA | 双向 | 地址/数据/ACK |
| SCL | 双向 | 主机时钟;从机可拉低拉伸 |
开漏只能拉低,高电平靠上拉:多设备安全线与、支持多主、便于不同电源域弱匹配。Rp 过小耗电,过大则上升沿变慢。
| 条件(示意) | Rp 常见起点 |
|---|---|
| 3.3 V,总线电容较小,约 100 kHz | 约 4.7 kΩ |
| 3.3 V,电容偏大或约 400 kHz | 约 1–2.2 kΩ |
精确上下限见 NXP 规范与 TI 上拉计算笔记,勿把表中阻值当唯一解[1][3]。
2. 地址与帧¶
7 位地址后跟 R/W;可用地址约百余个,保留区不可随意占用。10 位地址用 11110 前缀分两字节发送,可与 7 位设备混挂[1]。
| 地址区(7 位) | 用途 |
|---|---|
| 0x00 | 通用呼叫等 |
| 0x08–0x77 | 常用从机地址区 |
| 0x78–0x7F | 10 位相关/保留 |
冲突处理:ADDR 引脚、TCA9548A 类多路复用、或器件软件改址(器件相关)[4]。
写:[S][addr+W][ACK][data…][P];读寄存器常用重复启动(Repeated Start)保证原子性。读事务末字节主机发 NACK 再 STOP[1]。
3. 时序、速度与仲裁¶
| 模式 | 标称上限量级 | 典型用途 |
|---|---|---|
| Standard | 100 kHz | 传感器/EEPROM |
| Fast | 400 kHz | 常见现代传感器 |
| Fm+ / HS | 约 1–3.4 MHz | 更高吞吐,布线更严 |
从机可拉低 SCL 做时钟拉伸(Clock Stretching);部分 USB–I2C 桥不支持。多主机仲裁:发 1 读回 0 则退出,地址较低者常更易胜出[1]。
| 参数关注点 | 说明 |
|---|---|
| tHD;STA / tSU;STA | START 相关建立保持 |
| tSU;DAT | 数据建立 |
| tBUF | STOP 到下一 START 空闲 |
4. 实践与故障¶
STM32 HAL 的 DevAddress 常为 7 位左移 1 位格式,勿直接塞手册 7 位值。大数据量用 DMA。总线锁死(从机卡住 SDA)可用约 9 个 SCL 脉冲再 STOP 恢复,再重新初始化控制器[2]。
| NACK 阶段 | 常见原因 |
|---|---|
| 地址 | 地址错、未上电、仍在复位 |
| 数据 | 写只读寄存器、超页边界 |
5. 局限、挑战与可改进方向¶
1. 电容与距离限制吞吐¶
局限:开漏上升沿受 RC 限制,长线/多设备难稳定跑高速模式。 改进:缩短走线、降 Rp、降速;板间改 SPI/差分总线[1][3]。
2. 地址空间与同型号冲突¶
局限:同型号传感器可选地址很少,7 位“理论容量”用不满。 改进:复用器分总线、选可改址器件,或评估 I3C 动态地址[4][6]。
3. 锁死与异常复位¶
局限:主机复位时从机可能占住 SDA,整总线挂死。 改进:上电与看门狗路径加入总线恢复例程;量产必测[2]。
4. 上拉静态功耗¶
局限:电池节点上空闲上拉电流不可忽略。 改进:增大 Rp(在上升沿允许范围内)、GPIO 控制上拉、或改 SPI[3][5]。
总结¶
I2C 以开漏两线换取多从与多主能力;掌握上拉、地址、重复启动、拉伸与恢复,比死记峰值速率更重要。首版务必用逻辑分析仪核对 ACK 与边沿。
参考文献¶
[1] NXP, I2C-bus specification and user manual (UM10204), Rev. 7.x.
[2] STMicroelectronics, STM32 HAL I2C 驱动用户手册(如 UM1725 等现行版).
[3] Texas Instruments, I2C Bus Pullup Resistor Calculation (SLVA689).
[4] Texas Instruments, TCA9548A 数据手册.
[5] NXP / 各厂商, I2C 低功耗与上拉设计应用笔记.
[6] MIPI Alliance, I3C 规范(下一代传感器总线背景).
[7] Philips/NXP 历史文献与 I2C 演进说明.
[8] 逻辑分析仪 I2C 解码实践(厂商应用笔记).
[9] W. Wolf, Computers as Components(嵌入式外设章节).
[10] Linux i2c-tools / i2cdetect 用户空间调试说明.
[11] USB–I2C 桥接芯片对 clock stretching 支持说明(选型注意).
[12] IEEE 嵌入式总线综述(I2C/SPI 对比背景).