1. I2C总线基础
I2C(Inter-Integrated Circuit)总线是由Philips公司(现NXP)开发的一种同步、多主从、串行通信总线。它仅需两根信号线——串行数据线SDA和串行时钟线SCL,即可实现芯片间的短距离通信,是嵌入式系统中使用最广泛的板级总线之一。
1.1 I2C总线物理层特性
I2C总线采用开漏(Open-Drain)或开集电极(Open-Collector)输出结构,配合外部上拉电阻实现线与逻辑。所有设备的SDA和SCL引脚均为开漏输出,通过上拉电阻连接至VDD(通常为1.8V、3.3V或5V)。
| 参数 | 标准模式 (Standard) | 快速模式 (Fast) | 高速模式 (High-Speed) |
|---|---|---|---|
| 最大时钟频率 | 100 kHz | 400 kHz | 3.4 MHz |
| 最大总线电容 | 400 pF | 400 pF | 100 pF |
| 上拉电阻典型值 | 4.7 kΩ | 2.2 kΩ | 1.0 kΩ |
| 最大从设备数量 | 127(7位地址) | 127(7位地址) | 127(7位地址) |
| 最大传输距离(板级) | ~1 m | ~0.5 m | ~0.1 m |
关键概念:开漏输出的本质是设备只能将总线拉低(输出0),无法主动驱动高电平。总线空闲时由上拉电阻将SDA和SCL维持在VDD高电平。这种设计允许多个设备共享总线而不会发生短路冲突。
1.2 SDA/SCL信号时序
I2C总线的数据传输完全由SCL时钟同步,SDA数据线在SCL低电平时变化,在SCL高电平时被采样。以下是I2C通信的核心时序定义:
- 空闲状态:SDA和SCL均为高电平。
- 起始条件(START):SCL为高电平时,SDA从高电平跳变为低电平。
- 停止条件(STOP):SCL为高电平时,SDA从低电平跳变为高电平。
- 数据位传输:每个SCL时钟脉冲传输1位数据。SCL低电平时SDA允许变化,SCL高电平时SDA必须稳定。
- 应答位(ACK):每传输完8位数据后,接收方在第9个SCL脉冲期间将SDA拉低表示应答。
时序参数速查表(标准模式100kHz):
| tLOW(SCL低电平时间) | ≥ 4.7 μs |
| tHIGH(SCL高电平时间) | ≥ 4.0 μs |
| tSU;STA(起始条件保持时间) | ≥ 4.0 μs |
| tHD;DAT(数据保持时间) | ≥ 0 μs |
| tSU;DAT(数据建立时间) | ≥ 250 ns |
| tr / tf(上升/下降时间) | ≤ 1000 ns |
1.3 I2C总线拓扑结构
I2C总线采用多主从总线拓扑,所有设备通过SDA和SCL两条线并联连接。每个设备都有一个唯一的地址(7位或10位),主设备通过地址选择从设备进行通信。
- 主设备(Master):发起总线传输、产生时钟信号、发送起始/停止条件。典型主设备包括MCU、SoC、DSP。
- 从设备(Slave):响应主设备寻址,接收或发送数据。典型从设备包括传感器、EEPROM、ADC/DAC、RTC、IO扩展器。
- 多主仲裁:多个主设备可同时尝试控制总线,通过SDA线与逻辑仲裁,丢失仲裁的主设备自动释放总线。
1.4 I2C总线通信协议
I2C通信以帧为单位,每个帧包含起始条件、从设备地址、读写标志、数据字节、应答位和停止条件。以下是标准7位地址格式的通信流程:
- 主设备发送起始条件(S):SDA在SCL高电平时从高变低。
- 主设备发送7位从设备地址:高位在前,SCL同步时钟。
- 主设备发送读写位(R/W):0表示写操作,1表示读操作。
- 从设备发送应答位(ACK):地址匹配的从设备在第9个SCL脉冲拉低SDA。
- 数据传输:每8位数据后跟1位应答位,发送方释放SDA,接收方拉低应答。
- 主设备发送停止条件(P):SDA在SCL高电平时从低变高。
常见调试陷阱:从设备无应答(NACK)是最常见的I2C通信故障。原因包括:设备地址错误、设备未上电、总线被拉死(SDA或SCL卡在低电平)、上拉电阻值不当导致信号上升沿过缓。调试时应首先用示波器或逻辑分析仪检查SDA/SCL波形。
1.5 I2C总线优缺点对比
| 优势 | 劣势 |
|---|---|
| 仅需2根信号线,节省PCB空间和IO引脚 | 传输速率较低(最高3.4MHz),不适合大数据量传输 |
| 支持多主设备仲裁,无需片选信号 | 总线电容限制设备数量和走线长度 |
| 每个设备有唯一地址,易于扩展 | 地址冲突时需硬件修改或使用地址转换器 |
| 开漏结构允许不同电压域设备共存(需电平转换) | 无内置错误检测机制(除ACK/NACK外) |
| 协议简单,硬件实现成本低 | 长距离传输可靠性下降,抗干扰能力弱于差分总线 |
工程建议:在ARM平台设计I2C总线时,建议将传感器、EEPROM等低速外设挂载在同一条I2C总线上,而音频编解码器、触摸控制器等对实时性要求较高的设备应使用独立I2C总线或高速模式。总线上设备数量建议不超过8个,以确保信号完整性。