2. I2C总线时序
I2C(Inter-Integrated Circuit)总线是一种同步、多主从、串行通信总线,仅需两根双向开漏线——串行时钟线(SCL)和串行数据线(SDA)。理解其时序参数与波形是驱动开发的基础,尤其在Android设备中,大量传感器、触控、电源管理芯片均挂载在I2C总线上。本章将深入分析标准模式(100 kHz)、快速模式(400 kHz)和高速模式(3.4 MHz)的时序差异,并通过SVG波形图直观展示SCL与SDA的电气行为。
2.1 I2C总线基本时序概念
I2C通信以“起始条件”(START)开始,以“停止条件”(STOP)结束。数据在SCL低电平时变化,在SCL高电平时被采样。每个时钟脉冲传输1位数据,从最高位(MSB)开始。总线空闲时,SCL和SDA均为高电平(由上拉电阻拉高)。
- tLOW:SCL低电平周期
- tHIGH:SCL高电平周期
- tSU;DAT:数据建立时间(SDA在SCL高电平前必须稳定)
- tHD;DAT:数据保持时间(SCL低电平后SDA保持有效的时间)
- tSU;STA:起始条件建立时间
- tHD;STA:起始条件保持时间
- tSU;STO:停止条件建立时间
- tBUF:总线空闲时间(停止与下一次起始之间的最小时间)
- tr / tf:SCL/SDA上升时间与下降时间
2.2 标准模式(Standard-mode, 100 kHz)
标准模式是I2C最基础的通信速率,所有I2C设备均支持。其SCL频率为100 kHz,总线电容限制为400 pF。该模式下时序参数较为宽松,适合低速传感器(如温度、湿度)和简单外设。
2.2.1 标准模式时序参数表
| 参数 | 符号 | 最小值 | 最大值 | 单位 |
|---|---|---|---|---|
| SCL时钟频率 | fSCL | 0 | 100 | kHz |
| SCL低电平周期 | tLOW | 4.7 | — | μs |
| SCL高电平周期 | tHIGH | 4.0 | — | μs |
| 数据建立时间 | tSU;DAT | 250 | — | ns |
| 数据保持时间 | tHD;DAT | 0 | 3.45 | μs |
| SCL/SDA上升时间 | tr | — | 1000 | ns |
| SCL/SDA下降时间 | tf | — | 300 | ns |
| 起始条件保持时间 | tHD;STA | 4.0 | — | μs |
| 停止条件建立时间 | tSU;STO | 4.0 | — | μs |
| 总线空闲时间 | tBUF | 4.7 | — | μs |
2.3 快速模式(Fast-mode, 400 kHz)
快速模式将SCL频率提升至400 kHz,是Android设备中最常用的I2C速率(如触控IC、音频编解码器、电源管理芯片)。其总线电容仍限制为400 pF,但时序参数更为严格,上升/下降时间要求更短。
2.3.1 快速模式时序参数表
| 参数 | 符号 | 最小值 | 最大值 | 单位 |
|---|---|---|---|---|
| SCL时钟频率 | fSCL | 0 | 400 | kHz |
| SCL低电平周期 | tLOW | 1.3 | — | μs |
| SCL高电平周期 | tHIGH | 0.6 | — | μs |
| 数据建立时间 | tSU;DAT | 100 | — | ns |
| 数据保持时间 | tHD;DAT | 0 | 0.9 | μs |
| SCL/SDA上升时间 | tr | — | 300 | ns |
| SCL/SDA下降时间 | tf | — | 300 | ns |
| 起始条件保持时间 | tHD;STA | 0.6 | — | μs |
| 停止条件建立时间 | tSU;STO | 0.6 | — | μs |
| 总线空闲时间 | tBUF | 1.3 | — | μs |
2.4 高速模式(High-speed mode, 3.4 MHz)
高速模式(Hs-mode)将SCL频率提升至3.4 MHz,主要用于高带宽设备(如摄像头传感器、高速ADC)。该模式引入了“主从握手”机制:主设备先以快速模式发送“主码”(00001XXX),从设备识别后启用高速模式,此时SCL上升沿变陡,电流源上拉替代电阻上拉。
2.4.1 高速模式时序参数表
| 参数 | 符号 | 最小值 | 最大值 | 单位 |
|---|---|---|---|---|
| SCL时钟频率 | fSCL | 0 | 3.4 | MHz |
| SCL低电平周期 | tLOW | 160 | — | ns |
| SCL高电平周期 | tHIGH | 60 | — | ns |
| 数据建立时间 | tSU;DAT | 10 | — | ns |
| 数据保持时间 | tHD;DAT | 0 | 70 | ns |
| SCL/SDA上升时间 | tr | — | 40 | ns |
| SCL/SDA下降时间 | tf | — | 40 | ns |
| 起始条件保持时间 | tHD;STA | 160 | — | ns |
| 停止条件建立时间 | tSU;STO | 160 | — | ns |
| 总线空闲时间 | tBUF | 160 | — | ns |
- 上升/下降时间从1000 ns(标准)骤降至40 ns,要求PCB布局极短、上拉电流源(典型值2 mA)替代电阻。
- tSU;DAT仅10 ns,对信号完整性要求极高,通常需要差分或屏蔽设计。
- 高速模式仅在“主码”握手后启用,后续通信仍遵循I2C协议格式。
- Android设备中,高速模式通常由硬件I2C控制器直接支持,用户态驱动(i2c-dev)需通过ioctl设置传输速率。
2.5 三种模式时序参数对比
下表汇总了标准、快速、高速三种模式的核心时序差异,便于驱动开发时快速参考。
| 参数 | 标准模式 (100 kHz) | 快速模式 (400 kHz) | 高速模式 (3.4 MHz) |
|---|---|---|---|
| fSCL 最大值 | 100 kHz | 400 kHz | 3.4 MHz |
| tLOW 最小值 | 4.7 μs | 1.3 μs | 160 ns |
| tHIGH 最小值 | 4.0 μs | 0.6 μs | 60 ns |
| tSU;DAT 最小值 | 250 ns | 100 ns | 10 ns |
| tr 最大值 | 1000 ns | 300 ns | 40 ns |
| tf 最大值 | 300 ns | 300 ns | 40 ns |
| 总线电容限制 | 400 pF | 400 pF | 100 pF |
| 上拉方式 | 电阻上拉 | 电阻上拉 | 电流源上拉 |
| 典型应用 | 温度传感器、EEPROM | 触控、音频、PMIC | 摄像头、高速ADC |
2.6 SCL与SDA波形分析:实际通信示例
以下是一个完整的I2C写操作波形分析:主设备向从设备(地址0x48)写入一个字节数据0xA5。波形展示了起始条件、7位地址、读写位、应答位、数据字节、应答位和停止条件。
2.7 用户态驱动中的时序编程要点
在Android用户态驱动(通过i2c-dev)中,时序参数通常由内核I2C控制器硬件自动处理,但驱动开发者仍需理解以下要点:
- 速率设置:通过ioctl
I2C_TIMEOUT和I2C_RETRIES控制超时与重试,但速率由内核设备树或控制器驱动决定。用户态可通过I2C_FUNCS查询支持的模式。 - 时序违规检测:若硬件设计不当(如上拉电阻过大导致上升沿过慢),内核可能返回
-EIO或-