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的跳变是否干净,是否存在毛刺。
2.2 数据有效性(Data Validity)
I2C协议规定,数据线SDA上的电平必须在时钟线SCL为高电平时保持稳定。只有在SCL为低电平时,SDA才允许发生电平变化(起始条件和停止条件除外)。
- 数据采样: 接收方在SCL的上升沿或高电平期间采样SDA数据。
- 数据变化: 发送方必须在SCL为低电平时更新SDA数据,以确保在SCL高电平时数据稳定。
VxWorks驱动提示: 在配置I2C控制器的时序参数(如SCL高低电平宽度、数据建立时间tSU:DAT、数据保持时间tHD:DAT)时,必须参考从设备数据手册。若建立时间不足,可能导致从设备采样到错误数据;若保持时间过长,可能影响下一字节的传输。
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保持高电平)。此时驱动应重试或报错,避免总线挂死。
2.4 应答机制(ACK/NACK)
应答机制是I2C协议保证数据完整性的核心。每个字节传输完成后,接收方必须在第9个SCL周期内输出应答信号。
- ACK(应答): 接收方在第9个SCL周期将SDA拉低,表示“已收到数据,请继续发送”。
- NACK(非应答): 接收方在第9个SCL周期保持SDA为高电平,表示“未准备好接收”或“传输结束”。
VxWorks驱动中的NACK处理: 当主设备作为接收方(读操作)时,在读取最后一个字节后应发送NACK,以通知从设备停止发送。若驱动未正确配置此行为,从设备可能继续发送数据,导致总线冲突。
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)验证硬件连接和从设备通信,待稳定后再切换至快速模式。若总线长度较长或从设备数量较多,应适当降低时钟频率或增加上升时间补偿。