打印
[产品]

CRC校验

[复制链接]
49|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
macpherson|  楼主 | 2024-11-17 18:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、注意事项

    HC32L072的CRC校验为CRC-16-X25(非CCITT),初始值和结果异或值均为0xffff,输入输出数据均需要反转。

二、硬件CRC相关函数

1、开启CRC外设

Sysctrl_SetPeripheralGate(SysctrlPeripheralCrc, TRUE);        ///< 开启CRC外设时钟模块

2、CRC16编码生成

uint16_t CRC16_Get8(uint8_t* pu8Data, uint32_t u32Len)

param [in]  pu8Data          待编码数据指针(字节方式输入)

param [in]  u32Len           待编码数据长度(字节数)

retval CRC16                 CRC16编码值.      

3、CRC16值校验

en_result_t CRC16_Check8(uint8_t* pu8Data, uint32_t u32Len, uint16_t u16CRC)

param [in]  pu8Data          待校验数据指针(字节方式输入)

param [in]  u32Len           待校验数据长度(字节数)

param [in]  u16CRC           待校验CRC16值

retval Ok                    CRC校验正确

retval Error                 CRC校验错误   

三、C语音CRC校验函数

/**

*****************************************************************************

** \brief CRC16 编码(字节填充方式)

**

** 该函数主要用于生成CRC16编码.

**

** \param [in]  pu8Data          待编码数据指针(字节方式输入)

** \param [in]  u32Len           待编码数据长度(字节数)

**

** \retval CRC16                 CRC16编码值.

*****************************************************************************/

uint16_t CRC16_Get8(uint8_t* pu8Data, uint32_t u32Len)

{

    uint16_t crc_poly = 0x8408; //Bit sequence inversion of 0x1021

    uint16_t crc_resault = 0xFFFF; //CRC register

    for(uint32_t i = 0; i < u32Len; i++)

    {

        crc_resault ^= pu8Data[i]; //8-bit data



        for (uint8_t j = 0; j < 8; j++)

        {

            if (crc_resault & 0x0001)

                crc_resault = (crc_resault >> 1) ^ crc_poly;

            else

                crc_resault >>= 1;

        }

    }

    return crc_resault ^ 0xFFFF;

}
四、校验数据

1、输入数据

uint8_t  au8CrcTestData[8] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0};

2、结果

0x5234  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

1578

帖子

1

粉丝