在 java 中通过 i2c 将 0x80 或 -128 写入寄存器时有区别吗
Is there a difference when writing 0x80 or -128 to a register over i2c in java
我正在开发一个使用处理和 raspberry PI 的 i2c 系统。
我先在 javascript 中构建了它,然后在 raspberry pi 中构建了 node.js,并且运行良好。但由于处理是 Java,我不得不将其移植过来,但它无法正常运行。
我可以验证 i2c 是否正在处理,因为我能够写入寄存器并读回正确的值。但似乎当我尝试写入超过 127 的值时,事情开始变得混乱。当我通过 i2c 将 0x80 的值发送到一个寄存器,然后从我收到的寄存器中读回该值时,我收到了 -128。我意识到这是 2 的补码,但寄存器是否获得预期的二进制序列 10000000 (0x80)?
这是我的代码,我省略了启动 LIS3DH 加速度计的设置方法,因为它们运行良好。所以这只显示了一个 write/read 周期,它导致从寄存器接收到 -128:
import java.util.*;
import processing.core.*;
import processing.io.*;
I2C i2c;
private static final byte LIS3DH_DEFAULT_ADDRESS = (byte)0x18;
private static final byte LIS3DH_REG_TEMPCFG = (byte)0x1F;
boolean debug = true;
void setup() {
size(500, 500);
println("Available I2C interfaces:");
printArray(I2C.list());
i2c = new I2C(I2C.list()[0]);
background(0);
colorMode(RGB, 255, 255, 255, 255);
// enable adcs
if(debug) println("Write ", (byte) 0x80, "to LIS3DH_REG_TEMPCFG");
writeByte(i2c_address, LIS3DH_REG_TEMPCFG, (byte) 0x80);
if(debug) println("Read LIS3DH_REG_TEMPCFG", readByte(LIS3DH_DEFAULT_ADDRESS, LIS3DH_REG_TEMPCFG));
}
void draw() {
background(255,0,0);
}
byte readByte(byte deviceAddress, byte regAddress){
i2c.beginTransmission(deviceAddress);
i2c.write(regAddress);
return (i2c.read(1)[0]);
}
void writeByte(byte deviceAddress, byte regAddress, byte val){
i2c.beginTransmission(deviceAddress);
i2c.write(regAddress);
i2c.write(val);
i2c.endTransmission();
}
字节在 Java 中签名,值范围从 -128 到 127,这就是你看到 -128 的原因。位模式其实和(byte)0x80
完全一样。寄存器正在获取预期值。
我正在开发一个使用处理和 raspberry PI 的 i2c 系统。
我先在 javascript 中构建了它,然后在 raspberry pi 中构建了 node.js,并且运行良好。但由于处理是 Java,我不得不将其移植过来,但它无法正常运行。
我可以验证 i2c 是否正在处理,因为我能够写入寄存器并读回正确的值。但似乎当我尝试写入超过 127 的值时,事情开始变得混乱。当我通过 i2c 将 0x80 的值发送到一个寄存器,然后从我收到的寄存器中读回该值时,我收到了 -128。我意识到这是 2 的补码,但寄存器是否获得预期的二进制序列 10000000 (0x80)?
这是我的代码,我省略了启动 LIS3DH 加速度计的设置方法,因为它们运行良好。所以这只显示了一个 write/read 周期,它导致从寄存器接收到 -128:
import java.util.*;
import processing.core.*;
import processing.io.*;
I2C i2c;
private static final byte LIS3DH_DEFAULT_ADDRESS = (byte)0x18;
private static final byte LIS3DH_REG_TEMPCFG = (byte)0x1F;
boolean debug = true;
void setup() {
size(500, 500);
println("Available I2C interfaces:");
printArray(I2C.list());
i2c = new I2C(I2C.list()[0]);
background(0);
colorMode(RGB, 255, 255, 255, 255);
// enable adcs
if(debug) println("Write ", (byte) 0x80, "to LIS3DH_REG_TEMPCFG");
writeByte(i2c_address, LIS3DH_REG_TEMPCFG, (byte) 0x80);
if(debug) println("Read LIS3DH_REG_TEMPCFG", readByte(LIS3DH_DEFAULT_ADDRESS, LIS3DH_REG_TEMPCFG));
}
void draw() {
background(255,0,0);
}
byte readByte(byte deviceAddress, byte regAddress){
i2c.beginTransmission(deviceAddress);
i2c.write(regAddress);
return (i2c.read(1)[0]);
}
void writeByte(byte deviceAddress, byte regAddress, byte val){
i2c.beginTransmission(deviceAddress);
i2c.write(regAddress);
i2c.write(val);
i2c.endTransmission();
}
字节在 Java 中签名,值范围从 -128 到 127,这就是你看到 -128 的原因。位模式其实和(byte)0x80
完全一样。寄存器正在获取预期值。