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)常用于在传输过程中改变数据传输方向(例如从写操作切换为读操作),而无需释放总线控制权。这是避免总线冲突的重要技巧。
I2C起始条件与停止条件时序图 I2C 起始条件(S)与停止条件(P)时序 t SCL SDA S P

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,通常原因包括:从机地址错误、从机未上电、从机忙、或总线被其他主机占用导致仲裁失败。排查时应首先使用逻辑分析仪确认地址字节是否正确。
I2C应答机制状态图 I2C 应答机制(ACK / NACK)状态图 发送方 (主设备或从设备) 接收方 (从设备或主设备) 发送8位数据字节 发送方释放SDA总线 接收方判断 ACK(SDA=低) 继续传输 NACK(SDA=高) 停止或重发

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以延长时钟 时钟同步