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

Using bit shift with SPI data in processing

对于我正在为我的化学实验室所做的研究项目,我们正在使用 ADS8320 芯片(数据 Sheet 从 Processing.org 中找到 here. We are using this to take in voltage readings with a potentiometer through the SPI pins on a Raspberry Pi 3. While I have been able to get data using 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);
}

根据我读到的数据 sheet 我应该在接受最大电压时得到一个 65535 的值。相反,我在接受最大电压时得到的值为 127。我无论如何都不是一个优秀的程序员,差不多一个月前就开始学习它了,但我认为问题在于代码的位移行:

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

如果这是问题所在,我该如何设置它才能与我的 16 位 ADS 芯片一起使用?您能否也解释一下这种位移实际上是为了什么,因为我在上面找到的每个来源都让我更加困惑。对此的任何帮助都会非常有帮助!另外,如果我遗漏了任何重要信息,请告诉我,因为我在这方面还是个新手。

这行代码是您从芯片读取 10 位值的方式。输入 0 (in[0]) 具有数据的 5 个最高有效位,输入 1 (in[1]) 具有 5 个最低有效位。因此,移位操作。假设您的数据有 10 位,您执行 (0b00011111 AND Input[0]) 并将其向左移动 5。然后您执行 (0b11111000 AND Input[1]) 并将其向右移动 3。最后,当将它们与 OR val1 | val2 放在一起,您将得到一个 10 位的值。但是,如果您访问芯片的数据 sheet,您的芯片是一个 16 位 ADC,这意味着您可能需要另一个引脚来读取您没有读取的额外 6 位。此外,请确保将正确的引脚连接到 in[0] 和 in[1],因为它可以反转比特流的方向。