找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1257|回复: 13
收起左侧

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

[复制链接]
ID:629502 发表于 2022-9-19 17:47 | 显示全部楼层 |阅读模式
在使用DS18B20时加入CRC校验,读序列号时CRC校验可以通过,但是读存储器中9个字节数据时校验不通过(使用正点原子例程其中温度值是有,也会变化。)
mmexport1663580283731.png IMG_20220919_173746.jpg mmexport1663580285906.png
回复

使用道具 举报

ID:213173 发表于 2022-9-20 06:29 | 显示全部楼层
这个示例可能对你有所帮助

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

使用道具 举报

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个字节的存储器读的值一直没通过
回复

使用道具 举报

ID:629502 发表于 2022-9-20 12:14 | 显示全部楼层
wulin 发表于 2022-9-20 06:29
这个示例可能对你有所帮助

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

使用道具 举报

ID:390416 发表于 2022-9-20 22:24 | 显示全部楼层
CRC校验8541反序.png 学单片机请认准《人人学会单片机》系列视频教程。
回复

使用道具 举报

ID:629502 发表于 2022-9-21 09:00 | 显示全部楼层
人人学会单片机 发表于 2022-9-20 22:24
学单片机请认准《人人学会单片机》系列视频教程。

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

使用道具 举报

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

使用道具 举报

ID:879348 发表于 2022-9-21 14:53 | 显示全部楼层
没问题的,我以前做过CRC,因为探头线很长,防止错误
回复

使用道具 举报

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

使用道具 举报

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

回复

使用道具 举报

ID:629502 发表于 2022-9-22 08:30 | 显示全部楼层
yzwzfyz 发表于 2022-9-21 17:15
如果不做CRC读DS18B20不错,这个问题就与DS18B20无关。
不是用CRC“加密”出了问题,就是用CRC“解密”出 ...

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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