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位地址。
设计提示:在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的切换关系。
常见错误:在从机驱动开发中,如果从机未能正确检测到起始条件,会导致状态机失步,后续所有字节解析都会错位。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时钟下的采样窗口与切换时机。
2.4 应答机制(ACK/NACK)
应答机制是I2C协议保证数据完整性的核心。每传输完一个字节(8位),接收方必须在第9个SCL时钟周期内拉低SDA(ACK)或保持高电平(NACK),以告知发送方数据是否成功接收。
应答规则:
- ACK(应答):接收方在第9个时钟周期将SDA拉低,表示“已收到,请继续发送下一字节”。
- NACK(非应答):接收方在第9个时钟周期保持SDA为高电平,表示“未准备好/传输结束/地址无效”。
- 主机角色:主机作为发送方时,从机在每字节后给出ACK;主机作为接收方时,主机在最后一个字节后发送NACK以通知从机停止发送。
下图展示了一个完整的数据帧结构,包含从机地址、读写位、数据字节以及应答位。
S32K3实现要点:在LPI2C从机模式下,应答位的生成由外设的
I2C_CFG寄存器中的ACKCTL位控制。当从机接收数据时,硬件自动发送ACK;若从机需要拒绝后续数据(如接收缓冲区已满),可在中断中设置NACK标志。务必在初始化阶段配置LPI2C_CFG1的IGNACK位,以决定是否忽略从机NACK。