各位专家、您好!
SafeTILib 中的函数 SL_CRC_Calculate 不会返回正确的 CRC 值。
至于我可以告诉64位返回值的两个32位字、需要进行切换。
例如、函数返回"PSASIG2[31:0] PSASIG2[63:32]"而不是"PSASIG2[63:32] PSASIG2[31:0]"
这会在与预定的 CRC 进行比较时导致错误。
(Q1)这是 SafeTiLib 中的错误还是有原因?
谢谢、此致、
最大
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.
各位专家、您好!
SafeTILib 中的函数 SL_CRC_Calculate 不会返回正确的 CRC 值。
至于我可以告诉64位返回值的两个32位字、需要进行切换。
例如、函数返回"PSASIG2[31:0] PSASIG2[63:32]"而不是"PSASIG2[63:32] PSASIG2[31:0]"
这会在与预定的 CRC 进行比较时导致错误。
(Q1)这是 SafeTiLib 中的错误还是有原因?
谢谢、此致、
最大
您好 Jagadish、
我们使用此计算器确定用于测试 HW-CRC 模块的示例 CRC:
www.sunshine2k.de/.../crc_js.html
我们得到以下结果:

MCU 上的计算结果为: 
如果函数 SL_CRC_Calculate 读为"PSA_SIGREGH1 PSA_SIGREGL1"、则正确。 相反、它显示"PSA_SIGREGL1 PSA_SIGREGH1"
在查看《技术参考手册》时、我注意到寄存器描述也表明 sl_CRC_Calculate 使用的寄存器顺序错误:

sl_CRC_Calculate 以不同的顺序使用寄存器的原因是什么?
谢谢、此致、
最大
尊敬的 Max:
我看不到任何问题
"PSA_SIGREGH1"应存储 CRC 的较高字、但确实如此、因为它在您的情况下保存的是较高的字0x000000CA。
类似地、"PSA_SIGREGL1" 应存储 CRC 的低位字、而它确实会在 您的情况下保存低位字0x000006DC。
我希望您讨论的 是"sl_CRC_Calculation"函数的以下定义

这里看起来很好、我是说 CRC 是以64位变量计算的、然后返回相同的值。
--
谢谢、
Jagadish。
您好 Jagadish、
那么、我们的 CRC 计算是正确的。 问题是 SL_CRC_Calculate 返回 CRC、如 0x000006DC 000000CA、而不是0x000000CA 000006DC。 这是由于函数中的64位读取导致的。 它首先读取低字、然后读取高字、这意味着 CRC 字是不按顺序的。
但如果我理解正确的话,没有特殊的理由,我们可以正确地计算 CRC。我们只需要注意,单词的顺序是正确的。
尊敬的 Max:
我找到了问题的根本原因,只是因为它的不那么令人厌食。 由于 TMS570是大端字节序、最高有效字将存储在最低地址中、最低有效字将存储在最高地址中。 因此、我们需要在使用 CRC 时交换高字和低字。
请参阅以下主题
(+) RM57L843:RM57L843和 TMS570LC4357:64位多项式的 CRC 算法是否相同? -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛
--
谢谢、
Jagadish。