首页 > 解决方案 > MPU-6050 突发读取自动增量

问题描述

我正在尝试为 MPU-6050 编写驱动程序,但我对如何继续读取原始加速度计/陀螺仪/温度读数感到困惑。例如,MPU-6050 的加速度计 X 读数位于 2 个寄存器中:地址 0x3B 的 ACCEL_XOUT[15:8] 和地址 0x3C 的 ACCEL_XOUT[7:0]。当然,要读取原始值,我需要读取两个寄存器并将它们放在一起。

在寄存器的描述中(在寄存器映射和描述表中,https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf)它说保证来自同一采样时刻的读数 一旦检测到空闲 I2C 总线,我必须使用突发读取 b/c,传感器寄存器会用新采样时刻的新数据刷新。数据表片段显示了简单的 I2C 突发读取:

在此处输入图像描述

但是,如果支持自动增量,这种方法(据我所知)仅适用于从同一采样时刻读取 ACCEL_X 寄存器(这样上述序列中的第一个 DATA 将来自 ACCEL_XOUT[15:8] @ 地址 0x3B 和第二个数据将来自 ACCEL_XOUT[7:0] @ 地址 0x3C)。但是数据表(https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Datasheet1.pdf)只提到 I2C 突发写入支持自动增量功能。如果 I2C 读取端没有自动增量,我将如何在保持相同采样时刻的同时读取两个不同的寄存器?

我也认识到我可以使用传感器的 FIFO 功能或中断来完成我所追求的,但是(出于我自己的好奇心)我想要一个不依赖于任何一个的解决方案。

标签: i2cmpu6050

解决方案


正如卢卡所说,突发读取语义似乎因读取操作开始的寄存器而异。

读取一致的样本

要读取一组一致的原始数据值,您可以使用I2C.readRegister(int, ByteBuffer, int)寄存器号为 59 (ACCEL_XOUTR[15:8])、长度为 14 的方法,一次操作读取所有传感器数据 ACCEL、TEMP 和 GYRO,并获得一致数据。

突发读取 FIFO 数据

但是,如果您使用芯片的 FIFO 缓冲区,您可以在寄存器 116 (FIFO_R_W) 上使用相同的方法签名启动突发读取,以从芯片内部的 fifo 缓冲区中读取给定数量的数据。这样做你必须记住,在一次突发操作中可以读取的字节数是有限制的。如果我正在解释https://github.com/joan2937/pigpio/blob/c33738a320a3e28824af7807edafda440952c05d/pigpio.c#L3914正确,则在单个突发操作中最多可以读取 31 个字节。


推荐阅读