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/MSP430FR2422:TLV 结构校验和?

Guru**** 2539500 points
Other Parts Discussed in Thread: MSP430FR2422, MSP430FR5739

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/803317/ccs-msp430fr2422-tlv-structure-checksum

器件型号:MSP430FR2422
主题中讨论的其他器件: MSP430FR5739

工具/软件:Code Composer Studio

大家好!

我正在进行 MSP430FR2422设计、并尝试编写验证 TLV 结构的小例程。  数据表显示使用 CRC-16-CCITT、并且有一些针对使用内置 CRC 模块的不同 CPU 的示例代码。  还有一个关于如何在某处的互网上应用 CRC-16-CCITT 来解决这种情况的规范。

这不起作用。

我偶然尝试了以下所有排列:(1)用0或0xFFFF 初始化 CRC 累加器、(2)直接加载数据或位反转、(2)交换 LS 和 MS 字节或不交换、或按字节加载数据、(3)检查块直到0x1AEF 与0x1AFF。  我还尝试了(4)对从0x1AF2开始的块进行校验和、(5)计算老式校验和(结构所有字的16位总和)、以及(6)对结构的所有字进行异或运算(是的、总共有50个变体、不是、花费不超过两个小时-我很快)。

这也不起作用。

请帮帮我。

 维克多

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

    尊敬的 Victor:

    您可以尝试  使用针对 CRC的外设示例。  我还建议您浏览 器件用户指南中的 CRC 一章 、了解如何使用 MSP430的 CRC 模块。

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

    以下是您建议的应用于 TLV CRC 的示例代码:

    uint16_t acc;

    //软件算法- CCITT CRC16代码
    unsigned int CCITT_Update (unsigned int init、unsigned int 输入)

     unsigned int CCITT;
      CCITT =(unsigned char)(init >> 8)|(init << 8);
      CCITT ^=输入;
      CCITT ^=(unsigned char)(CCITT & 0xFF)>> 4;
      CCITT ^=(CCITT << 8)<< 4;
      CCITT ^=((CCITT & 0xFF)<< 4)<< 1;
      返回 CCITT;


    //检查信息闪存的 TLV 区域
    bool tlv_check (void)

      无符号 i;

      CRCINIRES = 0xFFFF;
      对于(I = 0x01a04;I < 0x01af0;I += 2)
      {
        uint16_t a =*(uint16_t*) i;
        CRCDIRB=A;
      };

      uint16_t ACC = 0xFFFF;
      对于(I = 0x01a04;I < 0x01af0;I += 1)
        ACC = CCITT_Update (ACC、*(uint8_t*) i);

      while (1);


    软件更新函数和硬件 CRC 模块计算的值相同--在我的 CPU、MSP430FR2422上,这是0x0D46。 我的 TLV 结构是这样的、跨越0x1A00到0x1AEF:

    0x1A00:0606 0571 8311 1010 0A08 27E2 2DF1 0018
    0x1A10: 0046 FEFC 0811 8011 0000 02C3 0348 0412
    0x1A20: 7FF9 014B FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x1A30: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x1A40: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x1A50: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x1A60: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x1A70: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x1A80: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x1A90: 0110 965E 011A 0000 0110 96B7 0118 010E
    0x1AA0: 011A 5800 0110 96B8 0114 0010 0110 965E
    0x1AB0: 0112 0000 0110 9614 0112 0000 0116 0600
    0x1AC0: 0110 9601 011E 9000 0110 961D 0112 0040
    0x1AD0: 0116 6B64 0110 9602 0116 8CAC 0118 BB30
    0x1AE0: 0114 0C27 0154 02D2 1A90 0001 F982 3CC3

    您可以看到、存储在结构中地址0x1A02的 CRC 为0x0571。

    无论我们如何比较0x0D46与0x0571、字节反转、位反转或组合、它们都不匹配... 哎呀。

    我缺少什么?

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

    尊敬的 Victor:

    遗憾的是、我无法再提供任何答案、但我可以为430团队成员提供另一个数据点。

    已采取的步骤

    我还尝试在 MSP430FR5739上重复类似的实验、结果令人遗憾。 我使用以下修改后的代码示例尝试反转数据、反转结果位和存储器范围(0x1A04-0x1AFF、0x1A04-0x1A7F)的组合、并且无法复制存储在器件 TLV 区域中的 CRC 值。

    #include "driverlib.h"
    
    void main (void)
    {
    uint16_t crcSeed = 0xFFFF;
    uint16_t DATA[]={0x0123、
    0x4567、
    0x8910、
    0x1112、
    0x1314};
    uint16_t crcResult;
    uint16_t i;
    
    //停止 WDT
    WDT_A_HOLD (WDT_A_base);
    
    //将 P1.0设置为输出
    GPIO_setAsOutputPin (
    GPIO_PORT_P1、
    GPIO_PIN0);
    
    //设置 CRC 种子
    CRC_setSeed (CRC_BASE、
    CrcSeed);
    
    对于(I = 0x1A04;I <= 0x1AFF;I++)
    {
    //将所有值添加到 CRC 签名中
    CRC_set16位数据反向(CRC_BASE、
    *(unsigned char*)(i));
    }
    
    //保存当前 CRC 签名校验和以供以后比较
    crcResult = crc_getResult (crc_BASE);
    
    
    //Enter LPM4、中断被启用
    _bis_SR_register (LPM4_BITS);
    __no_operation();
    }
    

    下面是我的特定器件的存储器数据本身:

    0x001A00 0606 1F72 8103 2020 0A08 FFFF FFFF FFFF
    0x001A10 FFFF FFFF 1013 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x001A20 FFFF FFFF FFFF 0612 FFFF FFFF FFFF 6C02
    0x001A30 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x001A40 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x001A50 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x001A60 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x001A70 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x001A80 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x001A90 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x001AA0 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x001AB0 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
    0x001AC0 FFFF FFFF FFFF 032A 0030 0194 FFDF 0196
    0x001AD0 0000 0110 9602 0116 E558 0118 2404 0110
    0x001AE0 961C 0118 1912 0110 96D6 0116 004A 1ACA
    0x001AF0 0000 0000 3CC3 0000 8118 0214 FFFF
    资源
    我在 MSP430F5xx 系列器 件中找到的一个相关资源是此处的 E2E 帖子、但代码示例已与我在上面分享的代码示例基本复制、但结果失败。
    问题
    '430团队:FRAM TLV 结构、尤其是 CRC 值的计算/结构与 MSP430F5xx 系列器件不同吗?
    此致、
    标记-
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Victor:

    我正在测试您描述的问题、稍后将与您联系。

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

    尊敬的 Victor:

       MSP430FR2422数据表中 CRC 校验的长度存在一些错误、如下图所示:

     

       图中描述的地址为0x1A04h0x1AEF、实际地址应为0x1A04h0x1A5.5
      正确的验证 码如下所示:

    #include 
    
    unsigned int crc_results = 0;
    unsigned int i;
    unsigned int crc_Memory = 0;
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    
    CRCINIRES = 0xFFFF; //用0xFFFF 初始化 CRC
    
    CRC_Memory =*(unsigned int*) 0x01a02;
    
    对于(I = 0x01a04;I < 0x01af5;I += 2)
    {
    CRCDIRB =*(unsigned int*) i;
    };
    
    CRC_Results = CRCINIRES;
    返回0;
    }
    



      我已经测试了代码、结果正确、感谢您对此问题的反馈、我们将在以后的版本中更新数据表。

    谢谢、此致

    Johnson