1. I2C总线基础:历史、物理层特性与电气标准

1.1 I2C总线发展历史

I2C(Inter-Integrated Circuit)总线由Philips半导体(现NXP)于1982年推出,最初用于电视接收机中微控制器与外设之间的低速通信。其设计目标是以最少的引脚(仅需两根线)实现多主设备、多从设备的板级通信。

版本 推出年份 最大速率 关键特性
I2C 1.0 1982 100 kbit/s 标准模式(Standard-mode)
I2C 2.0 1992 400 kbit/s 快速模式(Fast-mode)
I2C 2.1 2000 3.4 Mbit/s 高速模式(High-speed mode)
I2C 3.0 2007 1 Mbit/s 快速模式+(Fast-mode Plus)
I2C 4.0 2012 5 Mbit/s 超快速模式(Ultra Fast-mode)
I2C 5.0 2014 5 Mbit/s 仅单向传输,移除开漏要求
驱动开发提示:在Linux内核中,I2C总线驱动通过 struct i2c_adapter 抽象硬件控制器,支持标准模式(100kHz)和快速模式(400kHz)是最低要求。高速模式(3.4MHz)需要额外的电流源上拉和从设备支持,调试时需特别关注时序参数。

1.2 物理层特性:SDA与SCL

I2C总线仅使用两条双向信号线:

  • SDA(Serial Data Line):串行数据线,用于传输地址和数据。
  • SCL(Serial Clock Line):串行时钟线,由主设备产生时钟信号。

两条线均采用开漏(Open-Drain)输出结构,通过外部上拉电阻接至VDD。这种设计允许多个设备共享总线,任何设备都可以将总线拉低(输出0),但无法主动驱动高电平(输出1由电阻上拉实现)。

核心概念:“线与”(Wired-AND)逻辑——只要有一个设备将SDA或SCL拉低,整条总线即为低电平。这是I2C总线仲裁和时钟拉伸(Clock Stretching)的物理基础。
I2C总线物理连接拓扑图 I2C总线物理连接拓扑图 Rp Rp VDD (3.3V / 5V) SDA SCL 主设备 (Master) 从设备1 (Slave 0x50) 从设备2 (Slave 0x68) 说明: • 所有设备的SDA引脚通过线与方式连接至同一条总线 • 所有设备的SCL引脚通过线与方式连接至同一条总线 • 上拉电阻Rp将空闲总线拉高至VDD,设备通过开漏输出拉低总线

1.3 电气标准与上拉电阻选择

上拉电阻的取值直接影响I2C总线的信号完整性、功耗和最大通信速率。电阻值过小会导致灌电流过大,过大则会使信号上升沿变缓,限制通信速率。

1.3.1 上拉电阻计算公式

上拉电阻的最小值和最大值由以下约束决定:

  • 最小值(Rp_min):受限于输出低电平时的最大灌电流(VOL max = 0.4V)。
  • 最大值(Rp_max):受限于总线电容和要求的上升时间(tr)。
Rp_min = (VDD - VOL_max) / IOL_max
       = (VDD - 0.4V) / 3mA  (标准/快速模式)
       = (VDD - 0.4V) / 20mA (快速模式+)

Rp_max = t_r / (0.8473 × C_bus)
       = 1000ns / (0.8473 × C_bus)  (快速模式,t_r max = 300ns)

1.3.2 典型上拉电阻推荐值

工作模式 VDD = 5V VDD = 3.3V VDD = 1.8V 最大总线电容
标准模式 (100kHz) 4.7kΩ ~ 10kΩ 4.7kΩ ~ 10kΩ 4.7kΩ ~ 10kΩ 400pF
快速模式 (400kHz) 1.5kΩ ~ 4.7kΩ 1.5kΩ ~ 4.7kΩ 2.2kΩ ~ 4.7kΩ 400pF
快速模式+ (1MHz) 1.0kΩ ~ 2.2kΩ 1.0kΩ ~ 2.2kΩ 1.5kΩ ~ 2.2kΩ 550pF
高速模式 (3.4MHz) 0.5kΩ ~ 1.0kΩ 0.5kΩ ~ 1.0kΩ 0.5kΩ ~ 1.0kΩ 100pF
调试陷阱:在Linux驱动调试中,如果发现I2C通信偶尔出现ACK丢失或数据错位,首先检查上拉电阻是否匹配当前总线电容和速率。使用示波器测量SDA/SCL上升时间,若超过规格书要求(快速模式300ns),应减小上拉电阻值。另外,多从设备场景下总线电容会累加,每增加一个从设备约增加5~10pF。

1.4 总线电容与上升时间关系

总线电容Cbus由以下部分组成:

  • 每个设备的引脚电容(典型值:3~10pF)
  • PCB走线电容(约1pF/cm)
  • 连接器电容
上升时间与总线电容关系图 上升时间与总线电容关系(VDD=3.3V) 50pF 150pF 250pF 350pF 450pF 总线电容 C_bus 0ns 200ns 400ns 600ns 上升时间 t_r Rp=1kΩ Rp=4.7kΩ Rp=10kΩ 快速模式 t_r max = 300ns

1.5 电平标准与兼容性

I2C总线支持多种电源电压,不同电压域的设备可以通过电平转换器共享总线。Linux驱动中通过 struct i2c_adapter 的 retries 和 timeout 字段适配不同电气特性。

参数 标准模式 快速模式 快速模式+ 高速模式
SCL时钟频率 100 kHz 400 kHz 1 MHz 3.4 MHz
VIL 低电平输入 0.3 × VDD 0.3 × VDD 0.3 × VDD 0.3 × VDD
VIH 高电平输入 0.7 × VDD 0.7 × VDD 0.7 × VDD 0.7 × VDD
VOL 低电平输出 0.4V @ 3mA 0.4V @ 3mA 0.4V @ 20mA 0.4V @ 3mA
上升时间 tr 1000 ns 300 ns 120 ns 80 ns
下降时间 tf 300 ns 300 ns 120 ns 80 ns
输入毛刺抑制 无 50 ns 50 ns 10 ns
驱动配置要点:在设备树中通过 clock-frequency 属性指定I2C总线速率。例如 clock-frequency = <400000>; 表示快速模式。内核会根据该值自动调整时序寄存器,但上拉电阻仍需硬件工程师根据实际总线电容计算选型。

1.6 本章小结