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.

[参考译文] MSP430FR2311:BSL CRC 实现?

Guru**** 2535750 points
Other Parts Discussed in Thread: MSP430FR2311

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/836227/msp430fr2311-bsl-crc-implementation

器件型号:MSP430FR2311

您好!

我的应用代码中有一个函数、用于计算芯片的整个 FRAM 区域的哈希值。 它在附加的代码中实现。 如果我要对 BSL 使用相同的参数(即起始地址为0xf100、长度为1920 16位字)、这是否与我在下面的操作等效?

还使用了什么16位多项式? 我将 0x1021用于 CRC16 CCITT、但我似乎没有得到相同的结果。  

//第一个和最后一个字
的地址#define firmware_start_address FRAM_start
#define firmware_FRAM_SIZE 1920
静态空 CrcFirmware (void)
{
uint16_t i;
uint16_t* flash_ptr =(uint16_t*) firmware_start_address;

//输入第一个字以初始化 CRC 硬件
CRCINIRES = FLASH_PTR[0];

对于(i = 1;i < firmware_FRAM_SIZE;i++)
{
CRCDI = FLASH_PTR[i];
}

//保存结果
firmware_crc = CRCINIRES;
} 

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

    请查找 FR2311 http://dev.ti.com/tirex/explore/node?node=AN-HELWgg07MbSBgA.5OyQ__IOGqZri__LATEST 的 CRC 寄存器级代码示例

    此代码与 BSL 中的 CRC 代码相同

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

    看看这个、我会看到 一个__no_operation();在该字被贡献给 CRC 累加器之后。 您知道这是什么目的吗? 我在 CRC 模块文档中看不到要求 nop()。

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

    __no_operation()用于调试,(设置 BP,监视变量)。 NOP 不能作为文档描述在 CRC 代码中。

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

    我仍然无法获得匹配的 CRC。

    使用新擦除的 MCU、我将使用随附的参数执行 CRC。 它应该是两个字、如果 MCU 被新擦除、那么两个字都是0xfff。 我由此得到的结果是0x0000、这与软件定义的 CRC CCITT 算法不一致、结果为0x1d0f。 有什么想法吗?

    下图显示了 CRC 请求期间的事务。 这发生在(按顺序)我们批量擦除 MCU、然后使用默认密码解锁 MCU 之后。 两个[0xFFFF、0xFFFF}字上的 CRC 结果与所附的代码片段不一致、代码片段应在软件中计算完全相同的结果

    #include 
    #include 
    
    unsigned int CRC_Init = 0xFFFF;
    unsigned int I;
    unsigned int CRC_INP[]={0xFFFF、0xFFFF、0x5042、0x0010、// 16个随机16位数字
    0x7ff7、0xf86a、0xb58e、0x7651、//这些数字可以是
    如果需要、可修改0x8b88、0x0679、0x0123、0x9599、//
    0xc58c、0xd1e2、0xe144、0xb691};
    无符号 int crc_results;
    unsigned int sw_results;
    unsigned int crc_new;
    
    //软件算法函数定义
    unsigned int CCITT_Update (unsigned int、unsigned int);
    
    int main (void)
    {
    CRC_New = CRC_Init; //将 CRC Init 值放入 CRC_New 中
    对于(I = 0;I < 2;I++)
    {
    //软件算法中的输入值(需要8位输入)
    //清除高8位以获得低字节
    unsigned int LowByte =(CRC_INP[i]和0x00FF);
    //向右移动8位以获得高位字节
    unsigned int UpByte =(CRC_INP[i]>> 8);
    //第一个输入低字节
    CRC_New = CCITT_Update (CRC_New、LowByte);
    //然后输入高字节
    CRC_New = CCITT_Update (CRC_New、UpByte);
    }
    SW_Results = 0xFFFF;
    
    printf ("%x\r\n"、(uint32_t) crc_new);
    
    }
    
    //软件算法- 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;
    } 

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

    我现在已经花了几个小时来讨论这个问题、在任何情况下、我都无法复制 BSL 提供的结果。 TI、您能否执行以下操作:

    *将 MSP430FR2311置于 BSL 模式

    *批量擦除

    *解锁

    *发送一条从长度为2的0xf100开始的 CRC 命令

    我得到的结果是0x0000。 使用上述答案中提供的软件定义的 CRC 代码、此地址的 CRC 应为 0x1d0f。 这似乎表明 BSL 结果不正确。  

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

    TI:此答案无效。

    请按照以下步骤操作:

    *输入 BSL

    *批量擦除

    *使用默认密码解锁

    *从长度为2的0xf100请求 CRC

    *结果应为0x0000

    *使用建议答案中的代码、将 CRC 数据的前2个字更改为0xFFFF、并将 CRC 长度更改为2。 结果将与 BSL 的计算结果不相似。 这表明 BSL 的计算 CRC 与此代码的计算方式不同。

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

    尊敬的 Chris Seto:感谢您的详细反馈! 今天、我们正忙于处理另一个问题、我们只阅读并理解您的问题。 我们将在您的步骤之后进行测试。

    我检查了 CRC 代码、包括硬件 CRC 和软件 CRC。 我认为代码应该是正确的。

    如果您有时间,请缩短 CRC 计算长度,例如从 FRAM 的起始地址开始32个字节,并检查 CRC 结果是否匹配。 它应该有助于隔离此问题。

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

     您好、Xiaodong、

    即使 CRC 长度为1、也会失败。 再次参考我的上述过程、您能否确认0xFFFF 数据上长度为1字的 CRC 是否会导致0x0000的 CRC? 因为这是 BSL CRC 在批量擦除后产生的结果。 根据您的示例代码、这是不正确的、这将导致 CRC 为0。 请再次尝试附加的代码。 这将导致与在批量擦除后向 BSL 请求长度为1的字 CRC 相同的 CRC。

    #include 
    #include 
    
    uint16_t CRC_Init = 0xFFFF;
    uint16_t I;
    uint16_t CRC_INP[]={0xFFFF、0x1096、0x5042、 0x0010、// 16个随机16位数字
    0x7ff7、0xf86a、0xb58e、0x7651、//这些数字可以是
    如果需要、可修改0x8b88、0x0679、0x0123、0x9599、//
    0xc58c、0xd1e2、0xe144、0xb691};
    uint16_t CRC_Results;
    uint16_t sw_results;
    uint16_t crc_new;
    
    //软件算法- CCITT CRC16代码
    uint16_t CCITT_Update (uint16_t init、uint16_t input)
    {
    uint16_t CCITT;
    CCITT =(uint8_t)(init >> 8)|(init << 8);
    CCITT ^=输入;
    CCITT ^=(uint8_t)(CCITT & 0xFF)>> 4;
    CCITT ^=(CCITT << 8)<< 4;
    CCITT ^=((CCITT & 0xFF)<< 4)<< 1;
    返回 CCITT;
    }
    
    int main (void)
    {
    CRC_New = CRC_Init; //将 CRC Init 值放入 CRC_New 中
    对于(i = 0;i < 1;i++)
    {
    //软件算法中的输入值(需要8位输入)
    //清除高8位以获得低字节
    unsigned int LowByte =(CRC_INP[i]和0x00FF);
    //向右移动8位以获得高位字节
    unsigned int UpByte =(CRC_INP[i]>> 8);
    //第一个输入低字节
    CRC_New = CCITT_Update (CRC_New、LowByte);
    //然后输入高字节
    CRC_New = CCITT_Update (CRC_New、UpByte);
    }
    SW_Results = CRC_New;
    
    printf ("%x\r\n"、SW_Results);
    }
    
    
    

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

    好的。 我只是想知道这里发生了什么。  

    BSL 不是16位字对齐。 它是字节对齐的。 这意味着、如果您想要 CRC、例如4个16位字、那么为 BSL 提供的长度值需要为8、而不是4。  

    我不知道 TI 在这里实施了什么、但这需要在某个地方进行记录。 我猜这样做是为了让用户可以请求 BSL 为非字对齐数据生成 CRC、当与字数据一起使用时、CRC 仍然是正确的、但再说一次、无论在这里发生什么、都需要对其进行记录。  

    现在、我能够获得以下代码来同意针对整个 FRAM 区域的 CRC 向 BSL 提出的请求。 使用以下 BSL 参数:start 0xf100、length 1920 (words)* 2.

    #define firmware_start_address 0xf100
    #define firmware_FRAM_SIZE 1920
    #define CRC_INIT 0xFFFF
    静态空 CrcFirmware (void)
    {
    uint16_t I;
    uint16_t* flash_ptr =(uint16_t*) firmware_start_address;
    
    //输入第一个字来初始化 CRC 硬件
    CRCINIRES = CRC_INIT;
    
    对于(i = 0;i < firmware_FRAM_SIZE;i++)
    {
    CRCDIRB = FLASH_PTR[i];
    }
    
    //保存结果
    firmware_crc = CRCINIRES;
    } 

     

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

    您好、Chris Seto

    感谢您的更新和澄清。 我们已经执行测试并确认 BSL 和代码示例之间的 CRC 结果相同、因为长度是按"字节"计算的。

    根据我们的讨论、我们了解到 BSL UG 第21页上长度(命令数据)的描述并不是100%不清楚。 但是、有提示指出、指定长度的方法是在下面的" UART PI 示例"上通过"字节"以及代码示例。

    但我完全同意您的看法、即长度的定义不清楚(应指出长度是按"字节"计算的)。 我将请求在 BSL UG 上进行修改、以更新长度的定义。

    再次感谢您的评论! 欢迎您再次与我们分享宝贵意见。

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

    您好、Chris Seto

    我认为你的问题已经得到解决。 如果是、我将关闭此主题。

    再次感谢您的评论! 欢迎您再次与我们分享宝贵意见。