关于I2C通信的通信逻辑

环境:主节点通过I2C总线发出一个8bit数据,从节点没有响应,即主节点得到NACK。
问题:之后,主节点是否需要发送STOP条件(以结束此次通信)?

看实际应用场景受影响不呗。 按照协议规定走

  • 这篇博客: 模拟I2C/IIC协议中的 2.主机发送NACK 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 当主机接收完数据,不再打算接收数据,需要回应从机不再发送数据,因此需要主动发送NACK。

    1. 拉低时钟,SCL = 0
    2. SDA输出模式(准备产生SDA信号)
    3. SDA = 1 (应答ACK)
    4. 拉高时钟,SCL =1 ,发送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();
    }
    

    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    当主节点发送8bit数据时,如果从节点没有响应,导致主节点收到NACK,主节点需要发送STOP条件以结束通信。具体步骤如下:

    1. 在主节点发送完最后一个字节数据(第8位)后,主节点需要进入接收从节点响应的状态,即将SDA线设置为输入状态,用于接收从节点发回来的ACK(SDA=0)或者NACK(SDA=1)信号。

    2. 主节点等待一定的时间,用于等待从节点发回来的响应信号稳定,一般需要等待几个时钟周期。

    3. 如果SDA被拉低,则说明从节点接收到了主节点的数据,并产生了ACK响应,主节点可以继续发送下一个字节的数据;如果SDA被拉高,则说明从节点没有接收到主节点的数据,或者接收出错,从节点产生了NACK响应,主节点需要发送STOP条件以结束通信。

    4. 发送STOP条件需要先将SCL线拉高,再将SDA线由低电平拉高,然后等待一定的时间,一般需要等待几个时钟周期。

    具体的代码实现可以参考以上参考资料,根据具体的硬件平台和编程语言进行相应的调整。