我正在致力于转换一个在特定微控制器上运行的程序,并将其调整为在覆盆子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
}发布于 2013-03-03 15:56:35
I2C是一种用于与低速外围设备通信的双线协议。
传感器应通过I2C总线连接到中央处理器。您正在从传感器读取3个值- x、y和z。这些值可以作为6 x 8-bit寄存器从传感器访问。
x - Addresses 0x28, 0x29
y - Addresses 0x2A, 0x2B
z - Addresses 0x2C, 0x2D顾名思义,ReadI2C()从传感器的给定地址读取一个字节的数据,然后返回正在读取的数据。ReadI2C()中的代码取决于设备的I2C控制器的设置方式。
一个字节是8位数据。最低有效位(Most-Significant-Byte)和最低有效位(Least-Significant-Byte)分别表示通过I2C读取的8位。看起来你对16位数据感兴趣(对于x,y和z)。要从这两段8位数据构造16位数据,需要将MSB左移8位,然后对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);
}https://stackoverflow.com/questions/15183530
复制相似问题