我最近的项目需要使用具有多个从站的单个主站来使用 i2c 通信。我知道对于主机发送的每个数据字节(实际数据),从机以 Nack\Ack(1,0) 响应。
我很困惑如何解释这个 Nack 和 ACK。我在网上搜索,但我没有清楚地了解这一点。我的理解是这样的。
ACK-我已成功接收数据。给我发送更多数据。
NACK- 我还没有收到数据。再次发送。
这是这样的还是我错了。
请澄清并提出正确答案。
谢谢
阿米特·库马尔
最佳答案
您确实应该阅读 I2C 规范 here ,但简而言之,ACK/NACK 有两种不同的情况需要考虑:
也可能是接收方有错误可以发送NACK;我不记得规范是否允许这样做。
但最重要的是,NACK 要么表示无法重试的致命情况,要么只是表示传输结束。
顺便说一句,接收设备需要更多时间来处理的情况从不由 NACK 指示。相反,从设备要么执行“时钟延长”(或主设备只是延迟生成时钟),要么使用更高层的协议(protocol)来请求重试。
2019 年 6 月 8 日编辑:正如@DavidLedger 所指出的,有些 I2C 闪存设备使用 NACK 来指示闪存内部繁忙(例如完成写操作)。我回到 I2C 标准(见上文),发现以下内容:
因此,这些 NACK 条件根据标准是有效的。
短延迟,特别是在单个操作中,通常会使用时钟延长,但较长的延迟,尤其是在操作之间,以及无效操作,我会产生 NACK。
关于i2c - I2c 总线上的 NACK 和 ACK 响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37040696/