2. I2C协议时序:起始条件、停止条件、数据有效性、字节传输格式、应答与非应答机制
I2C(Inter-Integrated Circuit)总线协议的核心在于其精确的时序控制。理解起始条件、停止条件、数据有效性、字节传输格式以及应答/非应答机制,是掌握I2C通信的基础,也是后续使用XMC微控制器寄存器或HAL库进行驱动开发的前提。本章将逐一拆解这些关键时序要素。
2.1 起始条件(S)与停止条件(P)
I2C总线在空闲时,SCL(时钟线)和SDA(数据线)均为高电平。总线上的任何通信事务都必须以起始条件开始,并以停止条件结束。这两个条件由主设备产生,且是唯一允许SDA在SCL为高电平时发生变化的时刻。
| 条件 | 信号变化顺序 | 说明 |
|---|---|---|
| 起始条件 (S) | SCL = H → SDA = H→L → SCL = L | SCL保持高电平时,SDA从高电平切换到低电平。表示总线从空闲状态进入忙碌状态,开始一次新的传输。 |
| 停止条件 (P) | SCL = H → SDA = L→H → SCL = L | SCL保持高电平时,SDA从低电平切换到高电平。表示本次传输结束,总线恢复空闲状态。 |
关键点:起始条件和停止条件均由主设备产生。在XMC微控制器的I2C外设中,硬件自动处理这些时序,开发者只需通过寄存器或HAL函数发起START或STOP命令。
2.2 数据有效性
I2C协议规定,在数据传输过程中,SDA线上的数据必须在SCL时钟的高电平期间保持稳定。SDA的状态变化只允许在SCL为低电平时发生。这一规则确保了数据的可靠采样。
- 数据稳定期:SCL为高电平时,SDA上的数据必须保持不变。接收方(主或从)在SCL的上升沿或高电平期间采样SDA。
- 数据变化期:SCL为低电平时,SDA允许变化,发送方准备下一个数据位。
设计启示:在XMC微控制器的I2C外设中,硬件自动管理数据建立时间(tSU;DAT)和保持时间(tHD;DAT)。开发者通常无需手动干预,但了解此机制有助于调试因时序不匹配导致的通信故障。
2.3 字节传输格式
I2C总线上的数据以字节(8位)为单位进行传输。每个字节后必须跟随一个应答位(ACK/NACK)。传输时,高位(MSB)在前,低位(LSB)在后。
| 位序 | 位7 (MSB) | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 (LSB) | 应答位 |
|---|---|---|---|---|---|---|---|---|---|
| 内容 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ACK/NACK |
一个完整的字节传输过程包含9个SCL时钟周期:前8个周期用于传输数据位,第9个周期用于应答位。
2.4 应答(ACK)与非应答(NACK)机制
应答机制是I2C协议保证通信可靠性的关键。每传输完一个字节,接收方必须在第9个SCL时钟周期内拉低SDA线(ACK)或保持高电平(NACK),以告知发送方数据是否成功接收。
- 应答(ACK):接收方在第9个时钟周期将SDA拉低。表示“已收到,请继续发送下一个字节”。
- 非应答(NACK):接收方在第9个时钟周期保持SDA为高电平。表示“未成功接收”或“传输结束”。主设备作为接收方时,通常在读取最后一个字节后发送NACK,以通知从设备停止发送。
常见陷阱:在XMC开发中,如果从设备地址错误、从设备忙或总线被占用,主设备可能会收到NACK。此时,主设备应产生停止条件或重复起始条件,而不是继续发送数据。HAL库函数通常会返回超时或错误标志,开发者需要检查这些状态。
2.5 完整数据传输序列
结合以上所有要素,一个典型的I2C写操作序列如下:
- 起始条件 (S):主设备产生起始条件。
- 发送从设备地址:主设备发送7位从设备地址 + 1位读写位(0表示写)。
- 从设备应答 (ACK):匹配地址的从设备在第9个时钟拉低SDA。
- 发送数据字节:主设备发送一个字节的数据(如寄存器地址或数据内容)。
- 从设备应答 (ACK):从设备每接收一个字节后发送ACK。
- 重复步骤4-5:继续发送后续字节。
- 停止条件 (P):主设备产生停止条件,结束通信。
XMC实现提示:在XMC系列微控制器中,I2C外设的硬件状态机自动处理上述序列。例如,在发送地址后,硬件会等待ACK并自动设置状态标志。开发者通过检查状态寄存器(如I2C->STATUS)或HAL库回调函数来确认通信进度。