I2C 从发送器 NACK(又名可变长度回复)

gin*_*nge 2 atmega arduino i2c slave

传输到主机时,I2C 从机是否允许 NACK?

从规范 (2.1) 看来,从机实际上无法在传输时向主机发送 NACK,即将数据从从机发送到主机。我已经在网上搜索过,但在这里找不到任何帮助。

为什么?我正在 AVR Atmega8 中实现一个 I2C 主设备。我想涵盖所有用例。我有一个用户注意到,当 I2C 从设备在 SLA+R 模式下发送 NACK 时,主设备会忽略它。

据我所知,发起 SLA+R 的主设备是唯一允许 NACK 数据包的一方。从设备必须继续在主时钟上发送数据包。但是,Arduino 线库中的一个片段暗示从设备可以向主设备发送 NACK。 https://github.com/arduino/Arduino/blob/master/libraries/Wire/utility/twi.c#L503

  1. 如果从站要发送 2 个数据包,但主站时钟为 3 个,会发生什么
  2. 从机可以在从机发送器模式下发送 NACK 吗?
  3. 有没有其他方法可以向主人表明没有更多数据?

mik*_*jov 5

你是对的,从机没有办法发送 NACK。I2C 旨在制造廉价的从设备,并将尽可能多的/所有逻辑放入主设备。因此,在大多数情况下,master 应该知道数据包的长度。如果数据确实是可变的,则必须创建更高级别的协议,并将数据包长度作为报头的一部分进行传输。例如,DDC 在第 3 个字节中传输数据包大小,主机应使用此信息。

  1. 依赖于实现并且大多未确定。后续字节可能是最后一个有效字节的副本、常量值(例如 FF)或其他任何内容。

  2. 不。

  3. 正如我之前所说,更高级别的协议。例如 a) 简单的单一大小消息,最大 256 个有效负载:开始 - 地址 - 大小 - 字节... - 停止 b) 多个子数据包,无限有效负载:开始 - 地址 - 大小 - 字节... - 大小 - 字节... 。 - 停止

请注意,使用任何更高级别的协议都需要将用于确定消息长度的逻辑嵌入到主设备 I2C 功能中。这意味着不能使用最常用的例程,例如 read(adr, buffer, size),它们发出开始、读取然后停止的命令,因为它们读取的字节数正好是“大小”。