“假读“操作在I2C接收流程中的原因
在I2C接收流程中,"假读"操作是NXP I2C控制器工作特性要求的必要操作,具体原因如下:
// 接收函数关键代码
void i2c_master_read(I2C_Type *base, unsigned char *buf, unsigned int size)
{// ...dummy = base->I2DR; /* 假读 */
}
假读的必要性
-
启动接收时钟
NXP I2C控制器在接收模式下,必须通过读取I2DR寄存器来触发SCL时钟生成。第一次读取不会获取有效数据,但会启动总线时钟。 -
清除传输完成标志
写入接收模式后,IIF标志位(I2SR[1])可能处于置位状态。通过假读可以清除该标志,确保后续状态检测的准确性。 -
协议时序要求
I2C协议规定主机接收第一个数据字节前需要发送ACK/NACK。假读操作对应着第一个ACK周期的完成,为后续真实数据接收建立正确的时序。
操作流程解析
对比发送流程
在i2c_master_write()
中不需要假读,因为发送方向的操作通过写入I2DR寄存器直接触发数据传输。而接收方向需要先通过假读建立时钟同步。