3

我正在转换一个在特定微控制器上运行的程序,并将其调整为在树莓派上运行。我已经成功地从我一直在使用的传感器中提取值,但现在我遇到了一个问题,我认为这是由我无法理解的几行代码引起的。我已经阅读了它们是什么,但仍在摸不着头脑。我认为下面的代码应该修改存储在X,Y,Z变量中的数字,但是我认为这不会发生在我当前的程序中。此外,我必须更改byteINT使程序编译没有错误。这是我转换的原始代码中未修改的代码。有人可以告诉我这是否还在修改数字吗?

void getGyroValues () {
  byte MSB, LSB;

  MSB = readI2C(0x29);
  LSB = readI2C(0x28);
  x = ((MSB << 8) | LSB);

  MSB = readI2C(0x2B);
  LSB = readI2C(0x2A);
  y = ((MSB << 8) | LSB);

  MSB = readI2C(0x2D);
  LSB = readI2C(0x2C);
  z = ((MSB << 8) | LSB);
}

这是原始的 readI2C 函数:

int readI2C (byte regAddr) {
    Wire.beginTransmission(Addr);
    Wire.write(regAddr);                // Register address to read
    Wire.endTransmission();             // Terminate request
    Wire.requestFrom(Addr, 1);          // Read a byte
    while(!Wire.available()) { };       // Wait for receipt
    return(Wire.read());                // Get result
}
4

1 回答 1

5

I2C是一种用于与低速外设通信的 2 线协议。

您的传感器应通过 I2C 总线连接到您的 CPU。您正在从传感器读取 3 个值 - x、y 和 z。这些值可作为6 x 8-bit寄存器从传感器访问。

x - Addresses 0x28, 0x29
y - Addresses 0x2A, 0x2B
z - Addresses 0x2C, 0x2D

ReadI2C()正如函数名所暗示的那样,从传感器的给定地址读取一个字节的数据并返回正在读取的数据。中的代码ReadI2C()取决于您设备的 I2C 控制器的设置方式。

一个字节是 8 位数据。MSB ( Most-Significant-Byte) 和 LSB( Least-Significant-Byte) 表示每个读取的 8 位I2C。看起来您对 16 位数据(x、y 和 z)感兴趣。要从 2 条 8 位数据构造 16 位数据,请将MSB8 位向左移动,然后与LSB.

例如:

让我们假设: MSB = 0x45 LSB = 0x89

MSB << 8 = 0x4500

(MSB << 8) | LSB = 0x4589

看看我的内联评论:

void getGyroValues () {
  byte MSB, LSB;

  MSB = readI2C(0x29);
  LSB = readI2C(0x28);
  // Shift the value in MSB left by 8 bits and OR with the 8-bits of LSB
  // And store this result in x
  x = ((MSB << 8) | LSB);

  MSB = readI2C(0x2B);
  LSB = readI2C(0x2A);
  // Do the same as above, but store the value in y
  y = ((MSB << 8) | LSB);

  MSB = readI2C(0x2D);
  LSB = readI2C(0x2C);
  // Do the same as above, but store the value in z
  z = ((MSB << 8) | LSB);
}
于 2013-03-03T07:56:35.180 回答