I2C 读取 - 需要重复启动吗?

use*_*456 2 i2c

我对 I2C 中的读取操作有疑问,位碰撞。我所遵循的协议如下:带有写确认寄存器 loc-ack-stop 的起始从地址。...... 起始-从机地址,带有read-ack-read data-stop。我正在将数据读取为 FFh,这是错误的。我的疑问是,在发送另一个启动之前,是否需要发送停止或可以继续另一个启动以不间断地读取数据,这实际上是重复启动。发送停止位与否有什么区别。如果读取的数据为 FFh,也有人可以告诉我可能的原因是什么。但是我可以保证写操作是成功的,在看到示波器截图后。请指导我。

谢谢

Pan*_*rei 6

i2c 协议是这样工作的

WRITE:
Run Code Online (Sandbox Code Playgroud)
  1. 发送开始
  2. 用最后一位写从地址为 WRITE ACCESS(0)
  3. 写子地址:这通常是您要写入的寄存器的地址;如果不适用,请跳至 4。
  4. 写数据
  5. 发送停止

如果操作成功,您写入从设备的每个字节都应以 ACK 应答。

READ:
Run Code Online (Sandbox Code Playgroud)
  1. 发送开始
  2. 用最后一位写从地址为 WRITE ACCESS(0)
  3. 写子地址:这通常是您要读取的寄存器的地址
  4. 发送 START(这是第二个开始条件 - 重新启动)
  5. 将最后一位写入从地址为 READ ACCESS(1)
  6. 读取数据
  7. 发送停止

如果成功,所有写入和读取操作(最后一次读取除外)都会以 ACK 应答。

因此,在重新启动的情况下,您不会发送第二个停止。

就0xFF读取结果而言,您需要检查设备的数据表,但如果您尝试读取的数据不可用,有些会返回此值!

希望这可以帮助。