2015-06-27 232 views
0

我对I2C中的读操作有点怀疑,有点b。。我正在阅读的协议如下: 带写入确认寄存器loc-ack-stop的起始从站地址。 ......具有读取 - 读取数据停止的起始从站地址。 我正在读取数据为FFh,这是错误的。 我的疑问是,在发送另一个开始之前,需要发送停止或继续另一个开始读取数据而不停止,这实际上是一个重复的开始。发送停止位有没有什么不同。也有人可以告诉什么是可能的原因,如果数据读取是FFh。但是我可以保证在看到范围镜头后写入操作是成功的。请指导我。I2C读取 - 需要重复启动?

感谢

+0

请任何一个答复。 – user123456

+0

这取决于您正在与之通话的从属设备。许多设备需要重复启动(不停止)才能读取寄存器:写入寄存器编号,重复启动,读取数据。我的经验是,对于某些设备,它可以在STOP之间正常工作,而其他设备则需要重复START以使内部状态机正常工作。您需要阅读数据表。 – DoxyLover

+0

好的谢谢..我的数据表表示STOP应该在开始之前给出,但它不起作用。将尝试重复开始。 – user123456

回答

1

I2C协议工作原理是这样

WRITE: 
  1. 发送启动
  2. 与最后一位的写权限(0)
  3. 写入子地址
  4. 写从地址:这个通常是你要写入的寄存器地址;如果不适用,跳到4
  5. 写入数据
  6. 发送STOP

每次写入到从设备的字节应该用一个ACK来回答如果操作成功。

READ: 
  1. 发送启动
  2. 与最后一位的写权限(0)
  3. 写入子地址写入从地址:这是通常的地址注册,你从
  4. 读什么发送START(这是第二个启动条件 - 重新启动)
  5. 将最后一位写入从地址为READ ACCESS(1)
  6. 读取数据
  7. 发送停止

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

所以在重启的情况下,你不会发送第二站。

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

希望这会有所帮助。