我正在转换一个在特定微 Controller 上运行的程序,并将其调整为在 raspberry pi 上运行。我已经成功地从我一直使用的传感器中提取值,但现在我遇到了一个问题,我认为这是由我无法理解的几行代码引起的。我已经阅读了它们是什么,但仍然在挠我的头。我认为下面的代码应该修改存储在 X,Y,Z 变量中的数字,但是我认为这不会发生在我当前的程序中。此外,我不得不将 byte 更改为 INT 以使程序编译时不会出现错误。这是我转换的原始代码中未修改的代码。有人能告诉我这是否甚至在修改数字吗?

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
}

最佳答案

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

您的传感器应该通过 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 Controller 的设置方式。

一个字节是 8 位数据。 MSB ( Most-Significant-Byte ) 和 LSB ( Least-Significant-Byte ) 分别表示通过 I2C 读取的 8 位。
看起来您对 16 位数据(对于 x、y 和 z)感兴趣。要从 2 个 8 位数据构建 16 位数据,您将 MSB 向左移动 8 位,然后对 LSB 执行逻辑或运算。

例如:



也看看我的内联评论:
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);
}

关于c - 理解 MSB LSB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15183530/

10-11 21:08