环境:主节点通过I2C总线发出一个8bit数据,从节点没有响应,即主节点得到NACK。
问题:之后,主节点是否需要发送STOP条件(以结束此次通信)?
看实际应用场景受影响不呗。 按照协议规定走
当主机接收完数据,不再打算接收数据,需要回应从机不再发送数据,因此需要主动发送NACK。
/**
* 主机接收从机数据,回应从机NOACK
* SCL 高电平
* SDA输出模式(SDA 高无效,低有效)
**/
void IIC_NACK()
{
/* 先拉低时钟,SDA输出模式 */
SCL(0);
SDA_OUT();
/* 准备ACK 拉高SDA */
SDA(1);
IIC_delay_us();
/* 拉高时钟 */
SCL(1);
IIC_delay_us();
/* 再拉低时钟,结束第九脉冲 */
SCL(0);
IIC_delay_us();
}
当主节点发送8bit数据时,如果从节点没有响应,导致主节点收到NACK,主节点需要发送STOP条件以结束通信。具体步骤如下:
在主节点发送完最后一个字节数据(第8位)后,主节点需要进入接收从节点响应的状态,即将SDA线设置为输入状态,用于接收从节点发回来的ACK(SDA=0)或者NACK(SDA=1)信号。
主节点等待一定的时间,用于等待从节点发回来的响应信号稳定,一般需要等待几个时钟周期。
如果SDA被拉低,则说明从节点接收到了主节点的数据,并产生了ACK响应,主节点可以继续发送下一个字节的数据;如果SDA被拉高,则说明从节点没有接收到主节点的数据,或者接收出错,从节点产生了NACK响应,主节点需要发送STOP条件以结束通信。
发送STOP条件需要先将SCL线拉高,再将SDA线由低电平拉高,然后等待一定的时间,一般需要等待几个时钟周期。
具体的代码实现可以参考以上参考资料,根据具体的硬件平台和编程语言进行相应的调整。