一、注意事项
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
|