2. I2C协议详解:起始条件、停止条件、数据有效性、字节格式、应答机制(ACK/NACK)
I2C(Inter-Integrated Circuit)总线协议由Philips(现NXP)公司开发,是一种同步、多主从、串行通信总线。在XMC系列微控制器的多主从应用中,理解协议底层时序是排查通信故障的基础。本章将逐一拆解I2C协议的五个核心要素:起始条件、停止条件、数据有效性、字节格式与应答机制。
2.1 起始条件(S)与停止条件(P)
起始条件和停止条件由主控制器产生,用于标记一次传输的开始与结束。在总线空闲时,SCL和SDA均为高电平。
| 条件 | SCL状态 | SDA状态 | 时序描述 |
|---|---|---|---|
| 起始条件(S) | 高电平 | 下降沿(高→低) | SCL为高时,SDA由高变低 |
| 停止条件(P) | 高电平 | 上升沿(低→高) | SCL为高时,SDA由低变高 |
| 重复起始条件(Sr) | 高电平 | 下降沿(高→低) | 在未产生停止条件前,再次产生起始条件 |
工程提示:在XMC多主从系统中,重复起始条件(Sr)常用于在传输过程中改变数据传输方向(例如从写操作切换为读操作),而无需释放总线控制权。这是避免总线冲突的重要技巧。
2.2 数据有效性
I2C协议规定,在SCL时钟的高电平期间,SDA线上的数据必须保持稳定;只有在SCL为低电平时,SDA才允许发生变化。这一规则确保了数据采样的可靠性。
- 数据稳定期:SCL高电平期间,SDA电平不变。
- 数据变化期:SCL低电平期间,SDA可以变化(用于更新下一个数据位)。
- 例外:起始条件和停止条件在SCL高电平时改变SDA,属于协议定义的例外情况。
故障排查要点:在XMC微控制器调试中,若使用逻辑分析仪捕获到SCL高电平时SDA发生跳变(非起始/停止条件),则表明存在数据有效性违规。常见原因包括:从机响应速度过慢、总线电容过大导致信号边沿变缓、或软件中SCL与SDA时序控制不当。
2.3 字节格式与数据传输
I2C总线上的数据以字节(8位)为单位进行传输,每个字节后必须跟随一个应答位(ACK/NACK)。数据传输时,高位(MSB)在前,低位(LSB)在后。
| 位序号 | 名称 | 说明 |
|---|---|---|
| Bit 7 (MSB) | D7 | 最高有效位,最先发送 |
| Bit 6 ~ Bit 1 | D6 ~ D1 | 数据位,依次发送 |
| Bit 0 (LSB) | D0 | 最低有效位,最后发送 |
| 第9个SCL周期 | ACK/NACK | 接收方在第9个SCL周期拉低SDA(ACK)或保持高电平(NACK) |
一个完整的I2C数据帧通常包含:起始条件 + 7位从机地址 + 读/写位 + 应答位 + 数据字节 + 应答位 + ... + 停止条件。
2.4 应答机制(ACK/NACK)
应答机制是I2C协议保证数据可靠传输的核心。每发送一个字节后,发送方释放SDA总线,接收方在第9个SCL周期给出应答信号。
- ACK(应答):接收方在第9个SCL周期将SDA拉低,表示“已收到,请继续发送”。
- NACK(非应答):接收方在第9个SCL周期保持SDA为高电平,表示“未准备好接收”或“传输结束”。
常见故障:在XMC多主从系统中,若主设备发送从机地址后收到NACK,通常原因包括:从机地址错误、从机未上电、从机忙、或总线被其他主机占用导致仲裁失败。排查时应首先使用逻辑分析仪确认地址字节是否正确。
2.5 完整数据传输示例
以下是一个XMC微控制器作为主设备向从设备写入一个字节数据的完整时序示例(7位地址模式):
主设备发送: 起始条件
主设备发送: 从设备地址 (7位) + 写位 (0)
从设备响应: ACK
主设备发送: 数据字节 (8位)
从设备响应: ACK
主设备发送: 停止条件
XMC调试技巧:使用XMC的USIC模块进行I2C通信时,可通过检查协议状态寄存器(PSR)中的ACK/NACK标志位快速判断应答状态。若在发送地址后PSR显示NACK,建议检查从设备地址配置和总线硬件连接。
2.6 多主从通信中的协议注意事项
在多主从系统中,起始条件、停止条件和应答机制需要额外关注:
- 仲裁:当多个主设备同时产生起始条件时,通过SDA线的电平比较进行仲裁,获胜者继续传输,失败者退出。
- 时钟同步:多个主设备通过SCL线的线与特性同步时钟,慢速设备可拉低SCL延长时钟周期(时钟拉伸)。
- NACK与停止条件:接收方发送NACK后,主设备应产生停止条件或重复起始条件,以释放总线。
| 场景 | 主设备行为 | 从设备行为 | 总线状态 |
|---|---|---|---|
| 正常传输 | 产生S,发送地址+数据,产生P | 每字节后回复ACK | 总线受控 |
| 从设备忙 | 发送地址后收到NACK | 回复NACK | 主设备应重试或停止 |
| 多主仲裁 | 检测到SDA与自身输出不一致时退出 | 不参与仲裁 | 获胜主设备继续 |
| 时钟拉伸 | 检测SCL被拉低时等待 | 拉低SCL以延长时钟 | 时钟同步 |