【问题标题】:Using bit shift with SPI data in processing在处理中使用 SPI 数据移位
【发布时间】:2018-04-22 23:10:46
【问题描述】:

对于我正在为我的化学实验室做的一个研究项目,我们正在使用 ADS8320 芯片(数据表找到 here。我们正在使用它通过 Raspberry Pi 上的 SPI 引脚使用电位计获取电压读数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 芯片一起使用?你能否解释一下这个位移实际上是为了什么,因为我在上面找到的每个来源都让我更加困惑。对此的任何帮助都会非常有帮助!另外,如果我遗漏了任何重要信息,请告诉我,因为我对此还是很陌生。

【问题讨论】:

  • 如果您debug your program 并将您的问题缩小到minimal reproducible example,您将会有更好的运气。 in[0]in[1] 的值是多少?他们是你所期望的吗?将那条复杂的线分成多个步骤。哪些步骤的行为与您的预期不同?然后,如果您遇到困难,您可以只发布这几行的minimal reproducible example,而无需读取所有额外的数据。只需硬编码值即可。
  • 太棒了,我将把它分解,看看我是否无法获得价值。这条线非常复杂,让我很困惑。我会拆分它,看看我是否不能得到一个工作代码,或者至少有一个更好更简洁的例子给你。
  • 根据数据表的第 24 页,您可能需要读取 3 个字节而不是 2 个字节,丢弃前 6 位和后两位。结果,您的位移表达式将更改为类似于 int val = ((in[0] &amp; 0x03) &lt;&lt; 14) | (in[1] &lt;&lt; 6) | (in[2] &amp; 0x3f); 维基百科谈论 bitwise operations in C 包括位移操作。
  • 谢谢!我已经从实验室回家了,今天我可以试试这个。明天我会先试试这个,然后告诉你!
  • @v1bri 感谢您让我知道这 3 个字节。我试过你的代码,得到了一些奇怪的负数。我不确定这是为什么,可能是您添加到 [0] 和 [2] 中的字节的 0x03 和 0x3f 吗?

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 2021-06-13
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2017-11-05
    • 2017-04-27
    相关资源
    最近更新 更多