Arduino I2C从发射机NACK(又名变长应答)

Arduino I2C从发射机NACK(又名变长应答),arduino,i2c,atmega,slave,Arduino,I2c,Atmega,Slave,I2C从机向主机传输时是否允许NACK 从规范(2.1)来看,从机在传输数据(即从机向主机发送数据)时,似乎无法实际向主机发送NACK。 我搜遍了网,在这里找不到任何帮助 为什么??我正在AVR Atmega8中实现一个I2C主设备。我想涵盖所有用例。我有一个用户注意到,当I2C从设备在SLA+R模式下发送NACK时,主设备会忽略它 据我所知,启动SLA+R的主设备是唯一允许NACK数据包的一方。从机必须在主时钟上继续发送数据包。 然而,Arduino wire库中的一个片段暗示从机可以向主机发

I2C从机向主机传输时是否允许NACK

从规范(2.1)来看,从机在传输数据(即从机向主机发送数据)时,似乎无法实际向主机发送NACK。 我搜遍了网,在这里找不到任何帮助

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

据我所知,启动SLA+R的主设备是唯一允许NACK数据包的一方。从机必须在主时钟上继续发送数据包。 然而,Arduino wire库中的一个片段暗示从机可以向主机发送NACK。

  • 如果从机想要发送2个数据包,但是 3小时的母钟
  • 从机能否在从机发射机模式下发送NACK
  • 是否有其他方式向主机指示没有更多数据

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

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

  • 没有

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


  • 请注意,使用任何高级协议都需要将确定消息长度的逻辑嵌入到主I2C函数中。这意味着,最常用的例程,如read(adr、buffer、size),它发出start、read然后stop,不能使用,因为它们读取的字节数正好是“size”。

    。超级明星!我真的很感谢有时间来记录这一点