我也有同样的问题,看起来这个主题的文档不完整。
读取单个样本
我觉得你可以爆读了ACCEL_*OUT_*
,TEMP_OUT_*
和GYRO_*OUT_*
。事实上,我尝试一次读取一个寄存器的数据,但我经常遇到数据损坏。
然后,只是为了尝试,我请求了 6 个字节ACCEL_XOUT_H
,6 个字节GYRO_XOUT_H
和 2 个字节,TEMP_OUT_H
并且......它成功了!不再有数据损坏!
我认为他们只是忘记在注册地图中提及这一点。
如何
下面是一些可以在 Arduino 环境中运行的示例代码。
这些是我使用的功能,它们不是很安全,但它适用于我的项目:
////////////////////////////////////////////////////////////////
inline void requestBytes(byte SUB, byte nVals)
{
Wire.beginTransmission(SAD);
Wire.write(SUB);
Wire.endTransmission(false);
Wire.requestFrom(SAD, nVals);
while (Wire.available() == 0);
}
////////////////////////////////////////////////////////////////
inline byte getByte(void)
{
return Wire.read();
}
////////////////////////////////////////////////////////////////
inline void stopRead(void)
{
Wire.endTransmission(true);
}
////////////////////////////////////////////////////////////////
byte readByte(byte SUB)
{
requestBytes(SUB, 1);
byte result = getByte();
stopRead();
return result;
}
////////////////////////////////////////////////////////////////
void readBytes(byte SUB, byte* buff, byte count)
{
requestBytes(SUB, count);
for (int i = 0; i < count; i++)
buff[i] = getByte();
stopRead();
}
此时,您可以通过这种方式简单地读取值:
// ACCEL_XOUT_H
// burst read the registers using auto-increment:
byte data[6];
readBytes(ACCEL_XOUT_H, data, 6);
// convert the data:
acc_x = (data[0] << 8) | data[1];
// ...
警告!
看起来这不能用于其他寄存器。例如,要读取 FIFO_COUNT_* 我必须这样做(否则我会得到不正确的结果):
uint16_t FIFO_size(void)
{
byte bytes[2];
// this does not work
//readBytes(FIFO_COUNT_H, bytes, 2);
bytes[1] = readByte(FIFO_COUNT_H);
bytes[2] = readByte(FIFO_COUNT_L);
return unisci_bytes(bytes[1], bytes[2]);
}
读取 FIFO
看起来 FIFO 的工作方式不同:您可以通过简单地从FIFO_R_W
寄存器请求多个字节来进行突发读取,而 MPU6050 将在不增加寄存器的情况下为您提供 FIFO 中的字节。
我发现了这个例子,他们用来I2Cdev::readByte(SAD, FIFO_R_W, buffer)
从 FIFO 中读取给定数量的字节,如果你看一下I2Cdev::readByte()
(这里)它只是从 FIFO 寄存器中请求 N 个字节:
// ... send FIFO_R_W and request N bytes ...
for(...; ...; count++)
data[count] = Wire.receive();
// ...
如何
这很简单,因为 FIFO_R_W 不会自动递增:
byte data[12];
void loop() {
// ...
readBytes(FIFO_R_W, data, 12); // <- replace 12 with your burst size
// ...
}
警告!
- 使用
FIFO_size()
速度很慢!
- 另外我的建议是使用 400kHz I2C 频率,这是 MPU6050 的最大速度
希望能帮助到你 ;)