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.

[参考译文] CCS/MSP430FR5869:无法成功生成 CRC-16

Guru**** 2595800 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/797740/ccs-msp430fr5869-can-not-successfully-make-a-crc-16

器件型号:MSP430FR5869

工具/软件:Code Composer Studio

我一直在阅读 MSP430FR58xx 系列用户指南中有关 CRC-16模块的文档。  

我在测试代码中使用两个变量。 一个具有种子、另一个具有测试数据、我需要 CRC。 我还定义了"baseAddress"、它与 CRC 相关函数一同使用。 代码看起来像这样(它在 C++中)

测试代码:

"

uint16_t baseAddress = 0x0150;

uint16_t SEED = 0;

uint16_t data = 123;

CRC_setSeed (baseAddress、seed); //初始化 CRC 模块

CRC_set16BitData (baseAddress、data); //发送输入数据

CRC_set16BitData (baseAddress、SEED); //发送160以移出数据基

uint16_t 结果= CRC_getResult (baseAddress); //将结果存储在变量中

"

我使用 uint16_t sizes、因为函数将其作为参数。

上述代码提供以下结果(以十六进制表示):0A59

当我使用"bitsReversed"函数时、结果为(十六进制):563A

这似乎是以一种非常简单的方式处理职能,但在这一点上,我认识到我一定会做些错误的事情。 我正在寻找能够告诉我什么是错误的人。  

顺便说一下:我尝试了反向字节输入、反向字节结果的所有组合、并尝试了是否发送了16 0。 这些组合都没有提供与我在网上表格中能得到的任何结果相匹配的结果。 我使用 https://crccalc.com/ 来检查结果。

提前感谢。

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

    您好 Martin、

    我在 CRC 模块上附加了两个示例代码供您参考。

    这些项目是为 FR5976编写的、您只需将其更改为 FR5869即可。

    e2e.ti.com/.../crc_5F00_example.zip

    谢谢、

    是的

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

    我查看了 CRC16代码、不得不使用 FR5969上的反向位顺序输入寄存器和正常顺序输出寄存器。 我最终得到了一个文件、根据我的需要、该文件将使用硬件 CRC、表驱动版本或迭代版本。 都能提供相同的结果。 我的评论说:"当使用常见的测试字符串"123456789"进行测试时、所有版本返回 0x29b1。"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。 我看到您使用的是 CRC32模块,而我的 MCU 没有这种模块(这意味着我不能简单地窃取您的所有外观精美的代码:-))。 不过、您的代码看起来与我的代码非常相似。 我将进行比较。
    面向硬件的代码:
    "
    静态常量 uint8_t MyData[9]={0x31、0x32、0x33、0x34、0x35、0x36、0x37、0x38、0x39};

    volatile uint16_t hwCalculatedCRC;

    CRC32_setSeed (CRC16_INIT、CRC16_MODE);//Init 方式与 I 相同

    for (ii = 0;ii < 9;ii +)
    CRC32_set8BitDataReversed (MyData[i]、CRC16_MODE);//通过寄存器移动数据

    hwCalculatedCRC = CRC32_getResult (CRC16_MODE);//将 CRC 存储在变量中
    "

    我的测试代码(请记住、我的 MCU 上没有 CRC32模块、因此我使用"crc.c"和"crc.h"文件、而不是"CRC32.c"和"CRC32.h"文件):

    "
    uint16_t SEED = 0xFFFF;
    uint16_t dataArray[9]={0x31、0x32、0x33、0x34、0x35、 0x36、0x37、0x38、0x39};/ASCII '123456789'

    CRCINIRES = SEED;//init

    for (i=0;i<9;i++)

    CRCDIRB = dataArray[i];//转换反向 uint16_t 输入

    uint16_t 结果= CRCINIRES;
    "

    上述代码给出的结果= 4D64 (十六进制)
    如果我不反转输入、代码将给出结果= 8350 (十六进制)

    是否有任何关于代码彼此区别的建议、或者我可能会做什么错误?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、David。 感谢您的提示。 我已经尝试了所有反向输入/结果的组合、这使我感到无法正常工作。 您是否可以通过任何方式共享您的文件? 还是仅用于硬件生成的 CRC-16的代码块? 我想将我的代码与您的代码进行比较、因为我要查找的是0x23B1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在两个文件中有这些。 crc16.h 保存定义、而 crc16.c 保存代码。 这只是硬件版本、因为完整代码具有两种类型的软件 CRC 选项。

    #define crc16_init (CRC)(CRCINIRES = 0xFFFF)
    #define crc16_next (CRC、DATA)(CRCDIRB_L = DATA)
    #define crc16_DONE (CRC)(CRCINIRES)
    
    //
    计算并返回字符串 n 个字节上的 CRC16。
    //
    uint16_t compute_crc (uint8_t * s、int n)
    {
    uint16_t crc、i;
    
    crc16_init (&CRC);
    for (i = 0;i < n; i++)
    crc16_next (&CRC、*s++);
    
    返回 crc16_DONE (&CRC);
    }