查看: 167|回复: 1

MODBUS CRC16怎么配置

[复制链接]

41

主题

59

帖子

483

积分

高级工程师

Rank: 3Rank: 3

积分
483
发表于 2024-1-16 11:35:35 | 显示全部楼层 |阅读模式
  1. WORD ModbusCRC(BYTE * pData, BYTE len)
  2. {
  3. BYTE byCRCHi = 0xff;
  4. BYTE byCRCLo = 0xff;
  5. BYTE byIdx;
  6. WORD crc;
  7. while(len--) {
  8. byIdx = byCRCHi ^* pData++;
  9. byCRCHi = byCRCLo ^ gabyCRCHi[byIdx];
  10. byCRCLo = gabyCRCLo[byIdx];
  11. }
  12. crc = byCRCHi;
  13. crc <<= 8;
  14. crc += byCRCLo;
  15. return crc;
  16. }
复制代码
多项式  0x180D

我的配置
  1. void MF_CRC_Init(void)
  2. {
  3.     FL_CRC_InitTypeDef    CRC_InitStruct;

  4.     CRC_InitStruct.initVal = 0x00000000;
  5.     CRC_InitStruct.polynomial = 0x0000180D;
  6.     CRC_InitStruct.polynomialWidth = FL_CRC_POLYNOMIAL_16B;
  7.     CRC_InitStruct.dataWidth = FL_CRC_DATA_WIDTH_8B;
  8.     CRC_InitStruct.calculatMode = FL_CRC_CALCULATE_SERIAL;
  9.     CRC_InitStruct.reflectIn = FL_CRC_INPUT_INVERT_NONE;
  10.     CRC_InitStruct.reflectOut = FL_CRC_OUPUT_INVERT_NONE;
  11.     CRC_InitStruct.xorReg = 0x00000000;
  12.     CRC_InitStruct.xorRegState = FL_DISABLE;
  13.     // FL_CRC_StructInit(&CRC_InitStruct);
  14.     FL_CRC_Init(CRC, &CRC_InitStruct);
  15. }
复制代码






回复

使用道具 举报

0

主题

1

帖子

16

积分

初级工程师

Rank: 1

积分
16
发表于 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;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表