找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+DS18B20 CRC检验不通过?

[复制链接]
跳转到指定楼层
楼主
ID:629502 发表于 2022-9-19 17:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用DS18B20时加入CRC校验,读序列号时CRC校验可以通过,但是读存储器中9个字节数据时校验不通过(使用正点原子例程其中温度值是有,也会变化。)

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

使用道具 举报

沙发
ID:213173 发表于 2022-9-20 06:29 | 只看该作者
这个示例可能对你有所帮助

DS18b20 CRC8位校验示例 仿真.rar (251.24 KB, 下载次数: 21)

回复

使用道具 举报

板凳
ID:420836 发表于 2022-9-20 09:14 | 只看该作者
它总是没有通过 CRC 检查还是只是有时它没有通过 CRC 检查?
回复

使用道具 举报

地板
ID:629502 发表于 2022-9-20 12:13 | 只看该作者
TTQ001 发表于 2022-9-20 09:14
它总是没有通过 CRC 检查还是只是有时它没有通过 CRC 检查?

是一直没通过,我用的CRC程序没问题,序列号的可以通过,就是9个字节的存储器读的值一直没通过
回复

使用道具 举报

5#
ID:629502 发表于 2022-9-20 12:14 | 只看该作者
wulin 发表于 2022-9-20 06:29
这个示例可能对你有所帮助

CRC校验程序上没问题,就是读存储器中的9个字节数据,前8个进行校验和第9个总是对不上,可是前两个字节的温度还是会有变化
回复

使用道具 举报

6#
ID:390416 发表于 2022-9-20 22:24 | 只看该作者
学单片机请认准《人人学会单片机》系列视频教程。
回复

使用道具 举报

7#
ID:629502 发表于 2022-9-21 09:00 | 只看该作者
人人学会单片机 发表于 2022-9-20 22:24
学单片机请认准《人人学会单片机》系列视频教程。

CRC也是这样使用的,主要问题是读出的9个字节数据校验不通过,我测试了读这个数据的温度有变化,过温TH和低温TL我写入进去也会有变化,判断数据的读写也没问题。
回复

使用道具 举报

8#
ID:629502 发表于 2022-9-21 11:26 | 只看该作者
已经又更换了几个DS18B20测试还是这种现象,读出的序列号CRC校验可以通过,存储器中的值可以写入,读出来的温度也会有变化,就只是CRC校验不行。我读出来的那3个保留位一直是0xA5,0xA5,0x66
回复

使用道具 举报

9#
ID:879348 发表于 2022-9-21 14:53 | 只看该作者
没问题的,我以前做过CRC,因为探头线很长,防止错误
回复

使用道具 举报

10#
ID:123289 发表于 2022-9-21 17:15 | 只看该作者
如果不做CRC读DS18B20不错,这个问题就与DS18B20无关。
不是用CRC“加密”出了问题,就是用CRC“解密”出了问题。估计问题出在数据的次序、起讫点、高低位序、CRC起始码上。
回复

使用道具 举报

11#
ID:629502 发表于 2022-9-21 17:53 | 只看该作者
  1. uint8_t DS18B20_Crc(uint8_t *addr, uint8_t len)
  2. {
  3.         uint8_t crc = 0, inbyte, i, mix;
  4.                 while(len --)
  5.                 {
  6.                         inbyte = *addr++;
  7.                         
  8.                         for(i = 8; i; i--)
  9.                         {
  10.                                 mix = (crc ^ inbyte) & 0x01;
  11.                                 crc >>= 1;
  12.                                 if(mix)
  13.                                 {
  14.                                         crc ^= 0x8C;
  15.                                 }
  16.                                 inbyte >>= 1;
  17.                         }
  18.                 }
  19.                 return crc;
  20. }
  21. 序列号CRC可以校验,温度值校验不通过还是
  22. bool DS18B20_Get_Temp(short *tem)
  23. {
  24.     u8 temp;
  25.     u8 TL,TH;
  26.                 u8 crc;
  27.                 u8 i;
  28.     DS18B20_Start ();                    // ds1820 start convert
  29.     DS18B20_Rst();
  30.     DS18B20_Check();         
  31.     DS18B20_Write_Byte(0xcc);// skip rom
  32.     DS18B20_Write_Byte(0xbe);// convert           
  33.                 for(i = 0; i < 9; i++)
  34.                 {
  35.                         scrbuf[i] = DS18B20_Read_Byte();
  36.                 }
  37.                 crc = DS18B20_Crc(scrbuf,8);
  38.                 if(scrbuf[8] == crc)
  39.                 {
  40.                         TL = scrbuf[0];                                                                                        // LSB
  41.                         TH = scrbuf[1];                                                                                        // MSB
  42.                         if(TH>7)
  43.                         {
  44.                                         TH=~TH;
  45.                                         TL=~TL;
  46.                                         temp=0;//温度为负  
  47.                         }else temp=1;//温度为正                    
  48.                         *tem=TH; //获得高八位
  49.                         (*tem)<<=8;   
  50.                         *tem+=TL;//获得底八位
  51.                         *tem=(double)*tem*0.625;//转换
  52.                         if(!temp) *tem =-(*tem);                                        // 负数
  53.                         else;
  54.                         return true;
  55.                 }
  56.     else
  57.                          return false;
  58. }

  59. bool DS18B20_Read_ID(uint8_t *ID)
  60. {
  61.         u8 crc;
  62.         u8 i;
  63.         DS18B20_Rst();
  64.         DS18B20_Check();
  65.         DS18B20_Write_Byte(0x33);
  66.         for(i = 0; i < 8; i++)
  67.         {
  68.                 ID[i] = DS18B20_Read_Byte();
  69.         }
  70.         crc = DS18B20_Crc(ID,7);
  71.         if( ID[7] == crc )
  72.         {
  73.                 return true;
  74.         }
  75.         else
  76.         {
  77.                 return false;
  78.         }
  79. }
复制代码

实验30 DS18B20数字温度传感器实验.7z

318.12 KB, 下载次数: 7

回复

使用道具 举报

12#
ID:629502 发表于 2022-9-22 08:30 | 只看该作者
yzwzfyz 发表于 2022-9-21 17:15
如果不做CRC读DS18B20不错,这个问题就与DS18B20无关。
不是用CRC“加密”出了问题,就是用CRC“解密”出 ...

谢谢指导,CRC“加密”工作是DS18B20内部自己操作出来的,“解密”的结果和我用网上的CRC计算器也对的上,就只是DS18B20对不上,代码部分我粘贴在上面了。
回复

使用道具 举报

13#
ID:629502 发表于 2022-9-22 11:03 | 只看该作者
"被DS18B20支配的恐惧,怀疑买到假的芯片(CRC8校验不通过)"
我找到了一个和我这边现象一样的帖子,这个问题搞的真的头大。
回复

使用道具 举报

14#
ID:629502 发表于 2022-9-22 12:01 | 只看该作者
我感觉手上这批DS18B20是仿制品,存储器写入值可以,但是不能掉电保存,更改分辨率,但实际读出的数字的分辨率并不会更改。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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