2014-10-11 46 views
2

传输到允许NACK的主机时是I2C从机吗?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. 是否有任何其他方式向主人表明没有更多数据?

回答

4

你是对的,奴隶没有办法发送NACK。 I2C旨在制造便宜的从设备,并将尽可能多的/所有的逻辑放入主设备。所以,在大多数情况下,主人应该知道数据包会有多长。如果数据真的是可变的,则必须创建更高级别的协议,并将数据包长度作为标题的一部分进行传输。例如。 DDC在第3个字节传输数据包大小,并且master应该使用这个信息。

  1. 执行依赖性且大多数未确定。后续字节可能是最后一个有效字节的副本,常数值例如FF或其他任何东西。

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

请注意,使用任何更高级别的协议都需要用于确定消息长度的逻辑嵌入到主设备I2C功能中。这意味着大多数通常提供的例程(比如read(adr,buffer,size)),它们读取然后停止,不能使用,因为它们读取的字节数量确实是“大小”。

+1

我很怀疑。超级明星!我真的很感激时间来记录这一点 – ginge 2014-11-06 07:42:27