跳转至

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 对比背景).