3. I2C时序分析:标准模式、快速模式与高速模式
I2C总线时序是驱动开发中最关键的物理层基础。Android内核中的I2C从设备驱动必须精确匹配主控制器的时序参数,否则会导致通信失败、数据错位甚至总线锁死。本节从标准模式(100kHz)、快速模式(400kHz)和高速模式(3.4MHz)三个速率等级出发,详细分析时序要求、上拉电阻计算方法以及实际工程中的避坑要点。
3.1 I2C总线时序基础
I2C总线使用SCL(时钟线)和SDA(数据线)两根线进行同步串行通信。每个数据位在SCL的上升沿被采样,SDA在SCL低电平期间变化。时序参数主要分为以下几类:
- 时序阈值:上升/下降时间、保持时间、建立时间
- 速率相关:SCL高电平/低电平宽度、总线空闲时间
- 抗干扰:毛刺抑制时间(仅高速模式)
3.2 三种速率模式的时序参数对比
下表列出了标准模式、快速模式和高速模式的核心时序要求。所有参数均基于I2C总线规范v7.0,实际芯片数据手册可能略有差异,以芯片手册为准。
| 参数 | 符号 | 标准模式(100kHz) | 快速模式(400kHz) | 高速模式(3.4MHz) |
|---|---|---|---|---|
| SCL时钟频率 | fSCL | 0 ~ 100 kHz | 0 ~ 400 kHz | 0 ~ 3.4 MHz |
| SCL低电平时间 | tLOW | ≥ 4.7 μs | ≥ 1.3 μs | ≥ 0.16 μs |
| SCL高电平时间 | tHIGH | ≥ 4.0 μs | ≥ 0.6 μs | ≥ 0.06 μs |
| SDA建立时间 | tSU;DAT | ≥ 250 ns | ≥ 100 ns | ≥ 10 ns |
| SDA保持时间 | tHD;DAT | ≥ 0 ns | ≥ 0 ns | ≥ 0 ns |
| SCL/SDA上升时间 | tr | ≤ 1000 ns | ≤ 300 ns | ≤ 40 ns |
| SCL/SDA下降时间 | tf | ≤ 300 ns | ≤ 300 ns | ≤ 40 ns |
| 总线电容 | Cb | ≤ 400 pF | ≤ 400 pF | ≤ 100 pF |
| 毛刺抑制时间 | tSP | N/A | N/A | 0 ~ 10 ns |
3.3 I2C时序波形图
下图展示了I2C总线在标准模式下的完整时序波形,包含起始条件、数据位传输和停止条件。SCL和SDA的时序关系是理解所有I2C通信的基础。
3.4 上拉电阻计算
I2C总线的SCL和SDA均为开漏输出,必须通过外部上拉电阻将总线拉至高电平。上拉电阻的取值直接影响上升时间、功耗和抗干扰能力。计算公式如下:
3.4.1 最小上拉电阻
最小上拉电阻受限于输出级的灌电流能力。当从设备或主设备将总线拉低时,上拉电阻不能太小,否则灌电流会超过器件允许的最大值。
R_p(min) = V_cc / I_OL(max)
其中:
V_cc = 总线供电电压 (通常为1.8V或3.3V)
I_OL(max) = 器件允许的最大灌电流 (通常为3mA ~ 20mA)
示例 (V_cc = 3.3V, I_OL = 3mA):
R_p(min) = 3.3V / 0.003A = 1100 Ω
3.4.2 最大上拉电阻
最大上拉电阻受限于总线电容和要求的上升时间。RC时间常数必须足够小,以保证在规定的上升时间内信号能从低电平上升到高电平阈值。
R_p(max) = t_r / (0.8473 × C_b)
其中:
t_r = 要求的最大上升时间 (见上表)
C_b = 总线上总电容 (包括器件引脚电容、走线电容等)
示例 (快速模式, t_r = 300ns, C_b = 200pF):
R_p(max) = 300ns / (0.8473 × 200pF) ≈ 1770 Ω
3.4.3 实际选值建议
上拉电阻的最终取值应在Rp(min)和Rp(max)之间,并考虑功耗和噪声裕量。下表给出了常见场景的推荐值:
| 速率模式 | 总线电压 | 总线电容 | Rp(min) | Rp(max) | 推荐值 |
|---|---|---|---|---|---|
| 标准模式 | 3.3V | 200 pF | 1.1 kΩ | 5.9 kΩ | 4.7 kΩ |
| 标准模式 | 1.8V | 200 pF | 600 Ω | 5.9 kΩ | 4.7 kΩ |
| 快速模式 | 3.3V | 100 pF | 1.1 kΩ | 3.5 kΩ | 2.2 kΩ |
| 快速模式 | 1.8V | 100 pF | 600 Ω | 3.5 kΩ | 2.2 kΩ |
| 高速模式 | 1.8V | 50 pF | 600 Ω | 940 Ω | 820 Ω |
3.5 上拉电阻与总线电容的关系图
下图展示了不同速率模式下,最大上拉电阻与总线电容之间的关系。曲线下方的区域为安全设计区。
3.6 高速模式(Hs-mode)的特殊时序
高速模式(3.4MHz)在标准I2C协议基础上增加了以下特殊机制:
- 主从握手:主设备在进入高速模式前,先发送一个特殊的“主代码”(00001XXX)来通知从设备切换速率
- 电流源上拉:高速模式下,主设备使用内部电流源(典型值3mA)替代外部上拉电阻,以加速上升沿
- 毛刺滤波器:从设备必须包含10ns以内的毛刺抑制滤波器,防止噪声误触发
- 总线电容限制:高速模式要求总线电容不超过100pF,通常只支持1~2个从设备
3.7 时序调试常见问题
在Android内核I2C驱动开发中,时序问题是最常见的故障来源。以下列出典型问题及排查方法:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 总线锁死(SCL被拉低) | 从设备未释放时钟线,或上拉电阻过小导致灌电流过大 | 测量SCL电压,检查从设备电源和复位状态 |
| 数据错位/CRC错误 | 上升沿过缓,导致采样点偏移 | 用示波器测量上升时间,减小上拉电阻 |
| 高速模式无法启动 | 主代码发送失败,或从设备不支持Hs-mode | 检查从设备数据手册,确认Hs-mode使能位 |
| 总线噪声干扰 | 上拉电阻过大,总线抗噪能力弱 | 适当减小上拉电阻,增加去耦电容 |
| 功耗异常 | 上拉电阻过小,静态电流过大 | 计算静态功耗,权衡上升时间要求 |
3.8 上拉电阻计算实例
以一个典型的Android设备触摸屏I2C接口为例,演示完整的上拉电阻计算过程:
/* 已知条件 */
V_cc = 1.8V /* 触摸屏I2C供电电压 */
I_OL(max) = 3mA /* 从设备最大灌电流 */
C_b = 150pF /* 总线总电容(含2个器件+走线) */
速率模式 = 快速模式(400kHz)
/* 步骤1:计算最小上拉电阻 */
R_p(min) = 1.8V / 0.003A = 600 Ω
/* 步骤2:计算最大上拉电阻 */
t_r(max) = 300ns /* 快速模式上升时间要求 */
R_p(max) = 300ns / (0.8473 × 150pF) ≈ 2360 Ω
/* 步骤3:选择标准电阻值 */
/* 推荐在R_p(min)和R_p(max)之间选择E24系列标准值 */
/* 取 R_p = 2.2 kΩ (E24系列) */
/* 步骤4:验证上升时间 */
t_r_actual = 0.8473 × 2200Ω × 150pF ≈ 280ns
/* 280ns < 300ns,满足要求 */
/* 步骤5:验证灌电流 */
I_OL_actual = 1.8V / 2200Ω ≈ 0.82mA
/* 0.82mA < 3mA,安全 */