This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
1) 1)重启只是停止条件之前的重新启动启动启动启动条件。 如果一个停止条件被启动、在整个传输完成前、另一个主器件可以控制总线。
这方面的一个快速示例可能是您写入 IO 扩展器、然后发送从器件地址、再写入(无论它们是高电平还是低电平)到输出寄存器。 您需要使用重新启动条件来保持对总线的控制、以便写入配置寄存器以将端口设置为输出(默认值通常为输入)。 如果您在此事务之间执行了停止条件、 如果总线上有另一个主器件、则新主器件将进行控制、并且您尝试配置的前一个器件将在您希望将其设置为输出时保持输入。
每个启动条件都必须有一个停止条件、但两者之间可以有多个启动(重新启动)条件。
最后需要注意的是、重新启动与停止然后快速启动条件不同、上面的示例应该说明原因。
这并非我们的器件所独有、并在 I2C 标准中进行了指定。 (第3.1.10节)
如果我所说的内容没有意义、可以在此处找到更多内容:
http://dlnware.com/dll/Repeated-START-Sr-Condition
https://www.i2c-bus.org/repeated-start-condition/
2) 2) 这是指在寄存器读取或写入期间发生的自动递增逻辑。 这些寄存器成对设置、例如:输入端口、输出端口、极性反转和配置。 当一个寄存器被读取/写入时、指针将递增到对中的下一个寄存器。 这样做有好处、因为在需要读取或写入两个寄存器对的情况下、它可以减少事务量。
a)例如、如果您想将配置端口设置为输出。 发送从机地址、要写入的寄存器(配置寄存器0)以及要写入该寄存器的数据。 如果不启动停止条件、则可以发送额外的信息字节并写入特定对中的下一个寄存器(在本例中为配置寄存器1)。 此事务总共需要4个字节
b)另一种方法是在数据字节进入寄存器后启动停止条件。 然后、您需要重新发送从机地址、要写入的寄存器(这次配置寄存器1)以及要写入该寄存器的数据。 在这个传输和之前的传输中、总共发送了6个字节来写入两个配置寄存器。
从上面的示例中、您可以看到这为什么会更有用、因为它更高效。
3) 3) 这是指在写入/读取一个字节的数据并且另一个启动条件再次完成后重新启动。
简单:start->Typical communication->restart->byte received/written -> restart (这是随后的重新启动)
无论出于何种原因您决定执行另一个起始条件、如果数据的读/写量为奇数、指针可能会改变、此时指针引用的寄存器与原来的寄存器不同。
当从器件地址与重新启动条件之前的地址相同并且读取/写入位未发生更改时、重新启动通常会从同一寄存器中写入/读取、但对于该器件而言并非如此、因为它可能会更改寄存器。 在这种情况下、最好发送一个停止条件和起始条件、前提是您希望寻址原始寄存器(如果读取/写入的数据字节数量为奇数)。
4) 4) 这是从端口收集数据的时候。 这在 SDA 上的 ACK 上升期间发生。 这一切都是在我们的器件内部完成的、用户无需执行任何操作。 这更多地是了解数据轮询的时间。
在事务处理期间、INT 被复位为70%xVcc 的 SCL、并且在它被复位前有一个延迟、此延迟可为最大4us。 这与“读取端口0”时序不同。
5) 5)是的、您可以使用其中一种方式开始(读取或写入)。 请记住、如果您从输入端口1开始、则指针将在读取/写入后移动到输入端口0。
-Bobby