CRC3代码整理

时间:2024-05-20 15:21:05

CRC3代码
在做SPI通信时用到了CRC3校验
CRC3代码整理
看了很多代码终于整理出一版。
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;

}