程序:
// X16+X12+X5+1 : 1,0001,0000,0010,0001 :0x11021
unsigned char crcbuff [] = { 0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};
unsigned int crc; // CRC 码
void main(void)
{
unsigned char *ptr;
crc = 0; // CRC 初值
ptr = crcbuff; // 指向第一个 Byte 数据0x11021
crc = crc16l(ptr,8);
while(1);
}
/**
* @brief CRC16CTTTL的校验
* @note 十六进制:0x11021
* 二 进 制:0B10001000000100001
* 多 项 式:X16+X12+X5+1
*/
// unsigned int crc; // CRC 码
unsigned int crc16l(unsigned char *ptr,unsigned char len) // ptr 为数据指针,len 为数据长度
{
unsigned char i;
while(len--)
{
for(i = 0x80; i!=0; i>>=1)
{
if((crc & 0x8000) !=0 ) // 判断第16位是不是 = 1
{
crc <<= 1;
crc ^= 0x1021; // 1-1
}else
{
crc <<= 1; // 1-2
}
if((*ptr & i) != 0) // 判断第16位是不是 = 1
{
crc ^= 0x1021; // 1-3(异或运算)
}
}
ptr++;
}
return(crc);
}