1. I2C总线协议基础
1.1 I2C总线物理层特性
I2C(Inter-Integrated Circuit)总线是一种由Philips公司(现NXP)开发的同步、多主从、串行通信总线。在嵌入式ARM平台中,I2C是连接传感器、EEPROM、RTC、ADC/DAC等外设最常用的低速总线之一。
物理层采用两线制结构:
- SDA(Serial Data Line):串行数据线,用于传输地址、数据和控制信号。
- SCL(Serial Clock Line):串行时钟线,由主设备产生,同步数据传输。
两条线均为开漏(Open-Drain)输出结构,通过外部上拉电阻接至VDD(通常为3.3V或5V)。开漏结构允许多个设备共享总线,实现线与(Wired-AND)逻辑。
关键参数速查:标准模式(100 kHz)、快速模式(400 kHz)、高速模式(3.4 MHz)。ARM平台I2C控制器通常支持标准与快速模式,高速模式需额外配置时序寄存器。
| 参数 | 标准模式 | 快速模式 | 说明 |
|---|---|---|---|
| SCL频率 | 100 kHz | 400 kHz | 由主设备时钟分频产生 |
| 上拉电阻 | 4.7 kΩ ~ 10 kΩ | 1.5 kΩ ~ 4.7 kΩ | 总线电容决定上升时间 |
| 最大总线电容 | 400 pF | 400 pF | 超过需使用缓冲器 |
| 逻辑低电平 | ≤ 0.3 × VDD | ≤ 0.3 × VDD | 开漏下拉驱动 |
| 逻辑高电平 | ≥ 0.7 × VDD | ≥ 0.7 × VDD | 由上拉电阻实现 |
硬件调试要点:使用示波器测量SDA/SCL波形时,应关注上升沿斜率。若上升沿过缓(> 300 ns),说明上拉电阻过大或总线电容过高,可能导致通信时序违规。
1.2 SDA/SCL信号时序
I2C总线上的数据传输完全由SCL时钟同步。数据在SCL低电平时变化,在SCL高电平时采样。这一规则保证了总线通信的确定性。
数据有效性规则:
- SCL高电平期间,SDA必须保持稳定(数据有效)。
- SCL低电平期间,SDA允许变化(数据切换)。
- 每个SCL时钟脉冲传输1位数据,MSB(最高位)优先。
| 符号 | 参数 | 标准模式 | 快速模式 | 单位 |
|---|---|---|---|---|
| fSCL | SCL时钟频率 | 0 ~ 100 | 0 ~ 400 | kHz |
| tHD;STA | 起始条件保持时间 | ≥ 4.0 | ≥ 0.6 | μs |
| tLOW | SCL低电平时间 | ≥ 4.7 | ≥ 1.3 | μs |
| tHIGH | SCL高电平时间 | ≥ 4.0 | ≥ 0.6 | μs |
| tSU;DAT | 数据建立时间 | ≥ 250 | ≥ 100 | ns |
| tHD;DAT | 数据保持时间 | ≥ 0 | ≥ 0 | ns |
| tr | SDA/SCL上升时间 | ≤ 1000 | ≤ 300 | ns |
| tf | SDA/SCL下降时间 | ≤ 300 | ≤ 300 | ns |
常见时序故障:在ARM平台调试I2C时,若遇到SCL低电平时间不足(tLOW < 4.7 μs),通常是因为I2C时钟分频寄存器配置错误。检查CLKDIV或I2C_CCR寄存器,确保分频系数满足时序要求。
1.3 起始条件与停止条件
I2C总线的通信由起始条件(START Condition)和停止条件(STOP Condition)界定。这两个条件是总线上的特殊信号序列,用于标识一次传输的开始和结束。
起始条件(S):
- SCL保持高电平期间,SDA从高电平切换到低电平。
- 由主设备产生,表示总线从空闲状态进入活跃状态。
- 起始条件后,主设备立即发送从设备地址和读写位。
停止条件(P):
- SCL保持高电平期间,SDA从低电平切换到高电平。
- 由主设备产生,表示本次传输结束,总线释放为空闲状态。
- 停止条件后,总线恢复空闲,其他主设备可以发起传输。
重复起始条件(Repeated START, Sr):在未产生停止条件的情况下,主设备再次产生起始条件。常用于多字节读写或改变传输方向(如从写切换到读),避免总线被其他主设备抢占。
| 条件 | 信号变化 | SCL状态 | 最小保持时间 | 典型应用场景 |
|---|---|---|---|---|
| 起始条件 (S) | SDA: H → L | 高电平 | tHD;STA ≥ 4.0 μs | 开始一次新的传输 |
| 停止条件 (P) | SDA: L → H | 高电平 | tSU;STO ≥ 4.0 μs | 结束当前传输 |
| 重复起始 (Sr) | SDA: H → L | 高电平 | tHD;STA ≥ 4.0 μs | 改变传输方向或连续操作 |
调试技巧:使用逻辑分析仪捕获I2C波形时,重点关注起始条件和停止条件之间的数据帧完整性。若发现起始条件后无响应(ACK/NACK),应检查从设备地址是否正确、设备是否上电、以及总线是否存在电平冲突。
1.4 完整数据传输帧结构
一次完整的I2C传输帧包含以下阶段:
- 起始条件(S):主设备拉低SDA,总线激活。
- 从设备地址(7位):主设备发送7位地址 + 1位读写位(R/W)。
- 应答位(ACK):从设备在第9个SCL周期拉低SDA表示应答。
- 数据字节(8位):主设备(写模式)或从设备(读模式)发送数据。
- 应答位(ACK):接收方每接收一个字节后发送应答。
- 停止条件(P):主设备拉高SDA,总线释放。
| 字段 | 位数 | 发送方 | 说明 |
|---|---|---|---|
| S | 1 | 主设备 | 起始条件 |
| Slave Address | 7 | 主设备 | 从设备唯一地址,高位在前 |
| R/W | 1 | 主设备 | 0=写,1=读 |
| ACK | 1 | 从设备 | 0=应答,1=非应答 |
| Data | 8 | 主/从设备 | 数据字节,MSB优先 |
| ACK | 1 | 接收方 | 每字节后应答 |
| P | 1 | 主设备 | 停止条件 |