|
发表于 2024-2-28 15:12:48
|
显示全部楼层
这是LG023上实现的modbus crc16,供参考。
顺便吐槽一下论坛,发个帖要审核几周,管理员回复1周以上,外人回复要审核几周。官方忙,客户等不起,黄花菜都凉,技术交流变鸡肋。
资料也不好找,改版后分成了资料下载和技术交流,资料下载又分好几个版块,每个版块里面堆满各型号单片机的资料,要找齐某个单片机的资源要在几个版块翻,有时还翻好几页,费老劲了;以前呢,全套资料就在技术交流各个单片机版块置顶,方便得很。
//modbus crc16初始化
//多项式:0x8005; 初始值:全FF; 输出:异或; 异或值:0
void MF_CRC_Init(void)
{
FL_CRC_InitTypeDef CRC_InitStruct;
CRC_InitStruct.initVal = 0xFFFFFFFF;
CRC_InitStruct.polynomial = 0x00008005;
CRC_InitStruct.polynomialWidth = FL_CRC_POLYNOMIAL_16B;
CRC_InitStruct.dataWidth = FL_CRC_DATA_WIDTH_8B;
CRC_InitStruct.calculatMode = FL_CRC_CALCULATE_PARALLEL;
CRC_InitStruct.reflectIn = FL_CRC_INPUT_INVERT_BYTE;
CRC_InitStruct.reflectOut = FL_CRC_OUPUT_INVERT_BYTE;
CRC_InitStruct.xorReg = 0x00000000;
CRC_InitStruct.xorRegState = FL_ENABLE;
FL_CRC_Init(CRC, &CRC_InitStruct);
}
uint16_t CRC16_Cal(uint8_t *data, uint16_t length)
{
CRC->LFSR = 0xFFFFFFFF; //计算crc须先设置初始值
while(length--)
{
FL_CRC_WriteData(CRC, *data++);
while(FL_CRC_IsActiveFlag_Busy(CRC));
}
return FL_CRC_ReadData(CRC) & 0xFFFF;
}
|
|