CRC3代码
在做SPI通信时用到了CRC3校验
看了很多代码终于整理出一版。
u1 crc3_high_first2(u4 spi_frame)
{
u1 i;
u4 crc=spi_frame; /* 计算的初始crc值 /
u4 chk = 0x08;
u4 poly = 0x0B; / 多项式1011 */
chk <<= 20;
poly<<= 20;
for (i=0; i<21; i++) /* 下面这段计算过程与计算一个字节crc一样 */
{
if (crc & chk)
{
crc ^= poly;
}
chk >>= 1;
poly >>= 1;
}
return ((u1)(crc));
}
另外之前搜集的多字节,单字节crc
/* 多个字节 的crc校验代码 */
u1 crc8_high_first(u1 ptr, u1 len)
{
u1 i;
u1 crc=0x00; / 计算的初始crc值 */
while(len--)
{
crc ^= *ptr++; /* 每次先与需要计算的数据异或,计算完指向下一数据 */
for (i=8; i>0; --i) /* 下面这段计算过程与计算一个字节crc一样 */
{
if (crc & 0x80)
crc = (crc << 1) ^ 0x31;
else
crc = (crc << 1);
}
}
return (crc);
}
单字节
u1 cal_table_high_first(unsigned char value)
{
u1 i, crc;
crc = value;
/* 数据往左移了8位,需要计算8次 */
for (i=8; i>0; --i)
{
if (crc & 0x80) /* 判断最高位是否为1 */
{
/* 最高位为1,不需要异或,往左移一位,然后与0x31异或 */
/* 0x31(多项式:x8+x5+x4+1,100110001),最高位不需要异或,直接去掉 */
crc = (crc << 1) ^ 0x31; }
else
{
/* 最高位为0时,不需要异或,整体数据往左移一位 */
crc = (crc << 1);
}
}
return crc;
}