在处理中使用位移和SPI数据

时间:2017-11-09 20:06:03

标签: processing raspberry-pi3 bit-shift spi adc

对于我正在为我的化学实验室做的研究项目,我们正在使用和ADS8320芯片(数据表找到here。我们正在使用它通过电位器通过SPI引脚获取电压读数Raspberry Pi 3.虽然我能够使用Processing.org中的this code获取数据:

import processing.io.*;
SPI adc;

void setup() {
  //printArray(SPI.list());
  adc = new SPI(SPI.list()[0]);
  adc.settings(500000, SPI.MSBFIRST, SPI.MODE0);
}

void draw() {
  // read in values over SPI from an analog-to-digital
  // converter
  // dummy write, actual values don't matter
  byte[] out = { 0, 0 };
  byte[] in = adc.transfer(out);
  // some input bit shifting according to the datasheet
  int val = ((in[0] & 0x1f) << 5) | ((in[1] & 0xf8) >> 3);
  // val is between 0 and 1023
  println(val);
}

根据我在数据表中读到的内容,我在获取最大电压时应该得到65535的值。相反,我在获取最大电压时得到的值为127。我差不多是一个好的程序员,几乎在一个月之前就已经把它拿起了,但我认为问题在于代码转换行:

int val = ((in[0] & 0x1f) << 5) | ((in[1] & 0xf8) >> 3);

如果这是问题,我如何设置它与我的16位ADS芯片一起工作?你能解释一下这个位移实际上是什么,因为我发现它的每个来源都让我更加困惑。任何有关这方面的帮助都会非常有帮助!此外,如果我遗漏任何重要信息,请告诉我,因为我仍然很新。

1 个答案:

答案 0 :(得分:1)

代码的那一行是你如何从芯片中读取10位值。输入0(在[0]中)具有数据的5个最高有效位,输入1(在[1]中)具有5个最低有效位。因此,换班操作。想象一下你的数据有10位,你做(0b00011111 AND输入[0])并将它向左移动5.然后你做(0b11111000 AND输入[1])并将它向右移动3.最后,当将它们与OR val1 | val2放在一起,您将获得10位值。但是,如果您访问芯片的数据表,您的芯片是一个16位ADC,这意味着您需要另外一个引脚来读取您未读取的额外6位。此外,请确保将正确的引脚连接到[0]和[1]中,因为它可以反转位流的方向。