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 扩展 |
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)和更严格的保持窗口。
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);
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 上拉方式。
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);
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 */
4.5 模式选择与总线设计建议
在实际 ARM 平台设计中,选择合适的 I2C 传输模式需综合考虑以下因素:
- 从设备能力: 查阅数据手册确认从设备支持的最高模式。混合使用不同速率设备时,总线应以最慢设备的速度运行。
- 总线长度与电容: 高速模式(3.4 MHz)和超快模式(5 MHz)要求总线电容 ≤ 100 pF,对应 PCB 走线长度通常不超过 10 cm。标准/快速模式可容忍更长的走线。
- 电源噪声: 高速切换会产生更大的电流尖峰,需在电源引脚附近增加去耦电容(100 nF + 10 μF)。
- 电平转换: 若系统存在 1.8V 和 3.3V 混合电压域,需使用电平转换芯片(如 PCA9306),并确保其带宽支持所选模式。
clock-frequency 属性指定总线速率。例如 clock-frequency = <400000>; 表示快速模式。内核 I2C 子系统会根据该值自动计算并配置控制器寄存器。对于高速模式,需额外设置 i2c-scl-rising-time-ns 和 i2c-scl-falling-time-ns 属性,以辅助时序计算。