I2C的ACK和NACK使用场景总结

1. ACK

    由接收方(主或从)发送,表示已经成功接收到地址或数据,它在第9个时钟脉冲期间拉低SDA。

主机写操作:

1. 主机发送带有写命令的从机地址,从机收到后会发送ACK给主机,表明已收到该地址;

2. 主机发送待写入的数据地址,从机收到后会发送ACK给主机,表明已收到该地址;

3. 主机发送数据,从机在收到每个字节之后会发送ACK给主机,表明从机已收到该字节数据,同时还可以接收更多的数据(接收方buffer未满);

主机读操作:

1. 主机发送带有读命令的从机地址,从机收到后会发送ACK给主机,表明已收到该地址;

2. 主机发送待读取的数据地址,从机收到后会发送ACK给主机,表明已准备好发送数据给主机;

3. 从机发送数据,主机在收到每个字节之后会发送ACK给从机,表明主机已收到该字节数据,还要继续读取后续数据。

2. NACK

    由接收方(主或从)发送,表示没有成功接收到地址或不想接收更多数据,SDA在第9个时钟脉冲期间保持高电平。

主机写操作:

1. 主机发送带有写命令的从机地址,与总线上任何从机地址不同,将没有从机回复ACK,那么SDA在第9个时钟脉冲期间会保持高电平,相当于NACK;

2. 主机发送待写入的数据地址,从机收到后发现该地址不属于它的有效地址,则会返回NACK给主机,表明无效的数据地址;

3. 当主机向从机写数据时,从机收到该字节数据后,不想接收更多数据时会向主机发送NACK(接收方buffer已满);

主机读操作:

1. 主机发送带有读命令的从机地址,与总线上任何从机地址不同,将没有从机回复ACK,那么SDA在第9个时钟脉冲期间会保持高电平,相当于NACK;

2. 主机发送待读取的数据地址,从机收到后发现该地址不属于它的有效地址,则会返回NACK给主机,表明无效的数据地址;

3. 当主机从从机读取数据时,主机在读到最后一个字节后发送一个NACK给从机,通知从机主机不再需要更多的数据,这通常发生在主机发出STOP条件以结束通信之前。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容