This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5849:有符号与无符号 SPI 数据

Guru**** 1809840 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1426494/msp430fr5849-signed-vs-unsigned-spi-data

器件型号:MSP430FR5849

工具与软件:

我正在使用基于 SPI 的加速计、并尝试对所有采样数据运行一个函数。 在之前的测试中、我能够读取所有数据并将其保存到内存中、但当我尝试对数据运行函数时、我们的值中出现的数据是意外的。 实际上、我们已验证数据输入正确、但对数据的数学改变不一致 (此时、我们只是将当前采样值与一段时间内所有其他采样值之和相加)。   

我的问题:
数据是十六进制2补码。 使用此数据添加二进制补码的最佳方法是什么? 微控制器是否以不同的方式处理我们看不到的数据?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    每个数据点有多少字节? 如果不止一个、如何将它们组合成一个值? 您使用哪种类型来存储数据? (即是否存在溢出风险?)

    您是否尝试过手动运行一些数据以了解事物可能会呈现出珍珠状?

    您能分享一个例子吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    目前我们正在存储在一个整数中。 该整数可能不够大、但考虑到我与其他工程师讨论过的内容、我们也要改用16位整数。 现在、我们将针对每个数据点使用2个字节、但我们的第一个字节包含对所有8位的访问、第二个字节仅包含对4个最高有效位[7:4]的访问、最后4个[3:0]是"保留"、意味着我们无法访问它们。 我们目前正在努力合并数据字节、现在我们先前已经丢弃了一个数据字节并牺牲了速度精度。 现在我们可以提高当前使用可获得的2个字节的准确度。 这也有助于知道数据也是左对齐的、以防对二人的称赞有任何影响。  实验室测试用例并不接近此时会导致溢出的情况。 过去、我们会保存数据并在 Excel 中运行数学运算、从而得到期望值。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这里的类型存在一些混淆。 "整数"可能是16位、因此移动到"16位整数"可能没有变化。

    目前尚不清楚何处"我们现在将使用每个数据点2个字节、但我们的第一个字节包括对所有8位的访问、第二个字节仅包括对4个最高有效位[7:4]的访问、最后4个[3:0]是"保留"、意味着我们无法访问它们。 "来自。 这是从加速计返回的吗? 您能告诉我们您正在使用的加速计吗? 您能否分享一个展示该问题的小示例?

    我怀疑在根据您的2个 SPI 字节创建16位整数时会出现问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    数据肯定不仅仅是一个字节、而是一次接收到一个字节。 该值应存储到"unsigned char"类型的对象中。 则可以将其与另一个字节进行组合。

    关键是防止编译器将字节通过符号扩展为 int。 即使没有专门将其转换为 int、它也可以这样做。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Analog Devices 中的 ADXL373。 见第35和36页。 我们仅使用 x 轴。  

    来自离心机的示例数据:
    0c.
    0c.
    0C....

    然后、我们左移4位、因为我们只查看高字节。
    0c0
    0c0
    0c0……

    0C0 => 192LSB (十进制)
    192/5=38 G

    根据我们的 RPM 计算、我们以38G 的转速率旋转、因此我们看到了38G。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不起作用的实际代码会让我们无法猜测。 包括如何读取数据以及如何处理数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这一切都不能解释为什么应该出现求和值问题。