假设一个从设备或主设备在 I2C 总线上向接收器发送多个字节,并且事先没有定义字节数。那么发送者如何告诉接收者它没有更多数据要发送呢?
到目前为止,我的理解是,对于发送方是主设备的情况,它会发送一个 NACK 来告诉从设备(接收方)没有更多数据要发送。在发送 NACK 之后,它会发送 STOP 条件以完成会话。
但是我想知道当从属设备是发送方而主设备是接收方并且只有从设备(发送方)知道什么时候没有更多数据要发送给接收方时,主设备和从设备之间的握手是如何发生的?
假设一个从设备或主设备在 I2C 总线上向接收器发送多个字节,并且事先没有定义字节数。那么发送者如何告诉接收者它没有更多数据要发送呢?
到目前为止,我的理解是,对于发送方是主设备的情况,它会发送一个 NACK 来告诉从设备(接收方)没有更多数据要发送。在发送 NACK 之后,它会发送 STOP 条件以完成会话。
但是我想知道当从属设备是发送方而主设备是接收方并且只有从设备(发送方)知道什么时候没有更多数据要发送给接收方时,主设备和从设备之间的握手是如何发生的?
但是我想知道当从属设备是发送方而主设备是接收方并且只有从设备(发送方)知道什么时候没有更多数据要发送给接收方时,主设备和从设备之间的握手是如何发生的?
这不应该发生。i2c 是一个非常明确的协议,每个从设备都应该为每个主设备所知。通常,主机请求从机发送,消息大小是固定的,消息是连续的,或者消息包含将发送的字节数。
主机写入一个寄存器地址,然后主机切换到读取,从机发送一个字节。这就是主人想要的,停止。
主机写入一个寄存器地址,然后主机切换到读取,从机发送一个字节,然后主机再次读取,因此从机发送下一个字节(或相同字节)。主人任意地读取它想要多少,然后发送停止。
主机写入一个寄存器地址,然后主机切换到读取,从机发送一个字节。该字节告诉主机该寄存器应该有多少字节。主读取和从发送那么多,然后主停止。
所有通信都由主控。奴隶不会做主人不想做的事。主控控制时钟的速度(不能承受时钟拉伸)和读取的字节数。当主机没有告诉它时,从机在任何时候都不应尝试强制数据线。数据结构应该事先知道。
这是两个选项。
如果从机接收器不接受更多数据,它可以 NAK 字节,但主机仍负责发送停止条件。
对于从发送器,它不能发出任何停止信号,它必须事先知道,或者它可以编码在数据中,例如文本字符串以零终止,因此从发送器可以发送零,直到主停止。
通常,这种情况很少见,并且有一个已知的协议,因此主机必须始终事先知道它将在单个事务中读取或写入多少字节,即使这意味着首先在设备之间传输固定大小的标头要传输多少。
假设一个从设备或主设备在 I2C 总线上向接收器发送多个字节,并且事先没有定义字节数。那么发送者如何告诉接收者它没有更多数据要发送呢?
如果 Master 是发送者,那么他知道必须发送多少字节。主机将在发送最后一个字节后发送一个 STOP 条件来表示他的数据传输结束,并终止事务。
请注意,Master 可以随时执行此操作。从机可以发送 NACK 表示它不想再接收数据。但只有 Master 决定是否停止此交易。
但是我想知道当从属设备是发送方而主设备是接收方并且只有从设备(发送方)知道什么时候没有更多数据要发送给接收方时,主设备和从设备之间的握手是如何发生的?
如果 Slave 是发送者,Master 应该事先知道必须接收多少字节。主机将在接收到最后一个字节后发送一个 NACK 信号,这样从机将不再驱动 SDA 线。Master 现在可以启动一个 STOP 条件并终止事务。
我会一点一点地消化你的整个帖子......
假设一个从设备或主设备在 I2C 总线上向接收器发送多个字节,并且事先没有定义字节数。
但它应该被定义。如果发送或接收随机信息,您将永远无法解释它。
那么发送者如何告诉接收者它没有更多数据要发送呢?
制造商确定它需要从从机接收多少位。主控通常由一些逻辑设备(如微控制器、CPU 等)编写。
到目前为止,我的理解是,对于发送方是主设备的情况,它会发送一个 NACK 来告诉从设备(接收方)没有更多数据要发送。
不,不完全正确。当主机在向从机发送该位后没有从从机“听到”任何反馈时,就会发生“NACK”。就像打电话说:“你好,你在吗?”
但是我想知道当从属设备是发送方而主设备是接收方并且只有从设备(发送方)知道什么时候没有更多数据要发送给接收方时,主设备和从设备之间的握手是如何发生的?
您对发送者和接收者的定义是有偏差的。主机和从机都充当发送者和接收者。主机既可以发送也可以接收,这分别取决于写入或读取操作。
有用的建议:考虑阅读任何 I2C 从数据表。查找关键字“消息”。这是主机发送给从机的信息。
图片来自这里……不是我的照片。
主机应该被编程为读取与从机相同长度的地址帧,这由从机的数据表定义。您也可以设置从站的地址,但通常不会太多。如果两个从站共享相同的地址,这将有助于解决冲突。
这是我最近实际使用的一个部件示例,它是 ADM1276 热插拔控制器。它遵守 PMBUS 规范,但 I2C 拓扑仍然适用。当您发送、接收、读取和写入字节时,它会告诉您主机和从机的交互。