I2c总线上的NACK和ACK响应

时间:2016-05-05 01:13:46

标签: i2c serial-communication communication-protocol

我最近的项目要求使用具有多个从站的单个主站进行i2c通信。我知道,对于主机发送的每个数据字节(实际数据),从机以Nack \ Ack(1,0)响应。 我很困惑这个Nack和ACK是如何被解释的。我搜索了网络,但我没有清楚地了解这一点。我的理解是这样的。

确认 - 我已成功收到数据。发给我更多数据。 NACK-我还没有收到数据。再次发送。 这是这样的事还是我错了。 请澄清并提出正确答案。

由于 阿米特库马尔

2 个答案:

答案 0 :(得分:3)

你真的应该阅读I2C规范here,但是简单地说,有两种不同的情况要考虑ACK / NACK:

  1. 发送从机地址后:当I2C主机发送与机通信的地址(包括读/写位)时,识别其地址的从机发送ACK。这告诉主人它想要到达的从站实际上是在总线上。如果没有从设备识别该地址,则结果为NACK。在这种情况下,主服务器必须中止请求,因为没有人可以与之通信。这通常不能通过重试来解决。

  2. 在传输中:在读取一个字节(发送器上的接收器或从器件上的主器件)接收到一个字节后,它必须发送一个ACK。主要的例外是如果接收器控制发送的字节数,它必须在要发送的最后一个字节之后发送NACK。例如,在从主设备传输时,主设备必须在发送STOP条件之前发送NACK以结束传输。 (这是规范要求的。)

  3. 如果出现错误,接收器也可以发送NACK;我不记得规范是否允许这样做。

    但最重要的是,NACK要么表示无法重试的致命状况,要么仅表示转移已结束。

    BTW,接收设备需要更多时间来处理的情况永远不会被NACK指示。相反,从设备要么“时钟延长”(或者主设备只是延迟生成时钟),要么使用更高层协议来请求重试。

答案 1 :(得分:0)

I2C 协议以起始位开始,后跟从地址(7 位地址 + 1 位用于读/写)。 发送从机地址后,主机释放数据总线(SDA线),将线置于高阻状态,留给从机驱动。

如果地址与从机地址匹配,则从机将线路拉低以获取 ACK。 如果线路没有被任何从机拉低,则主机将其视为 NACK,并在下一个时钟脉冲中发送停止位或重复起始位以终止或重新开始通信。

除此之外,每当接收器无法通信或理解数据时,也会发送 NACK。

NACK 也被主机(接收器)用来在所有数据后跟停止位后终止读取流。