wangcharley 发表于 2024-1-16 11:35:35

MODBUS CRC16怎么配置

WORD ModbusCRC(BYTE * pData, BYTE len)
{
BYTE byCRCHi = 0xff;
BYTE byCRCLo = 0xff;
BYTE byIdx;
WORD crc;
while(len--) {
byIdx = byCRCHi ^* pData++;
byCRCHi = byCRCLo ^ gabyCRCHi;
byCRCLo = gabyCRCLo;
}
crc = byCRCHi;
crc <<= 8;
crc += byCRCLo;
return crc;
}多项式0x180D

我的配置
void MF_CRC_Init(void)
{
    FL_CRC_InitTypeDef    CRC_InitStruct;

    CRC_InitStruct.initVal = 0x00000000;
    CRC_InitStruct.polynomial = 0x0000180D;
    CRC_InitStruct.polynomialWidth = FL_CRC_POLYNOMIAL_16B;
    CRC_InitStruct.dataWidth = FL_CRC_DATA_WIDTH_8B;
    CRC_InitStruct.calculatMode = FL_CRC_CALCULATE_SERIAL;
    CRC_InitStruct.reflectIn = FL_CRC_INPUT_INVERT_NONE;
    CRC_InitStruct.reflectOut = FL_CRC_OUPUT_INVERT_NONE;
    CRC_InitStruct.xorReg = 0x00000000;
    CRC_InitStruct.xorRegState = FL_DISABLE;
    // FL_CRC_StructInit(&CRC_InitStruct);
    FL_CRC_Init(CRC, &CRC_InitStruct);
}





qeeuly 发表于 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;
}

页: [1]
查看完整版本: MODBUS CRC16怎么配置