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 高速模式传输流程

  1. 启动条件: 主设备在标准模式或快速模式下发送 START 条件。
  2. 主码发送: 主设备发送 8 位主码(00001XXX),其中 XXX 为 3 位保留位。
  3. 从设备应答: 支持高速模式的从设备在第 9 个 SCL 周期拉低 SDA 作为应答。
  4. 模式切换: 主设备将 SCL 频率提升至 3.4 MHz,后续所有数据在高速模式下传输。
  5. 停止条件: 传输结束后,主设备发送 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 时钟周期、数据建立时间和上升时间上的相对差异,帮助直观理解不同模式对时序的苛刻程度。

I2C 四种模式时序参数对比 I2C 四种模式时序参数对比 标准模式 (Sm) 快速模式 (Fm) 高速模式 (Hs) 超快模式 (UFm) SCL 周期 (μs) t_HIGH (μs) t_SU;DAT (ns) t_r (ns) 10.0 2.5 0.29 0.20 4.0 0.6 0.16 0.10 250 100 10 10 1000 300 40 40 参数解读 • SCL 周期 = 1 / f_SCL • t_HIGH 决定占空比 • t_r 影响总线最大长度

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 用于测试快速模式下的通信稳定性。