打印

请教 古道热肠 DS18B20 CRC

[复制链接]
1703|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在您的帖子中
uchar CalculateCRCValue(uchar ucNewData,uchar ucCRCValue)
{
    bit bXorValue;        //
    uchar ucTempValue;        //模拟CRC硬件内部的8位数据寄存器
    uchar ucCount;
    for(ucCount=0; ucCount<8; ucCount++)
    {
        //提取新数据位与CRC寄存器的内容的异或值的D0位作为内部通道的输入
        bXorValue = (ucNewData ^ ucCRCValue)& 0x01;
        //执行X4、X5的异或操作
        if(bXorValue)
        {
            ucTempValue = ucCRCValue ^ 0x18;
        }
        else
        {
            ucTempValue = ucCRCValue;
        }
        //CRC寄存器无进位右移
        ucTempValue >>= 1;
        //补上进位位,即D0位
        if(bXorValue)
        {
            ucCRCValue = ucTempValue | 0x80;
        }
        else
        {
            ucCRCValue = ucTempValue;
        }
        
        //为处理下一位作准备
        ucNewData >>= 1;
    }
    return ucCRCValue;
}

这个    ucTempValue = ucCRCValue ^ 0x18;
0x18是怎么来的,照我的理解应该是0x31

看图片上的逻辑应该这样算才对啊
uchar Calculate_CRC_byte(uchar NewData,uchar CRCValue) //单字节CRC计算
{
    bit bXorValue;        
    uchar Count;
    for(Count=0; Count<8; Count++)
        bXorValue = ((NewData & 0x01)*0x80) !=  (CRCValue&0x80);
     
        CRCValue <<= 1;
        if(bXorValue)
        {
           CRCValue ^= 0x31;
        }
        //为处理下一位作准备
        NewData >>= 1;
    }
    return CRCValue;
}

这样理解有什么不对? 请明白人指点,谢谢!

相关帖子

沙发
wsl_5631|  楼主 | 2012-5-25 09:27 | 只看该作者
有高手指点吗?

使用特权

评论回复
板凳
hotpower| | 2012-5-25 09:34 | 只看该作者

使用特权

评论回复
地板
hotpower| | 2017-5-14 10:00 | 只看该作者
实际上标准的为0x8c。估计达拉斯的人也没搞明白crc的原理

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

335

帖子

2

粉丝