4. I2C 传输模式:标准、快速、高速与超快

I2C 总线协议定义了多种传输速率模式,以适应从低速传感器到高速存储器、显示接口等不同外设的需求。每种模式在时序参数、驱动能力、总线电容限制以及从设备地址数量上均有严格规范。本章详细解析标准模式(100 kHz)、快速模式(400 kHz)、高速模式(3.4 MHz)和超快模式(5 MHz)的物理层差异、寄存器配置要点及通信波形特征。

4.1 四种传输模式核心参数对比

下表列出了 I2C 总线四种主要传输模式的关键电气与协议参数。理解这些参数是进行寄存器配置和时序计算的基础。

参数 标准模式 (Sm) 快速模式 (Fm) 高速模式 (Hs-mode) 超快模式 (UFm)
最大时钟频率 100 kHz 400 kHz 3.4 MHz 5 MHz
总线最大电容 400 pF 400 pF 100 pF 100 pF
SCL 低电平时间 (tLOW) 4.7 μs 1.3 μs 160 ns 100 ns
SCL 高电平时间 (tHIGH) 4.0 μs 0.6 μs 60 ns 50 ns
上升时间 (tr) 1000 ns 300 ns 80 ns 50 ns
下降时间 (tf) 300 ns 300 ns 80 ns 50 ns
输入阈值 (VIL/VIH) 0.3VDD/0.7VDD 0.3VDD/0.7VDD 0.3VDD/0.7VDD 0.3VDD/0.7VDD
从设备地址位数 7 / 10 bit 7 / 10 bit 7 / 10 bit 8 bit (仅发送)
通信方向 双向 双向 双向 单向 (主机→从机)
典型应用 温度传感器、EEPROM 加速度计、音频编解码器 图像传感器、高速 ADC LED 驱动器、GPIO 扩展
设计提示: 在 ARM 平台进行 I2C 控制器寄存器配置时,时钟分频系数通常由 SCL_HIGH 和 SCL_LOW 计数值决定。例如,在标准模式下,若系统时钟为 50 MHz,则需设置分频系数使 SCL 周期为 10 μs(100 kHz)。务必根据总线电容和上拉电阻调整上升/下降时间,避免信号畸变。

4.2 标准模式与快速模式:基础与演进

标准模式(Standard-mode, Sm)是 I2C 总线最原始的传输规范,时钟频率上限为 100 kHz。快速模式(Fast-mode, Fm)将频率提升至 400 kHz,同时保持了与标准模式在电气特性上的向后兼容性。两者均采用开漏输出结构,通过外部上拉电阻实现线与逻辑。

4.2.1 时序波形对比

下图展示了标准模式与快速模式在 SCL 时钟周期、数据建立时间(tSU;DAT)和数据保持时间(tHD;DAT)上的差异。快速模式要求更短的建立时间(100 ns vs. 250 ns)和更严格的保持窗口。

标准模式与快速模式时序对比 标准模式 (100 kHz) t_HIGH=4.0μs t_LOW=4.7μs t_HIGH=4.0μs t_LOW=4.7μs 快速模式 (400 kHz) t_H=0.6μs t_L=1.3μs t_H=0.6μs t_L=1.3μs 关键差异: • 快速模式 t_HIGH 从 4.0μs 缩短至 0.6μs,t_LOW 从 4.7μs 缩短至 1.3μs。 • 快速模式下 SDA 数据必须在 SCL 下降沿后 100ns 内稳定(t_SU;DAT),标准模式为 250ns。 • 快速模式要求总线电容 ≤ 400pF,且上拉电阻需相应减小以维持上升时间。

4.2.2 寄存器配置示例(标准/快速模式)

在 ARM 平台的 I2C 控制器(如 Synopsys DesignWare I2C)中,时钟频率通过 IC_SS_SCL_HCNT 和 IC_SS_SCL_LCNT(标准模式)或 IC_FS_SCL_HCNT 和 IC_FS_SCL_LCNT(快速模式)寄存器设置。以下代码展示了基于 50 MHz 系统时钟的配置方法:

/* 标准模式:目标频率 100 kHz,周期 10 μs */
/* t_HIGH = 4.0 μs → 计数值 = 4.0 μs × 50 MHz = 200 */
/* t_LOW  = 4.7 μs → 计数值 = 4.7 μs × 50 MHz = 235 */
writel(200, I2C_BASE + IC_SS_SCL_HCNT);
writel(235, I2C_BASE + IC_SS_SCL_LCNT);

/* 快速模式:目标频率 400 kHz,周期 2.5 μs */
/* t_HIGH = 0.6 μs → 计数值 = 0.6 μs × 50 MHz = 30 */
/* t_LOW  = 1.3 μs → 计数值 = 1.3 μs × 50 MHz = 65 */
writel(30, I2C_BASE + IC_FS_SCL_HCNT);
writel(65, I2C_BASE + IC_FS_SCL_LCNT);

/* 设置速度模式并使能控制器 */
writel(0x2, I2C_BASE + IC_CON);  /* 0x2 = 快速模式 (MASTER_MODE = 1, SPEED = 01) */
writel(0x1, I2C_BASE + IC_ENABLE);
注意: 实际配置时需考虑信号传播延迟和内部同步逻辑带来的额外延时。建议在计算出的计数值基础上减去 1~2 个时钟周期,并通过示波器实测 SCL 波形进行微调。此外,快速模式下 SDA 和 SCL 的上升/下降时间必须满足 ≤ 300 ns,否则可能导致从设备采样错误。

4.3 高速模式(Hs-mode):突破 1 MHz 壁垒

高速模式(High-speed mode, Hs-mode)将 I2C 总线时钟频率提升至 3.4 MHz,是标准/快速模式的 8.5 倍。Hs-mode 引入了主从设备间的握手协议和电流源上拉机制,以克服高频率下 RC 延迟的限制。

4.3.1 高速模式通信流程

Hs-mode 传输分为两个阶段:主代码阶段(Master Code Phase)和高速数据传输阶段。主设备首先以快速模式(400 kHz)发送一个 8 位主代码(00001XXX),随后所有支持 Hs-mode 的从设备进入高速模式,并切换 SCL 上拉方式。

高速模式(Hs-mode)通信流程 Hs-mode 传输流程 主代码阶段 (Fm 400 kHz) NACK (从机响应) 高速数据传输 (Hs 3.4 MHz) STOP (或重复START) SCL 波形示意 400 kHz 3.4 MHz 高速脉冲 Hs-mode 关键机制: 1. 主代码阶段:主设备以 Fm 速率发送 8 位主代码(00001XXX),所有 Hs 从设备必须识别此代码。 2. 电流源上拉:进入 Hs 模式后,主设备内部电流源(典型值 2 mA)替代外部上拉电阻,加速 SCL 上升沿。 3. 总线电容限制:Hs-mode 要求总线电容 ≤ 100 pF,通常仅允许 1~2 个从设备挂载。 4. 退出高速模式:发送 STOP 条件或重复 START 条件后,总线自动降回 Fm 模式。

4.3.2 高速模式寄存器配置

Hs-mode 的时钟配置需要额外设置 IC_HS_SCL_HCNT 和 IC_HS_SCL_LCNT 寄存器。同时,主代码通过 IC_HS_MADDR 寄存器设定。以下为典型配置流程:

/* 1. 设置高速模式时钟计数值(50 MHz 系统时钟,目标 3.4 MHz) */
/* t_HIGH = 60 ns → 计数值 = 60 ns × 50 MHz = 3 */
/* t_LOW  = 160 ns → 计数值 = 160 ns × 50 MHz = 8 */
writel(3, I2C_BASE + IC_HS_SCL_HCNT);
writel(8, I2C_BASE + IC_HS_SCL_LCNT);

/* 2. 设置主代码(例如 00001000 = 0x08) */
writel(0x08, I2C_BASE + IC_HS_MADDR);

/* 3. 配置控制器为高速模式 */
/* IC_CON[2:1] = 10 (高速模式) */
u32 con = readl(I2C_BASE + IC_CON);
con |= (0x2 << 1);  /* SPEED = 10 */
writel(con, I2C_BASE + IC_CON);

/* 4. 使能控制器 */
writel(0x1, I2C_BASE + IC_ENABLE);
性能考量: 在 3.4 MHz 下,每个字节传输(含 ACK)仅需约 2.94 μs。对于 256 字节的突发传输,总耗时约 0.75 ms,远低于标准模式的 20.48 ms。但需注意,Hs-mode 不支持多主机仲裁,且从设备必须显式支持 Hs-mode 才能参与通信。

4.4 超快模式(UFm):单向高速传输

超快模式(Ultra Fast-mode, UFm)是 I2C 总线规范中速率最高的模式,时钟频率可达 5 MHz。与前述模式不同,UFm 采用推挽输出结构,不再需要外部上拉电阻,且通信方向为单向(仅主机发送,从机接收)。这使其非常适合驱动 LED 阵列、GPIO 扩展器等无需回读数据的场景。

4.4.1 UFm 与双向模式的本质区别

特性 标准/快速/高速模式 超快模式 (UFm)
输出结构 开漏 (Open-Drain) 推挽 (Push-Pull)
上拉电阻 需要外部上拉 不需要(内部推挽驱动)
通信方向 双向 (半双工) 单向 (主机→从机)
从机应答 (ACK) 必须 无(从机不驱动 SDA)
多主机仲裁 支持 不支持
从机地址位数 7 / 10 bit 8 bit(固定格式)
最大时钟频率 3.4 MHz 5 MHz
典型应用 传感器、存储器、ADC LED 驱动器、简单输出外设

4.4.2 UFm 通信帧格式

UFm 的帧格式与标准 I2C 类似,但去除了 ACK 位。每个字节传输后,主机直接发送下一个字节或 STOP 条件。从机仅作为接收器,不驱动 SDA 线。

/* UFm 帧格式示例:向地址 0x3A 写入 2 字节数据 0xA5, 0x5A */
/* S - 0x3A (写) - 0xA5 - 0x5A - P */
/* 注意:没有 ACK 位,从机不返回任何响应 */

/* 寄存器配置(假设控制器支持 UFm) */
/* 设置时钟分频:5 MHz 目标,50 MHz 系统时钟 */
/* t_HIGH = 50 ns → 计数值 = 50 ns × 50 MHz = 2.5 → 取整为 3 */
/* t_LOW  = 100 ns → 计数值 = 100 ns × 50 MHz = 5 */
writel(3, I2C_BASE + IC_UFM_SCL_HCNT);
writel(5, I2C_BASE + IC_UFM_SCL_LCNT);

/* 设置速度模式为超快 */
u32 con = readl(I2C_BASE + IC_CON);
con |= (0x3 << 1);  /* SPEED = 11 (UFm) */
writel(con, I2C_BASE + IC_CON);

/* 发送数据(无需检查 ACK 状态) */
writel(0x3A, I2C_BASE + IC_DATA_CMD);  /* 从机地址 + 写位 */
writel(0xA5, I2C_BASE + IC_DATA_CMD);  /* 数据字节 1 */
writel(0x5A, I2C_BASE + IC_DATA_CMD);  /* 数据字节 2 */
/* 发送 STOP 条件 */
writel(0x1, I2C_BASE + IC_DATA_CMD | 0x200);  /* CMD = STOP */
重要限制: UFm 模式下,主机无法获知从机是否成功接收数据。因此,该模式仅适用于对可靠性要求不高的输出控制场景。若需确认数据到达,建议在 UFm 传输后切换回标准模式进行状态读取,或使用其他反馈机制(如 GPIO 中断)。

4.5 模式选择与总线设计建议

在实际 ARM 平台设计中,选择合适的 I2C 传输模式需综合考虑以下因素:

  • 从设备能力: 查阅数据手册确认从设备支持的最高模式。混合使用不同速率设备时,总线应以最慢设备的速度运行。
  • 总线长度与电容: 高速模式(3.4 MHz)和超快模式(5 MHz)要求总线电容 ≤ 100 pF,对应 PCB 走线长度通常不超过 10 cm。标准/快速模式可容忍更长的走线。
  • 电源噪声: 高速切换会产生更大的电流尖峰,需在电源引脚附近增加去耦电容(100 nF + 10 μF)。
  • 电平转换: 若系统存在 1.8V 和 3.3V 混合电压域,需使用电平转换芯片(如 PCA9306),并确保其带宽支持所选模式。
I2C 模式选择决策流程 I2C 模式选择决策树 需要双向通信? 是 → 标准/快速/高速 否 → 超快模式 (UFm) 总线电容 ≤ 400pF 总线电容 ≤ 100pF
工程实践: 在 ARM Linux 内核中,I2C 设备树节点通过 clock-frequency 属性指定总线速率。例如 clock-frequency = <400000>; 表示快速模式。内核 I2C 子系统会根据该值自动计算并配置控制器寄存器。对于高速模式,需额外设置 i2c-scl-rising-time-ns 和 i2c-scl-falling-time-ns 属性,以辅助时序计算。