在处理中对 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],因为它可以反转比特流的方向。
对于我正在为我的化学实验室所做的研究项目,我们正在使用 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],因为它可以反转比特流的方向。