I2C 多字节传输
I2C multibyte transfer
当我们想要传输单个字节时,我们按照 screenshot 中的描述发送它。
当我们在多波群模式下传输数据时,我们在从设备确认后立即发送地址(起始寄存器)而不是数据。然后我们发送数据,寄存器地址自动递增,如this book.
我的问题是:
从机如何识别第一个确认后的字节是地址还是数据?
提示:我用了很多Google,但找不到令我满意的答案。
从站可以通过检查第一个地址字节的特殊位模式来识别地址跨越两个字节的事实。以 1111 0
位模式开头的从地址表示一个 10 位地址(与常规的 7 位地址相反),它跨越总线上的两个字节,如 I2C Bus Specification:
3.1.11 10-bit addressing
[...]
The 10-bit slave address is formed from the first two bytes following a START condition
(S) or a repeated START condition (Sr).
The first seven bits of the first byte are the combination 1111 0XX of which the last two bits
(XX) are the two Most-Significant Bits (MSB) of the 10-bit address; the eighth bit of the
first byte is the R/W bit that determines the direction of the message.
如果第一个地址字节与特殊位模式不匹配,则必须将第二个字节视为数据。
所以,在你的例子中
| START | slave address | R/W | ACK | slave address | ACK | data | ...
| S | 1111 000 | 0 | A | 0000 1111 | A | 0000 0001 | ...
主机正在从由 10 位地址 00 0000 1111
识别的从机读取多个数据字节。
当我们想要传输单个字节时,我们按照 screenshot 中的描述发送它。
当我们在多波群模式下传输数据时,我们在从设备确认后立即发送地址(起始寄存器)而不是数据。然后我们发送数据,寄存器地址自动递增,如this book.
我的问题是:
从机如何识别第一个确认后的字节是地址还是数据?
提示:我用了很多Google,但找不到令我满意的答案。
从站可以通过检查第一个地址字节的特殊位模式来识别地址跨越两个字节的事实。以 1111 0
位模式开头的从地址表示一个 10 位地址(与常规的 7 位地址相反),它跨越总线上的两个字节,如 I2C Bus Specification:
3.1.11 10-bit addressing
[...]
The 10-bit slave address is formed from the first two bytes following a START condition (S) or a repeated START condition (Sr). The first seven bits of the first byte are the combination 1111 0XX of which the last two bits (XX) are the two Most-Significant Bits (MSB) of the 10-bit address; the eighth bit of the first byte is the R/W bit that determines the direction of the message.
如果第一个地址字节与特殊位模式不匹配,则必须将第二个字节视为数据。 所以,在你的例子中
| START | slave address | R/W | ACK | slave address | ACK | data | ...
| S | 1111 000 | 0 | A | 0000 1111 | A | 0000 0001 | ...
主机正在从由 10 位地址 00 0000 1111
识别的从机读取多个数据字节。