2. I2C协议基础:物理层、电气特性与通信机制

在嵌入式系统中,I2C(Inter-Integrated Circuit)总线以其引脚少、结构简单、支持多主从通信的特点,成为连接传感器、EEPROM、ADC等外设的常用串行协议。本章从物理层出发,逐步拆解I2C的电气特性、信号时序与应答机制,为后续在S32K3平台上实现高效从机驱动打下基础。

2.1 I2C总线物理层与电气特性

I2C总线仅使用两条双向信号线:串行数据线(SDA)和串行时钟线(SCL)。所有设备通过开漏输出(Open-Drain)或开集电极(Open-Collector)方式连接到总线,配合外部上拉电阻实现线与逻辑。

关键电气参数(标准模式 100kHz):
  • 总线电容:≤ 400 pF(限制总线上设备数量与走线长度)
  • 上拉电阻:典型值 4.7 kΩ(3.3V供电),需根据总线电容调整
  • 逻辑低电平:≤ 0.3 × VDD
  • 逻辑高电平:≥ 0.7 × VDD
  • 最大灌电流:3 mA(开漏输出驱动能力)

下图展示了I2C总线的典型连接拓扑,主控制器(S32K3)与多个从设备共享SDA和SCL线,每个从设备拥有唯一的7位或10位地址。

I2C总线物理连接拓扑 Rp Rp VDD VDD SCL SDA S32K3 主控制器 从机 A 0x50 从机 B 0x68 从机 C 0x77 主设备 从设备 双向连接
设计提示:在S32K3平台上,I2C引脚通常复用为LPI2C功能。上拉电阻的选择需结合总线电容与目标频率计算,过小的电阻会增加功耗,过大的电阻会限制上升沿时间,导致通信错误。建议在原型阶段使用4.7kΩ电阻,并根据示波器测量结果微调。

2.2 起始条件与停止条件

I2C总线的数据传输由主设备控制,每次通信以起始条件(START)开始,以停止条件(STOP)结束。这两个条件是总线上的特殊信号序列,用于同步所有设备的状态机。

条件 信号序列 时序要求 作用
起始条件 (S) SCL为高电平时,SDA从高电平切换到低电平 tHD;STA ≥ 4.0 μs (标准模式) 宣告总线占用,启动一次传输
停止条件 (P) SCL为高电平时,SDA从低电平切换到高电平 tSU;STO ≥ 4.0 μs (标准模式) 释放总线,结束本次传输
重复起始条件 (Sr) 在未发送停止条件前,再次产生起始条件 与起始条件时序相同 用于改变传输方向或切换从机地址

下图展示了起始条件与停止条件在总线上的波形变化,注意SCL与SDA的切换关系。

起始条件与停止条件时序 SCL SDA 起始条件 SDA↓ while SCL=H 停止条件 SDA↑ while SCL=H 数据传输区域(SCL低电平切换SDA)
常见错误:在从机驱动开发中,如果从机未能正确检测到起始条件,会导致状态机失步,后续所有字节解析都会错位。S32K3的LPI2C外设内置起始/停止条件检测逻辑,但在中断服务程序中仍需检查状态标志位以确认条件类型。

2.3 数据有效性与时序要求

I2C协议规定,数据在SCL时钟的配合下逐位传输。每个数据字节长度为8位,高位(MSB)在前。数据有效性遵循以下规则:

  • 数据稳定:在SCL高电平期间,SDA上的数据必须保持稳定,不能发生变化。
  • 数据切换:在SCL低电平期间,SDA允许切换电平,准备下一个数据位。
  • 字节格式:每个字节后必须跟随一个应答位(ACK/NACK),由接收方控制。

下表列出了标准模式(100kHz)和快速模式(400kHz)下的关键时序参数,这些参数直接影响S32K3的LPI2C时钟分频配置。

参数 符号 标准模式 (100kHz) 快速模式 (400kHz) 说明
SCL时钟频率 fSCL 100 kHz 400 kHz 总线时钟频率
SCL低电平时间 tLOW ≥ 4.7 μs ≥ 1.3 μs 决定时钟占空比
SCL高电平时间 tHIGH ≥ 4.0 μs ≥ 0.6 μs 数据采样窗口
数据建立时间 tSU;DAT ≥ 250 ns ≥ 100 ns SDA在SCL上升沿前需稳定
数据保持时间 tHD;DAT ≥ 0 ns ≥ 0 ns SDA在SCL下降沿后保持

下图以8位数据传输为例,展示数据位在SCL时钟下的采样窗口与切换时机。

数据有效性:SCL高电平采样,低电平切换 SCL SDA D7 D6 D5 D4 D3 D2 D1 D0 ↑ 采样点:SCL上升沿锁存SDA ↓ 切换点:SCL低电平期间更新SDA

2.4 应答机制(ACK/NACK)

应答机制是I2C协议保证数据完整性的核心。每传输完一个字节(8位),接收方必须在第9个SCL时钟周期内拉低SDA(ACK)或保持高电平(NACK),以告知发送方数据是否成功接收。

应答规则:
  • ACK(应答):接收方在第9个时钟周期将SDA拉低,表示“已收到,请继续发送下一字节”。
  • NACK(非应答):接收方在第9个时钟周期保持SDA为高电平,表示“未准备好/传输结束/地址无效”。
  • 主机角色:主机作为发送方时,从机在每字节后给出ACK;主机作为接收方时,主机在最后一个字节后发送NACK以通知从机停止发送。

下图展示了一个完整的数据帧结构,包含从机地址、读写位、数据字节以及应答位。

I2C完整数据帧结构(主机写入从机) S 从机地址 (7位) R/W ACK 数据字节 (8位) ACK 数据字节 (8位) ACK P S: 起始条件 地址段 R/W: 0=写, 1=读 应答位 数据段 P: 停止条件 应答位细节(第9个SCL时钟) • 主机发送完8位数据后释放SDA(输出高阻),在第9个时钟周期采样SDA电平。 • 从机在SCL低电平期间将SDA拉低 → ACK;保持高电平 → NACK。 • 从机驱动中,ACK/NACK的生成由LPI2C硬件自动完成,但需在中断中检查传输错误标志。
S32K3实现要点:在LPI2C从机模式下,应答位的生成由外设的I2C_CFG寄存器中的ACKCTL位控制。当从机接收数据时,硬件自动发送ACK;若从机需要拒绝后续数据(如接收缓冲区已满),可在中断中设置NACK标志。务必在初始化阶段配置LPI2C_CFG1的IGNACK位,以决定是否忽略从机NACK。

2.5 本章小结