5

我最近的项目需要使用 i2c 通信,使用单个主设备和多个从设备。我知道,对于主机发送的每个数据字节(实际数据),从机以 Nack\Ack(1,0) 响应。我对如何解释 Nack 和 ACK 感到困惑。我搜索了网络,但我没有得到关于这个的清晰图片。我的理解是这样的。

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

谢谢阿米特库马尔

4

2 回答 2

14

你真的应该在这里阅读 I2C 规范,但简单来说,ACK/NACK 有两种不同的情况需要考虑:

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

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

也可能是接收方有错误可以发送NACK;我不记得规范是否允许这样做。

但最重要的是,NACK 要么表示无法重试的致命情况,要么只是表示传输结束。

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

2019 年 6 月 8 日编辑:正如@DavidLedger 所指出的,有些 I2C 闪存设备使用 NACK 来指示闪存内部繁忙(例如完成写入操作)。我回到 I2C 标准(见上文),发现以下内容:

有五个条件会导致 NACK 的产生:

  1. 总线上不存在带有发送地址的接收器,因此没有设备响应确认。

  2. 接收器无法接收或发送,因为它正在执行某些实时功能并且尚未准备好开始与主站通信。

  3. 在传输过程中,接收方会收到它不理解的数据或命令。

  4. 在传输过程中,接收方不能再接收任何数据字节。

  5. 主接收器必须向从发送器发出传输结束的信号。

因此,这些 NACK 条件根据标准是有效的。

短延迟,特别是在单个操作中通常会使用时钟拉伸,但较长的延迟,特别是操作之间以及无效操作,我会产生 NACK。

于 2016-05-10T06:03:18.950 回答
0

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

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

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

主机(接收器)也使用 NACK 来终止读取流程,一旦它拥有所有数据后跟停止位。

于 2021-02-14T10:16:20.563 回答