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.

[参考译文] LAUNCHXL-CC26X2R1:使用扇区擦除来擦除时获取 CCFG 的 CRC 不匹配

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1490286/launchxl-cc26x2r1-getting-crc-mismatch-for-ccfg-while-erasing-using-sector-erase

器件型号:LAUNCHXL-CC26X2R1

工具/软件:

尊敬的团队:

 我将通过后门引导加载程序方法(SPI)刷写 CC2642控制器。

之前、我们正在进行存储体擦除、现在是为了保留切换到扇区擦除的 NVM (SNVS)。

我们一直进行擦除、直到 NVM (SE)、先写入数据、直到 NVM、然后我们使用 CRC 进行验证、现在 使用扇区擦除、我们无法单独擦除该 CCFG (88字节)、然后我们尝试从56000擦除中成功进行擦除。

然后我们编写了8KB 的数据(从56000到58000)、我们已经使用 CRC 验证了是否匹配。

问题是当我在验证 CRC 不匹配时仅计算88个字节的 CRC。 但如果从56000计算到58000、则表示匹配。 有人能解释一下这里发生了什么事吗?

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

    尊敬的 ARUL:

    上一篇文章: https://e2e.ti.com/f/1/t/1417833 

    您是否能够提供用于写入 CCFG 和计算 CRC32以用于匹配和不匹配用例的 SBL 命令和内容?  如何计算 CRC32来对照返回值进行检查?

    此致、
    Ryan

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

    您好、Ryan、

    感谢您的响应、扇区擦除(0x26)、

    写入 CCFG 的内容附加在图像中。

    devCrc_CCFG -->来自 TI 芯片的 CRC

    fileCrc_ccfg -->来自 IMXRT 的 CRC。

    从56000到58000 fileCrc_cfg 值= afc6ea16、devCrc_CCFG = afc6ea16 (工作案例)。

    对于57fa8至58000、 fileCrc_cfg 值= 29d265db、devCrc_CCFG =  57fa8 (非工作案例)。

    如果需要任何其他事项、请告诉我  

    谢谢

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

    谢谢、我对 每种情况下的 command_CRC32 (0x27)数据包的内容也很好奇。

    您能否确认 IMXRT 计算 CRC 的方式与 CC2652R1 SBL 完全相同?  以下是 SWRAA466中介绍的 sblAppEx 摘录。   这是否仅发生在 CCFG 中或存储器的其他部分?

    // Calculate crc32 checksum the way CC2538 and CC2650 does it.
    int calcCrcLikeChip(const unsigned char *pData, unsigned long ulByteCount)
    {
        unsigned long d, ind;
        unsigned long acc = 0xFFFFFFFF;
        const unsigned long ulCrcRand32Lut[] =
        {
            0x00000000, 0x1DB71064, 0x3B6E20C8, 0x26D930AC, 
            0x76DC4190, 0x6B6B51F4, 0x4DB26158, 0x5005713C, 
            0xEDB88320, 0xF00F9344, 0xD6D6A3E8, 0xCB61B38C, 
            0x9B64C2B0, 0x86D3D2D4, 0xA00AE278, 0xBDBDF21C
        };
    
        while ( ulByteCount-- )
        {
            d = *pData++;
            ind = (acc & 0x0F) ^ (d & 0x0F);
            acc = (acc >> 4) ^ ulCrcRand32Lut[ind];
            ind = (acc & 0x0F) ^ (d >> 4);
            acc = (acc >> 4) ^ ulCrcRand32Lut[ind];
        }
    
        return (acc ^ 0xFFFFFFFF);
    }

    此致、
    Ryan

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

    您好、Ryan、

    是的、我们使用相同的代码进行 CRC 计算、如果需要任何其他内容、请告诉我  

    谢谢  

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

     这是否仅发生在 CCFG 中或存储器的其他部分?  

    这仅适用于 CCFG (同样具有扇区擦除功能)、使用存储体擦除时、我获得了预期的 CRC (29d265db)。

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

    COMMAND_SECTOR_ERASE 和 COMMAND_BANK_ERASE 应对 CCFG 存储器执行相同的操作(CCFG 的内容将复位为与从 TI 提供器件时相同的值)、清除 CFG1/CCFG 或 BANK_ERASE_DIS CCFG 参数中的写保护 CCFG 闪存扇区位的异常。  您是否从器件获得了 ACK、您能否通过 JTAG 存储器确认读取 CCFG 内容在两种实例中是相同的?

    此致、
    Ryan

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

    JTAG 内存读取可以使用后门引导加载程序?

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

    我更倾向于使用后门引导加载程序发送命令、然后使用 JTAG 连接检查结果。  您还可以尝试使用 COMMAND_MEMORY_READ 串行引导加载程序命令。

    此致、
    Ryan

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

    Ryan、您好、我已经使用 COMMAND_MEMORY_READ 验证了 我在图像中附加的数据是正确的、下一步我们可以做什么?

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

    感谢您的验证。  您能否为 闪存的整个最后一页(从56000到58000)和仅为 CCFG 区域(57fa8到58000)及其返回数据包值(6字节)提供 COMMAND_CRC32数据包结构?  这也可以通过每次传输的逻辑分析仪屏幕截图显示。

    unsigned char ucCommand[15];
     ucCommand[0] = <size=15>;
     ucCommand[1] = <checksum>;
     ucCommand[2]= COMMAND_CRC32;
     ucCommand[3]= Data Address [31:24];
     ucCommand[4]= Data Address [23:16];
     ucCommand[5]= Data Address [15: 8];
     ucCommand[6]= Data Address [ 7: 0];
     ucCommand[7]= Data Size [31:24];
     ucCommand[8]= Data Size [23:16];
     ucCommand[9]= Data Size [15: 8];
     ucCommand[10]= Data Size [7: 0];
     ucCommand[11]= Read Repeat Count [31:24];
     ucCommand[12]= Read Repeat Count [23:16];
     ucCommand[13]= Read Repeat Count [15: 8];
     ucCommand[14]= Read Repeat Count [7: 0];

    为什么必须仅针对 CCFG 而不是针对应用程序的整个最后一个闪存页面计算 CRC?

    此致、
    Ryan