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控制器通常支持标准与快速模式,高速模式需额外配置时序寄存器。
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),说明上拉电阻过大或总线电容过高,可能导致通信时序违规。
I2C总线物理连接拓扑 主设备 ARM SoC 从设备1 EEPROM 从设备2 传感器 SDA SCL Rₚ Rₚ VDD (3.3V) 物理层关键约束: • 所有设备SDA/SCL引脚必须为开漏或开集电极输出 • 上拉电阻值需根据总线电容和通信速率计算:Rₚ(min) = (VDD - VOL) / IOL(max) • 同一总线上的设备地址必须唯一,7位地址最多支持112个节点

1.2 SDA/SCL信号时序

I2C总线上的数据传输完全由SCL时钟同步。数据在SCL低电平时变化,在SCL高电平时采样。这一规则保证了总线通信的确定性。

数据有效性规则:

  • SCL高电平期间,SDA必须保持稳定(数据有效)。
  • SCL低电平期间,SDA允许变化(数据切换)。
  • 每个SCL时钟脉冲传输1位数据,MSB(最高位)优先。
I2C时序参数(标准模式 vs 快速模式)
符号 参数 标准模式 快速模式 单位
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寄存器,确保分频系数满足时序要求。
SDA/SCL数据采样时序图 SCL SDA 采样点1 采样点2 采样点3 采样点4 D7 (MSB) D6 D5 D4 D3 D2 D1 D0 (LSB) 规则:SCL高电平时SDA必须稳定(橙色虚线采样点),SCL低电平时SDA允许变化(数据切换窗口)

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 改变传输方向或连续操作
起始条件与停止条件波形 SCL SDA 起始条件 S 停止条件 P 数据传输(地址 + 数据 + ACK) 起始条件:SCL=H时 SDA↓;停止条件:SCL=H时 SDA↑;两者均在SCL高电平期间完成
调试技巧:使用逻辑分析仪捕获I2C波形时,重点关注起始条件和停止条件之间的数据帧完整性。若发现起始条件后无响应(ACK/NACK),应检查从设备地址是否正确、设备是否上电、以及总线是否存在电平冲突。

1.4 完整数据传输帧结构

一次完整的I2C传输帧包含以下阶段:

  1. 起始条件(S):主设备拉低SDA,总线激活。
  2. 从设备地址(7位):主设备发送7位地址 + 1位读写位(R/W)。
  3. 应答位(ACK):从设备在第9个SCL周期拉低SDA表示应答。
  4. 数据字节(8位):主设备(写模式)或从设备(读模式)发送数据。
  5. 应答位(ACK):接收方每接收一个字节后发送应答。
  6. 停止条件(P):主设备拉高SDA,总线释放。
I2C帧结构字段说明
字段 位数 发送方 说明
S 1 主设备 起始条件
Slave Address 7 主设备 从设备唯一地址,高位在前
R/W 1 主设备 0=写,1=读
ACK 1 从设备 0=应答,1=非应答
Data 8 主/从设备 数据字节,MSB优先
ACK 1 接收方 每字节后应答
P 1 主设备 停止条件
← 上一章 📖 返回目录 下一章 →