您好!
我正在尝试找到一种软件算法、该算法计算的 CRC 与 TMS570LC4357中的 CRC 单元相同(请参阅此主题: http://e2e.ti.com/support/microcontrollers/hercules/f/312/p/716945/2749159#2749159)。
我在这个论坛上尝试了 Richard Burke 的一个实现、也尝试了 pycc 生成的基于表格的例程、pycc 是 Sunil Oak 在另一个主题中推荐的工具。
我看到的是:Richard Burk 和 pycrc 例程的实现返回的值完全相同、但它们与处理器中硬件 CRC 单元生成的 CRC 不同。
以下是我的测试代码、包括 pycrc 参数:
#define CRC_CTRL0 (*(volatile UINT32 *) 0xFE000000U) #define CRC_CTRL2 (*(volatile UINT32 *) 0xFE000010U) #define CRC_SIGREG (*(volatile uint64 *) 0xFE000060U) /*来自 SafeTI 诊断库(sl_MISC.c)的函数*/ /* SAFETYMCUSW 61 D MR:8.10、8.11 Common_1*/ uint64 SL_CRC_Calculate (uint64* startAddr、const UINT32 count64) { volatile UINT32 count = 0U;/* volatile 以防止优化*/ CRC_CTRL0 |= 0x00000001U;//重置 CRC 模块*/ CRC_CTRL0 &= 0x3U* FFCTRL0 |= 0x00000001U;//将 CRC2000*配置为完整 CPU | CRCTRF000UFFW*| CRC_FFW*| CRCTRF0XUFFW*| CRC2000UFFW* 12.2. 注释_5*/*SAFETYMCUSW 134 S MR:12.2 comment_5*/ for (count=0U;count < count64;count++){ /*SAFETYMCUSW 45 D MR:21.1 备注_2*/ /*SAFETYMCUSW 93 S MR:6.1、6.2、10.1、10.2、10.3、10.4 "LDRA 工具问题"*/ CRC_SIGREG =(uint64)(* startAddr); /*SAFETYMCUSW 45 D MR:21.1 备注_2*/ /*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/ startAddr++; } return (crc_SIGREG); } // Richard Burke 手动实现的示例*/ crc_t crc_update_word (crc_t crc、crc_t data) { int i、j; crc_t nextCrc = 0; //对于63到0环路中的 I for (i = 63;i >=0;i---) { // next _CRC_VAL (0):= CRC_VAL (63) XOR data (I); nextCrc =(nextCrc &(crc_t)0xfffffffffffffffffffffffe)|((CRC >> 63)^(data >> I)); //对于 j in 1到63循环 对于(j = 1;j < 64;j++) { //case j 为 //当1|3|4 =>时 if (j = 1 || j = 3 || j = 4) { // NEW_CRC_VAL (j):= CRC_VAL (j - 1) XOR CRC_VAL (63) XOR DATA (i); nextCrc =(nextCrc &~((crc_t)1 << j))|((((CRC >>(j-1)))^(CRC >> 63)^(数据>> I))& 1)<< j); } 其他 {//当其他人=>时 // next _CRC_VAL (j):= CRC_VAL (j - 1); nextCrc =(nextCrc &~((crc_t)1 << j))|(((CRC >>(j-1))& 1)<< j); } //结束大小写; } //结束循环; CRC = nextCrc; } //结束循环 返回 CRC; } void CRC_TEST (void) { uint64 CRC_TEST_VALUE = 0x8DF8A32C74B91F3E; uint8 CRC_TEST_array1[8]={0x8D、0xf8、0xA3、0x2C、0x74、 0xB9、0x1F、0x3E}; uint64 Result_CRC_SAFE_ti_lib = 0U; uint64 Result_CRC_Burke = 0U; uint64 Result_CRC_Pycrc = 0U; Result_CRC_SAFE_ti_lib = SL_CRC_Calculate (&CRC_TEST_VALUE、1U);crc_crc_py_crc = 0U ;crc_result = 0U*将 CRC_Wet/ CRC_WIT_DULE = 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * /* *在2018年12月12日12:46:55日生成 *由 pycc v0.9.1, https://pycrc.org *使用配置 :*-宽度 = 64 *-聚酯 = 0x00000000001b *- XorIn = 0x0000000000000000 *-反射式 =错误 *- XorOut = 0x0000000000000000 *- ReflectOut = False *-算法 =表驱动 **/ result_crc_pycrc = crc_init (); result_crc_pycrc = crc_update (result_crc_pycrc、(unsigned char *)&crc_test_value、8); result_crc_pycrc = crc_dfinalize (result_crc_pycrc); while (1); }
结果:
RESULT_CRC_SAFE_TI_lib = 0x2646CEB873922B5F
RESULT_CRC_Bike = 0x2646CED073922BFD
Result_CRC_pycrc = 0x2646CED073922BFD
基元多项式与处理器参考手册中提到的相同、并且我禁用了所有额外的反射和 XOR 值。
可能出什么问题了?
此致、
Jens