在java

时间:2018-01-07 06:29:15

标签: java raspberry-pi processing i2c

我正在使用处理和覆盆子PI开发i2c系统。

我首先在raspberry pi上使用node.js在javascript中构建它,并且它工作得很好。但由于处理是Java,我不得不移植它并且它无法正常运行。

我可以验证i2c是否正在处理,因为我能够写入寄存器并读回正确的值。但是,当我试图写出超过127件的价值时,似乎开始变得令人困惑。当我通过i2c向寄存器发送0x80的值时,然后从寄存器中读取值,我收到-128。我意识到这是2的补码但是寄存器得到了预期的二进制序列10000000(0x80)?

这是我的代码,我省略了启动LIS3DH加速度计的设置方法,因为它们运行正常。因此,这只显示一个写/读周期,导致从寄存器接收-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();
}

1 个答案:

答案 0 :(得分:2)

字节用Java签名,值范围从-128到127,这就是你看-128的原因。位模式实际上与(byte)0x80完全相同。寄存器正在达到预期值。