发送到允许NACK的主设备时是I2C从设备吗?
从规范(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
答案 0 :(得分:4)
你是对的,奴隶无法发送NACK。 I2C旨在制造廉价的从设备,并将尽可能多的/所有逻辑放入主设备中。因此,在大多数情况下,master应该知道数据包将持续多长时间。如果数据确实是可变的,则必须创建更高级别的协议,并将数据包长度作为标头的一部分进行传输。例如。 DDC在第3个字节中传输数据包大小,主服务器应使用此信息。
依赖于实施并且大部分未确定。后续字节可以是最后一个有效字节的副本,例如,常数值。 FF,或其他任何内容。
没有
正如我之前所说,更高级别的协议。例如。 a)简单的单一尺寸消息,最大256个有效负载:开始 - 地址 - 大小 - 字节... - 停止 b)多个子包,无限有效载荷:开始 - 地址 - 大小 - 字节... - 大小 - 字节... - 停止
请注意,使用任何更高级别的协议都需要将用于确定消息长度的逻辑嵌入到主器件I2C功能中。这意味着不能使用最常见的例如read(adr,buffer,size)的例程,这些例程发出start,read然后stop,因为它们准确读取" size"字节数。