本帖最后由 地瓜patch 于 2024-1-16 22:25 编辑
CRC控制器第一次在数据手册里看到有CRC控制器。
一开始直观的认为是一个硬件功能。
仔细看了又看,是一个软件功能。
仔细查找,的确是发现了一些端倪。
在C文件中给出了各个CRC校验的算法实现函数。
//进行CRC-32模式计算,种子值 0xffffffff,byTransData数组前3个数据
uint32_t csi_crc32_be(uint32_t wCrcSeed, uint8_t* pbyData, uint32_t wSize)
{
uint32_t i;
csp_crc_set_poly(CRC, 3); //Set CRC-32
csp_crc_refin_enable(CRC, DISABLE); //Disable bitwise reversal of control of CRC input data
csp_crc_refout_enable(CRC, DISABLE); //Disable bitwise reversal of control of CRC output data
csp_crc_xorout_enable(CRC, DISABLE); //Disable XOR control of CRC output data
csp_crc_set_seed(CRC, wCrcSeed); //Set CRC seed value
for (i=0; i<wSize; i++)
{
*(uint8_t *)(APB_CRC_BASE + 0x14 + (i%4)) = *pbyData; //Write data
pbyData++;
}
return (csp_crc_get_result(CRC)); //Return the result of calculation
}
//进行CRC-16/CCITT模式计算,种子值0x00,byTransData数组前16个数据
uint16_t csi_crc16_ccitt( uint16_t hwCrcSeed, uint8_t *pbyData, uint32_t wSize)
{
uint32_t i;
csp_crc_set_poly(CRC, 0); //Set CRC-CCITT
csp_crc_refin_enable(CRC, ENABLE); //Enables bitwise reversal of control of CRC input data
csp_crc_refout_enable(CRC, ENABLE); //Enables bitwise reversal of control of CRC output data
csp_crc_xorout_enable(CRC, DISABLE); //Disable XOR control of CRC output data
csp_crc_xorin_enable(CRC, DISABLE); //Enables XOR control of CRC input data
csp_crc_set_seed(CRC, hwCrcSeed); //Set CRC seed value
for (i=0; i<wSize; i++)
{
*(uint8_t *)(APB_CRC_BASE + 0x14 + (i%4)) = *pbyData; //Write data
pbyData ++;
}
return ((uint16_t)csp_crc_get_result(CRC)); //Return the result of calculation
}
//进行CRC-16模式计算,种子值0x00,byTransData数组前5个数据
uint16_t csi_crc16(uint16_t hwCrcSeed, uint8_t* pbyData, uint32_t wSize)
{
uint32_t i;
csp_crc_set_poly(CRC, 2); //Set CRC-16
csp_crc_refin_enable(CRC, ENABLE); //Enables bitwise reversal of control of CRC input data
csp_crc_refout_enable(CRC, ENABLE); //Enables bitwise reversal of control of CRC output data
csp_crc_xorout_enable(CRC, DISABLE); //Disable XOR control of CRC output data
csp_crc_set_seed(CRC, hwCrcSeed); //Set CRC seed value
for (i=0; i<wSize; i++)
{
*(uint8_t *)(APB_CRC_BASE + 0x14 + (i%4)) = *pbyData; //Write data
pbyData ++;
}
return ((uint16_t)csp_crc_get_result(CRC)); //Return the result of calculation
}
//进行CRC-16 XMODEM模式计算,种子值0x00,byTransData数组前3个数据
uint16_t csi_crc16_itu(uint16_t hwCrcSeed, uint8_t* pbyData, uint32_t wSize)
{
uint32_t i;
csp_crc_set_poly(CRC, 0); //Set CRC-CCITT
csp_crc_refin_enable(CRC, DISABLE); //Enables bitwise reversal of control of CRC input data
csp_crc_refout_enable(CRC, DISABLE); //Enables bitwise reversal of control of CRC output data
csp_crc_xorout_enable(CRC, DISABLE); //Disable XOR control of CRC output data
csp_crc_set_seed(CRC, hwCrcSeed); //Set CRC seed value
for (i=0; i<wSize; i++)
{
*(uint8_t *)(APB_CRC_BASE + 0x14 + (i%4)) = *pbyData; //Write data
pbyData ++;
}
return ((uint16_t)csp_crc_get_result(CRC)); //Return the result of calculation
}
说句实话,我一直用RCR-16 Modbus校验,哈哈
CRC控制器还是少了。
|