2. I2C协议详解:起始条件、停止条件、数据有效性、字节格式与应答机制(ACK/NACK)
I2C总线协议的核心在于其精确定义的时序与信号组合。理解起始条件、停止条件、数据有效性、字节格式以及应答机制,是进行XMC系列微控制器I2C通信故障排查的理论基础。本节将逐一拆解这些关键要素,并结合XMC的硬件特性进行说明。
2.1 起始条件(S)与停止条件(P)
I2C总线在空闲时,SCL(时钟线)和SDA(数据线)均为高电平(由上拉电阻拉高)。总线上的任何通信事务都必须以起始条件开始,并以停止条件结束。这两个条件是主设备(Master)独有的控制信号,从设备(Slave)不得主动产生。
| 条件 | 信号定义 | 时序要求 | XMC排查要点 |
|---|---|---|---|
| 起始条件 (S) | SCL为高电平时,SDA从高电平切换到低电平 | SCL高电平期间,SDA下降沿必须稳定;建立时间(tSU;STA)≥ 4.7μs(标准模式) | 检查主设备是否在SCL高电平期间错误地拉低SDA;示波器观察SDA下降沿是否发生在SCL高电平区间 |
| 停止条件 (P) | SCL为高电平时,SDA从低电平切换到高电平 | SCL高电平期间,SDA上升沿必须稳定;保持时间(tHD;STO)≥ 4.0μs(标准模式) | 检查停止条件后总线是否释放(SDA、SCL均为高);若SDA被从设备拉低,则可能产生“总线锁死” |
实训提示: 在XMC开发板上,使用逻辑分析仪捕获I2C波形时,应首先定位起始条件和停止条件。若波形中缺少起始条件,或停止条件后SDA未回到高电平,则通信无法正常启动或结束,这是最常见的硬件级故障之一。
2.2 数据有效性
I2C协议规定,在SCL时钟的高电平期间,SDA上的数据电平必须保持稳定。只有在SCL为低电平时,SDA上的数据才允许发生变化。这一规则确保了数据在采样时刻的确定性。
- 数据稳定窗口: SCL高电平期间,SDA不能跳变(起始/停止条件除外)。
- 数据变化窗口: SCL低电平期间,SDA可以自由变化,用于准备下一个数据位。
- XMC故障关联: 若XMC的I2C外设检测到SCL高电平时SDA发生非预期的跳变,会触发协议错误中断(如USIC模块的PIRQ)。排查时需检查SCL线上的噪声或主从设备时钟同步问题。
2.3 字节格式与数据传输
I2C总线上的数据以字节(8位)为单位进行传输,且遵循高位先行(MSB First)的规则。每个字节后必须跟随一个应答位(ACK/NACK),因此一个完整的数据帧实际上包含9个SCL时钟周期。
| 位序 | 名称 | 说明 |
|---|---|---|
| Bit 7 (MSB) | 最高有效位 | 首先传输,对于地址字节,此位决定是读(1)还是写(0)操作 |
| Bit 6 ~ Bit 1 | 数据位 | 7位从机地址或8位数据内容 |
| Bit 0 (LSB) | 最低有效位 | 最后传输的数据位 |
| 第9个时钟 | 应答位 (ACK/NACK) | 由接收方控制SDA,低电平为ACK,高电平为NACK |
字节传输流程:
- 主设备产生起始条件。
- 主设备发送8位数据(地址+读写位),高位先行。
- 主设备释放SDA,并在第9个时钟周期采样SDA电平。
- 若SDA为低(ACK),则继续传输下一个字节;若为高(NACK),则主设备可产生停止条件或重复起始条件。
2.4 应答机制(ACK/NACK)
应答机制是I2C协议实现可靠通信的核心。每个字节传输完成后,接收设备必须通过拉低SDA(ACK)或保持SDA高电平(NACK)来告知发送方是否成功接收数据。
- ACK(应答): 接收方在第9个时钟周期将SDA拉低。表示“已收到,请继续发送”。
- NACK(非应答): 接收方在第9个时钟周期保持SDA为高电平。表示“未准备好/无法接收/传输结束”。
NACK的典型场景与XMC故障排查:
| NACK场景 | 产生原因 | XMC排查方法 |
|---|---|---|
| 地址NACK | 总线上不存在该地址的从设备,或从设备忙 | 检查XMC的I2C地址配置(USIC模块的SLAVE_ADDR寄存器);使用示波器确认地址字节是否被正确发送 |
| 数据NACK | 从设备无法处理接收到的数据(如写满缓冲区) | 检查从设备的数据手册,确认其最大写入速率;在XMC中增加发送间隔或检查中断标志 |
| 读操作NACK | 主设备在读取最后一个字节后发送NACK以通知从设备停止发送 | 这是正常行为,但需确认XMC的I2C控制逻辑是否在读取最后字节后正确配置了NACK |
2.5 组合格式:一次完整的读写事务
结合上述所有元素,一次典型的I2C写事务格式为:S + 从机地址(写) + ACK + 数据字节1 + ACK + ... + 数据字节N + ACK + P。读事务则需要在地址字节后附加一个重复起始条件(Sr)和读地址。
常见故障模式: 在XMC项目中,若从设备返回NACK,主设备(XMC)通常会重试或报错。排查时,应重点检查:
- 从设备地址是否正确(7位或10位地址模式)。
- 从设备是否已上电并完成初始化。
- 总线电容是否过大,导致SCL/SDA上升沿变缓,影响时序采样。