1、CRC8_SAE_J1850_ZERO (E2Ep01A)
- 初始 INITCRC:0x00
- 最终异或值 CRCOUT:0x00
- 多项式 Poly:x^ 8 + x^ 4 + x^ 3 + x^2 + 1
- 多项式转二进制:上面的x的几次方,就是在第几位上为1
- 二进制:100011101
- 由于我们是CRC8,只有八位,所以舍弃最高位,最后得到的Poly为:00011101
- 为了方便书写,我们将二进制转16进制,即 Poly= 0x1D
- 输入是否反转:否
- 结果是否反转:否
uint8_t CalculateCRC8(uint8_t * u8_data, uint8_t u8_len)
{uint8_t i, j;uint8_t crc8;uint8_t poly;crc8 = 0x00;poly = 0x1D;for (i = 0; i < u8_len; i++){crc8 ^= u8_data[i];for (j = 0; j < 8; j++){if (crc8 & 0x80){crc8 = (crc8 << 1) ^ poly;}else{crc8 <<= 1;}}}return crc8;
}
2、CRC8 普通版
MT上位机相关使用的CRC。
init需要传入0XFF。
uint8_t CRC8_0x07(uint8_t *ptr,uint16_t len,uint8_t init)
{uint8_t crc;uint8_t i;crc = init;while(len--){crc ^= *ptr++;for(i = 0;i < 8;i++){if(crc & 0x80){crc = (crc << 1) ^ 0x07;}else crc <<= 1;}}return crc;
}
- 初始 INITCRC:0xFFFF
- 最终异或值 CRCOUT:0x00
- 多项式 Poly:x^ 16 + x^ 12 + x^ 5 + 1
- 输入是否反转:否
- 结果是否反转:否
3、CRC16/CCITT-FALSE (E2E profile5)
/****************************Info********************************************** * Name: CRC-16/CCITT-FALSE x16+x12+x5+1 * Width: 16 * Poly: 0x1021 * Init: 0xFFFF * Refin: False * Refout: False * Xorout: 0x0000 * Note: *****************************************************************************/
uint16_t CRC16_CCITT_FALSE(uint8_t *data, uint16_t datalen)
{uint16_t crc = 0xFFFF;uint16_t Poly = 0x1021;while (datalen--) {crc ^= *(data++) << 8;for(int i = 0;i < 8;i++){if(crc& 0x8000)crc= (crc<< 1) ^ Poly ;elsecrc= crc<< 1;}}return crc;