我正在使用在 Digistump Oak 上运行的 MicroPython 编写一些简单的代码,这基本上是一个 ESP8266 分线板。我试图了解通过 i2c 定期读取传感器时看到的行为。
以下代码(读取ACCEL_XOUT_H
和ACCEL_XOUT_L
寄存器的值)工作得很好:
>>> from machine import Pin, I2C
>>> bus = I2C(scl=Pin(2), sda=Pin(0))
>>> while True:
... h, l = bus.readfrom_mem(0x68, 0x3b, 2)
... print (-((((h<<8)+l)^0xFFFF) + 1) if (h & (1<<7)) else (h<<8)+l)
(该打印语句只是执行二进制补码的转换。)
正如预期的那样,当我移动 imu 时,它会从加速度计中打印出几乎实时变化的值。
但是,如果我在循环中引入延迟,例如...
>>> import time
>>> from machine import Pin, I2C
>>> bus = I2C(scl=Pin(2), sda=Pin(0))
>>> while True:
... h, l = bus.readfrom_mem(0x68, 0x3b, 2)
... print (-((((h<<8)+l)^0xFFFF) + 1) if (h & (1<<7)) else (h<<8)+l)
... time.sleep(1)
...我看到一些非常奇怪的行为。在 imu 改变方向后,i2c 读取操作返回的值在多次迭代中继续保持不变。我不知道这里发生了什么:从 imu 上的寄存器读取的 i2c 读取操作,根据文档以采样率更新,默认配置为 1Khz。我在代码或数据路径中看不到任何可能以某种方式锁定或缓存这些值的内容。
这是关于加速度计寄存器的文档,可在寄存器映射和描述文档中找到:
这些寄存器存储最新的加速度计测量值。加速度计测量值以寄存器 25 中定义的采样率写入这些寄存器。
加速度计测量寄存器以及温度测量寄存器、陀螺仪测量寄存器和外部传感器数据寄存器由两组寄存器组成:内部寄存器组和面向用户的读取寄存器组。加速度计传感器内部寄存器集中的数据始终以采样率更新。同时,只要串行接口空闲,面向用户的读取寄存器组就会复制内部寄存器组的数据值。
由于我在读取调用之间处于睡眠状态,因此我很确定 i2c 串行接口在任何定义下都是空闲的,而且我没有看到任何与此行为相关的东西。
你对这里可能发生的事情有什么建议吗?