3. I2C 数据传输模式:标准模式、快速模式、高速模式、超快模式
I2C 总线协议定义了多种数据传输模式,以适应不同外设对速率和功耗的需求。从最初的 100 kbit/s 标准模式发展到如今的 5 Mbit/s 超快模式,每种模式在时钟频率、驱动能力、时序参数和电气特性上都有明确规范。理解这些模式是正确配置 I2C 控制器和调试通信故障的基础。
核心要点: 四种模式向下兼容,但高速模式和超快模式对总线电容、上拉电阻和从设备地址有额外要求。实际开发中,标准模式和快速模式覆盖了 90% 以上的传感器与存储芯片场景。
3.1 四种模式概述与速率对比
下表列出了 I2C 总线规范定义的四种主要数据传输模式及其关键参数:
| 模式名称 | 最大时钟频率 | 最大数据传输率 | 总线电容限制 | 从设备地址位数 | 典型应用 |
|---|---|---|---|---|---|
| 标准模式 (Sm) | 100 kHz | 100 kbit/s | 400 pF | 7 / 10 | 低速传感器、EEPROM |
| 快速模式 (Fm) | 400 kHz | 400 kbit/s | 400 pF | 7 / 10 | 温度传感器、加速度计 |
| 高速模式 (Hs) | 3.4 MHz | 3.4 Mbit/s | 100 pF | 7 / 10 | 图像传感器、高速 ADC |
| 超快模式 (UFm) | 5 MHz | 5 Mbit/s | 100 pF | 7 | 单工传输、LED 驱动器 |
开发提示: 在 Linux 内核中,
i2c_board_info 结构体中的 mode 字段用于指定从设备支持的最高模式。如果主控制器和从设备模式不匹配,内核会自动降级到双方都支持的最高模式。
3.2 标准模式与快速模式详解
标准模式和快速模式是 I2C 最常用的两种工作模式,它们的时序参数几乎相同,仅时钟频率不同。两者都使用开漏输出,通过上拉电阻实现线与逻辑。
3.2.1 时序参数对比
| 参数符号 | 参数描述 | 标准模式 (最小值) | 快速模式 (最小值) | 单位 |
|---|---|---|---|---|
| fSCL | SCL 时钟频率 | 0 | 0 | kHz |
| tHIGH | SCL 高电平时间 | 4.0 | 0.6 | μs |
| tLOW | SCL 低电平时间 | 4.7 | 1.3 | μs |
| tSU;DAT | 数据建立时间 | 250 | 100 | ns |
| tHD;DAT | 数据保持时间 | 0 | 0 | ns |
| tr | SDA / SCL 上升时间 | 1000 | 300 | ns |
| tf | SDA / SCL 下降时间 | 300 | 300 | ns |
常见陷阱: 快速模式下 tHIGH 和 tLOW 时间大幅缩短,如果总线电容过大或上拉电阻选择不当,会导致信号上升沿变缓,造成通信错误。建议快速模式下上拉电阻取 1.5 kΩ ~ 2.2 kΩ(对应 400 pF 总线电容)。
3.3 高速模式 (Hs-mode)
高速模式将时钟频率提升至 3.4 MHz,但引入了全新的传输协议——主从握手序列。在进入高速传输前,主设备必须发送一个特殊的“高速模式主码”(00001XXX),从设备识别后才会切换到高速模式。
3.3.1 高速模式传输流程
- 启动条件: 主设备在标准模式或快速模式下发送 START 条件。
- 主码发送: 主设备发送 8 位主码(00001XXX),其中 XXX 为 3 位保留位。
- 从设备应答: 支持高速模式的从设备在第 9 个 SCL 周期拉低 SDA 作为应答。
- 模式切换: 主设备将 SCL 频率提升至 3.4 MHz,后续所有数据在高速模式下传输。
- 停止条件: 传输结束后,主设备发送 STOP 条件,总线自动回到标准/快速模式。
内核驱动注意: Linux 的
i2c-core 在检测到从设备支持 I2C_FUNC_10BIT_ADDR 且主控制器支持 I2C_FUNC_HIGH_SPEED 时,会自动插入主码序列。驱动开发者无需手动处理主码,但需要确保 i2c_adapter 的 quirks 字段正确配置。
3.4 超快模式 (UFm)
超快模式是 I2C 总线规范中速率最高的模式,达到 5 Mbit/s。但它有一个关键限制:仅支持单工传输(只写),且从设备地址固定为 7 位。UFm 模式主要用于需要高速数据推送的场景,如 LED 驱动阵列或显示面板配置。
| 特性 | UFm 模式 | 与 Hs 模式的区别 |
|---|---|---|
| 传输方向 | 仅主设备写(单工) | Hs 模式支持双向读写 |
| 从设备地址 | 仅 7 位 | Hs 模式支持 7/10 位 |
| 总线电容 | ≤ 100 pF | 与 Hs 模式相同 |
| 输出级 | 推挽输出(非开漏) | 开漏输出 |
| 典型应用 | LED 控制器、单色显示屏 | 高速传感器、ADC |
硬件设计提示: UFm 模式使用推挽输出,因此不需要上拉电阻。但这也意味着总线上只能有一个主设备和一个从设备,无法实现多主多从拓扑。
3.5 四种模式时序参数对比图
下面的 SVG 图展示了四种模式在 SCL 时钟周期、数据建立时间和上升时间上的相对差异,帮助直观理解不同模式对时序的苛刻程度。
3.6 模式选择与驱动开发建议
在 Linux 内核驱动开发中,选择 I2C 传输模式需要综合考虑以下因素:
- 从设备数据手册: 确认从设备支持的最高模式,通常会在电气特性章节明确标注。
- 总线长度与电容: 高速模式要求总线电容 ≤ 100 pF,对应 PCB 走线长度通常不超过 20 cm。
- 主控制器能力: 检查
i2c_adapter的class和quirks字段,确认是否支持高速模式。 - 功耗与 EMI: 高速模式会显著增加功耗和电磁干扰,非必要不盲目追求高频率。
驱动代码示例: 在设备树中指定从设备支持的模式:
/* 设备树节点示例 */
&i2c1 {
status = "okay";
clock-frequency = <400000>; /* 设置总线频率为 400 kHz (快速模式) */
temp_sensor: temperature@48 {
compatible = "ti,tmp102";
reg = <0x48>;
/* 如果从设备支持高速模式,可添加: */
/* i2c-mode = "high-speed"; */
};
};
调试技巧: 使用
i2cget 和 i2cset 工具时,可以通过 -f 参数强制指定频率(单位 Hz),例如 i2cget -y 1 0x48 0x00 -f 400000 用于测试快速模式下的通信稳定性。