2. I2C协议详解:起始条件、停止条件、数据有效性、字节格式、应答机制(ACK/NACK)

I2C(Inter-Integrated Circuit)总线协议由Philips(现NXP)公司开发,是一种同步、多主从、串行通信总线。在VxWorks驱动开发中,理解I2C协议的底层时序是正确配置控制器寄存器、诊断总线故障的基础。本节将逐一拆解I2C协议的核心要素:起始条件、停止条件、数据有效性、字节格式以及应答机制。

2.1 起始条件(START Condition)与停止条件(STOP Condition)

I2C总线在空闲状态时,SCL(时钟线)和SDA(数据线)均为高电平(由上拉电阻拉高)。所有通信事务由主设备发起,以起始条件开始,以停止条件结束。

  • 起始条件(S): 当SCL为高电平时,SDA从高电平切换到低电平。此信号表示总线从空闲状态进入忙碌状态,所有从设备必须监听后续的地址。
  • 停止条件(P): 当SCL为高电平时,SDA从低电平切换到高电平。此信号表示当前传输结束,总线恢复空闲状态。
调试要点: 在VxWorks中,若I2C控制器寄存器配置不当(如时钟极性、保持时间),可能导致起始/停止条件时序违规。示波器抓取SCL/SDA波形时,应重点检查SCL高电平期间SDA的跳变是否干净,是否存在毛刺。
I2C 起始条件与停止条件时序 I2C 起始条件 (S) 与 停止条件 (P) 时序 SCL S SDA↓ while SCL=H P SDA↑ while SCL=H 总线空闲 (SDA=H, SCL=H) 总线空闲

2.2 数据有效性(Data Validity)

I2C协议规定,数据线SDA上的电平必须在时钟线SCL为高电平时保持稳定。只有在SCL为低电平时,SDA才允许发生电平变化(起始条件和停止条件除外)。

  • 数据采样: 接收方在SCL的上升沿或高电平期间采样SDA数据。
  • 数据变化: 发送方必须在SCL为低电平时更新SDA数据,以确保在SCL高电平时数据稳定。
VxWorks驱动提示: 在配置I2C控制器的时序参数(如SCL高低电平宽度、数据建立时间tSU:DAT、数据保持时间tHD:DAT)时,必须参考从设备数据手册。若建立时间不足,可能导致从设备采样到错误数据;若保持时间过长,可能影响下一字节的传输。
I2C 数据有效性 数据有效性:SCL高电平时SDA必须稳定 SCL 数据变化 数据变化 数据变化 数据变化 数据变化 数据稳定 数据稳定 数据稳定 数据稳定

2.3 字节格式与帧结构

I2C总线上的数据传输以字节(8位)为单位,高位(MSB)在前。每个字节后必须跟随一个应答位(ACK/NACK)。完整的I2C通信帧包含以下部分:

帧段 位数 说明
起始条件 (S) 1 SCL高电平时SDA下降沿
从设备地址 7 或 10 7位地址模式最常用,高位在前
读/写位 (R/W) 1 0 = 写,1 = 读
应答位 (ACK) 1 从设备拉低SDA表示应答
数据字节 (Data) 8 × N 每个字节后跟一个应答位
停止条件 (P) 1 SCL高电平时SDA上升沿
常见故障: 在VxWorks驱动调试中,若从设备地址错误或总线存在噪声,主设备发送地址后可能收不到ACK(即SDA保持高电平)。此时驱动应重试或报错,避免总线挂死。
I2C 完整帧结构 I2C 帧结构(7位地址模式) S 从设备地址 (7 bits) R/W ACK 数据字节 (8 bits) ACK P 主设备发送地址 + R/W 后,从设备在第9个SCL周期拉低SDA作为应答 (ACK) 若从设备未应答 (NACK),SDA保持高电平,主设备应发送停止条件终止传输 1 bit 7 bits 1 bit 1 bit 8 bits 1 bit 1 bit

2.4 应答机制(ACK/NACK)

应答机制是I2C协议保证数据完整性的核心。每个字节传输完成后,接收方必须在第9个SCL周期内输出应答信号。

  • ACK(应答): 接收方在第9个SCL周期将SDA拉低,表示“已收到数据,请继续发送”。
  • NACK(非应答): 接收方在第9个SCL周期保持SDA为高电平,表示“未准备好接收”或“传输结束”。
VxWorks驱动中的NACK处理: 当主设备作为接收方(读操作)时,在读取最后一个字节后应发送NACK,以通知从设备停止发送。若驱动未正确配置此行为,从设备可能继续发送数据,导致总线冲突。
ACK 与 NACK 时序 应答机制:ACK vs NACK SCL ACK (SDA=L) NACK:在第9个SCL周期,SDA保持高电平 1 2 ... 8 9 (ACK)

2.5 协议时序参数总结

下表列出了I2C标准模式(100 kHz)和快速模式(400 kHz)的关键时序参数。VxWorks驱动中,I2C控制器寄存器(如时钟分频、上升时间补偿)需根据这些参数计算。

参数 符号 标准模式 (100 kHz) 快速模式 (400 kHz) 说明
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 SCL低电平后SDA保持时间
上升时间 tr ≤ 1000 ns ≤ 300 ns 受总线电容影响
下降时间 tf ≤ 300 ns ≤ 300 ns 受开漏输出驱动能力影响
VxWorks配置建议: 在BSP(板级支持包)中初始化I2C控制器时,建议先使用标准模式(100 kHz)验证硬件连接和从设备通信,待稳定后再切换至快速模式。若总线长度较长或从设备数量较多,应适当降低时钟频率或增加上升时间补偿。
I2C 时序参数关系 I2C 时序参数关系 tLOW tHIGH tf tr tSU:DAT tHD:DAT