找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9909|回复: 7
打印 上一主题 下一主题
收起左侧

关于DS18B20的CRC-8校验计算的问题

[复制链接]
跳转到指定楼层
楼主
我从DS18B20中读出的64位ROM是28 ff 15 8a 74 16 4 72(16进制,下同),前56位是ROM,后8位是校验码。DS18B20的生成多项式是 x^8 + x^5 + x^4 + 1,即二进制 10011 0001,化十六进制为 0x131。 我计算校验码的时候,根据网上的教程:

1) 将56位数据左移8位,变成 28 ff 15 8a 74 16 4 00
2) 用 28 ff 15 8a 74 16 4 00 对 0x131 做模2除法

但最终得到的结果却是 0x36,而非读出的0x72。求问我是哪里出错了?正确的计算应该是什么样子的?求指导

下面图片是我具体的运算过程。





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:144830 发表于 2016-10-27 22:27 | 只看该作者
问题解决了。感谢 51黑dd 的帖子,http://www.51hei.com/bbs/dpj-47738-1.html
DS18B20使用CRC校验和常规的CRC校验并不一样,并不能按照我之前使用的算法计算。MAXIM官网有详细的中文介绍,链接如下:
应用笔记27 理解和运用Maxim iButton产品中的循环冗余校验(CRC)希望对同我有一样困惑的同学有帮助。
回复

使用道具 举报

板凳
ID:1 发表于 2016-11-13 20:51 | 只看该作者
解决就好,谢谢分享帮助更多的人.
回复

使用道具 举报

地板
ID:379441 发表于 2018-7-26 15:31 | 只看该作者
楼主 最后自己搞懂了 但是其他不懂的人来看 就看不懂了
本人仔细研究了楼主提供的资料 给“后来者”做一个说明
首先 楼主的算法是可以的,只是楼主的64位被除数排序错了
      原来楼主给出的排序是:十六进制28  FF  15  8A  74  16  04  00
                                       二进制0010  1000  1111  1111  0001  0101  1000  1010  0111  0100  0001  0110  0000  0100  0000 0000
      给出正确的排序前的说明:8位CRC码+48位序列号+8位系列码
                                          00  04  16  74  8A  15  FF  28(说明:DS18B20的系列码都是28H,这里CRC码写成00是因为楼主想通过余数与CRC码72H相等 判断读取的64位ROM数据正确)
      正确的排序应该是:将 00  04  16  74  8A  15  FF  28右移出来的位,再次从左到右排列。
                                 第一位为8H的低位0001 0100 1111 1111 1010 1000 0101 0001 0010 1110 0110 1000 0010 0000 0000 0000最后一位为0H的高位
然后将上述的数据除以100110001,最后的余数就等于0100 1110。也就是72H右移,然后各位从左往右排列。

    最后,楼主给的“MAXIM官网有详细的中文介绍,链接”非常有用,大家一定要仔细看。我也是看了官方的说明才理解的。这个CRC码的验证困扰了我整整两天。
    虽然,如果只用一个DS18B20根本不用管说明CRC码,但是,作为强迫症的我,既然遇上了就一定要把它弄懂。毕竟CRC码的生产和解码还是有点用的。

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:449852 发表于 2018-12-19 14:54 | 只看该作者
不必这么麻烦,算法与普通的CRC区别是需要逆序校验;就是校验多项式反序一下:多项式的最高位一般不参与运算,即0x131参与运算的为0x31,反序后为0x8c;之后进行正常CRC运算校验即可;
相关例程如下:读写复位函数略;RUN_18B20()函数每次调用间隔要大于温度转换周期
//#define CRCV_DS                                0x31        //多项式为:P(x)=x^8+x^5+x^4+x^0
#define CRCV_DS                                0x8c        //多项式为:P(x)=x^8+x^5+x^4+x^0 反序
u8 CRC_DS[4][2];
float RUN_18B20(float DATAFX)
{
        u8 i32,TES_DS[16];
        u16 i35;
        float i40,i42;
        RS_DS18B20();
        WriteOneChar(0xcc);//忽略ROM
        WriteOneChar(0xbe);//读暂存器
        CRC_DS[0][0]=0;
        for(i32=0;i32<8;i32++)
        {
                TES_DS[i32]=ReadOneChar();
                CRC_DS[0][0]^=TES_DS[i32];
                CRCi_DS(0);
        }
        CRC_DS[0][1]=ReadOneChar();
        RS_DS18B20();
        //
//        RS_DS18B20();
        WriteOneChar(0xcc);//忽略ROM
        WriteOneChar(0x44);//读暂存器
//       
        if(CRC_DS[0][0]==CRC_DS[0][1])//CRC OK
        {
                i35=TES_DS[0]+TES_DS[1]*0x100;
                if(i35>0xf000)//&cedil;&ordm;&Ouml;&micro;
                {
                        i35=(~i35+1);//
                        i32=i35&0xff;
                        i35>>=4;
                        i35&=0xff;
                        //
                        i42=(!!(i32&0x08))*1.0/2+(!!(i32&0x04))*1.0/4+(!!(i32&0x02))*1.0/8+(!!(i32&0x01))*1.0/16;       
                        i42+=i35;
                        i40=i42*-1;//
                }
                else
                {
                        i32=i35&0xff;
                        i35>>=4;
                        i35&=0xff;
                        //
                        i42=(!!(i32&0x08))*1.0/2+(!!(i32&0x04))*1.0/4+(!!(i32&0x02))*1.0/8+(!!(i32&0x01))*1.0/16;       
                        i42+=i35;
                        i40=i42;//
                }
        }
        else
                i40=DATAFX;
        return i40;
}
//
void CRCi_DS(u32 DSxCH)                          
{
        u32 i32;
        for(i32=0;i32<8;i32++)
        {
                if(CRC_DS[DSxCH][0]&0x01)
                {
                        CRC_DS[DSxCH][0]>>=1;
                        CRC_DS[DSxCH][0]^=CRCV_DS;
                }
                else
                        CRC_DS[DSxCH][0]>>=1;
        }         
}       
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表