请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28377D Thread 中讨论的其他器件:C2000WARE、 controlSUITE
您好!
我已将 C2000Ware 1.00.03.00软件包中的 VCU CRC8库集成到我的 CCS 项目中。 我打算在 CAN 消息中生成字节的 CRC8。 是的、我知道已经可以为消息执行 CRC。
无论如何、我已经使用 了 C2000Ware_1_00_03_00_Software\libraries\DSP\VCU\c28\examples\CRC\2837x_vcu2_CRC_8项目中的示例、并在我的代码库中实现了这些示例。
我仅尝试在8个字节上生成 CRC8。 我发现、对于 VCU、字节需要打包到 uint16_ts 中。 我确认 CRC8正确无误、我对数据感到满意。
真正令我困扰的是、如果使用基于汇编的函数、生成 CRC8需要超过8ms、如果使用基于 C 的函数、则需要更长时间。 我仅在8个字节、4个字上生成 CRC8。 请参阅下面的配置:
/** * CRC 对象初始化。 无缓冲器或字节计数、因为它们将因 CAN 消息而异。 */ 静态 void CAN_init_CRC (void){ /*步骤1:初始化 CRC 对象*/ CRC.seedValue = init_CRC8; crc.nMsgBytes = 0; crc.parity = CRC_奇 偶校验; crc.crcResult = 0; crc.pMsgBuffer = 0; crc.pCrcTable =(uint16_t*)&crc8Table[0]; CRC.init =(void (*)(void *)) crc_init8Bit; CRC.run =(void (*)(void *)) crc_run8Bit; /*步骤2:初始化句柄*/ handleCRC =&CRC; /*步骤3:运行8位表查找 CRC 例程并保存结果*/ CRC.init(handleCRC); }
/** *用于计算给定有效载荷数组上 CRC*的函数。 * */ 静态内联 uint16_t CAN_calc_crc (uint16_t*有效载荷、uint16_t DLC){ uint16_t RESP = 0U; uint16_t packed_payload[4U]={0}; uint16_t wordcIdx = 0U; /** *将有效载荷中的每个字节打包为连续数据 LSBMSB 格式 * PAYLOAD[n]->紧凑[字](LSB) * PAYLOAD[n+1]->紧凑[字](MSB) * for (uint16_t id = 0U;id < dlc;id += 2){ packed_payload[wordcIdx]|=(payload[id]); packed_payload[wordcIdx]|=(payload[id + 1]<< 8); wordIdx++; } crc.pMsgBuffer = packed_payload; /*-1以不在计算中包含 CRC 字节*/ crc.nMsgBytes = DLC - 1; CRC.run(handleCRC); RESP =(uint16_t) crc.crcResult; crc.crcResult = 0; 返回(RESP); }
使用示波器和一些 GPIO 切换、我可以看到"CAN_calc_crc"函数需要8ms 的返回时间。 这是正常的吗? 显式启用 VCU 是否需要一些标志? 我使用的是 VCU2、其中包含的库为"C28x_vcu2_library_fpu32.lib"
此致。