ami*_* kr 2 serial-communication i2c communication-protocol
我最近的项目要求使用单个主机和多个从机的i2c通信。我知道从主机发送的每个数据字节(实际数据),从机都会响应Nack \ Ack(1,0)。我对如何解释此Nack和ACK感到困惑。我在网上搜索,但没有清楚的图片。我的理解是这样的。
确认-我已成功接收数据。向我发送更多数据。NACK-我尚未收到数据。请重新发送。这是这样还是我错了。请澄清并提出正确答案。
谢谢阿米特·库马尔
您确实应该在这里阅读I2C规范,但是简要地说,对于ACK / NACK,有两种不同的情况需要考虑:
发送从机地址后:当I2C主机发送要与之通信的从机地址(包括读/写位)时,识别其地址的从机将发送ACK。这告诉主机它试图连接的从机实际上在总线上。如果没有从设备识别该地址,则结果为NACK。在这种情况下,主服务器必须中止该请求,因为没有人可以与之交谈。通常,这不能通过重试来解决。
在传输内:读取字节的一侧(接收方的主机或发送方的从机)接收到字节后,必须发送ACK。主要的例外是,如果接收方正在控制发送的字节数,则它必须在要发送的最后一个字节之后发送NACK。例如,在从机到主机的传输中,主机必须在发送STOP条件以结束传输之前发送NACK。(这是规范要求的。)
如果出现错误,接收器也可以发送NACK。我不记得规范是否允许这样做。
但最重要的是,NACK表示无法重试的致命状况,或者仅仅是传输结束的指示。
顺便说一句,NACK从未表示接收设备需要更多时间来处理的情况。相反,从设备要么执行“时钟延长”(或者主设备只是延迟生成时钟),要么使用更高层的协议来请求重试。
编辑6/8/19:@DavidLedger指出,有些I2C闪存设备使用NACK来指示闪存内部繁忙(例如,完成写操作)。我回到I2C标准(见上文),发现以下内容:
导致NACK产生的条件有五个:
总线上没有接收到具有发送地址的接收器,因此没有设备响应应答。
接收器无法执行接收或发送操作,因为它正在执行某些实时功能,并且尚未准备好与主机进行通信。
在传输过程中,接收器会收到不理解的数据或命令。
在传输期间,接收器无法再接收任何数据字节。
主接收器必须向从发送器发信号通知传输结束。
因此,这些NACK条件根据标准是有效的。
较短的延迟(尤其是在单个操作中)通常会使用时钟延长,但是较长的延迟(尤其是在操作之间以及无效操作之间)会产生NACK。