DS18B20的CRC验证算法,代码如下
uint8_t crcCalc(void *src, uint8_t size)
{
//crc-8/MAXIM
//x8 + x5 + x4 + 1
//多项式:31
//crc初始值:0
//计算结果异或值:0
//当数组最后一位含有CRC值时,输出0,否则输出计算的CRC
/*
//Test
uint8_t buf[10] = {0xbd, 0x01, 0x4b, 0x46, 0x7f, 0xff, 0x03, 0x10, 0xff};
uint8_t buf1[10] = {0xc0, 0x01, 0x4b, 0x46, 0x7f, 0xff, 0x10, 0x10, 0x8f};
uint8_t result2 = crcCalc(buf1, 8);
uint8_t result3 = crcCalc(buf, 8);
printf("result2 is %d %x\r\n", result2, result2); //0x8f
printf("result3 is %d %x\r\n", result3, result3); //0xff
uint8_t result2 = crcCalc(buf1, 9);
uint8_t result3 = crcCalc(buf, 9);
printf("result2 is %d %x\r\n", result2, result2); //0
printf("result3 is %d %x\r\n", result3, result3); //0
*/
uint8_t ret = 0;
uint8_t *p;
int i = 0;
uint8_t pBuf = 0;
p = (uint8_t*)src;
while(size--)
{
pBuf = *p ++;
for ( i = 0; i < 8; i ++ )
{
if ((ret ^ (pBuf)) & 0x01)
{
ret ^= 0x18;
ret >>= 1;
ret |= 0x80;
}
else
{
ret >>= 1;
}
pBuf >>= 1;
}
}
return ret;
}