标题: 单片机+DS18B20 CRC检验不通过? [打印本页]

作者: simple_tt    时间: 2022-9-19 17:47
标题: 单片机+DS18B20 CRC检验不通过?
在使用DS18B20时加入CRC校验,读序列号时CRC校验可以通过,但是读存储器中9个字节数据时校验不通过(使用正点原子例程其中温度值是有,也会变化。)


作者: wulin    时间: 2022-9-20 06:29
这个示例可能对你有所帮助

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


作者: TTQ001    时间: 2022-9-20 09:14
它总是没有通过 CRC 检查还是只是有时它没有通过 CRC 检查?
作者: simple_tt    时间: 2022-9-20 12:13
TTQ001 发表于 2022-9-20 09:14
它总是没有通过 CRC 检查还是只是有时它没有通过 CRC 检查?

是一直没通过,我用的CRC程序没问题,序列号的可以通过,就是9个字节的存储器读的值一直没通过
作者: simple_tt    时间: 2022-9-20 12:14
wulin 发表于 2022-9-20 06:29
这个示例可能对你有所帮助

CRC校验程序上没问题,就是读存储器中的9个字节数据,前8个进行校验和第9个总是对不上,可是前两个字节的温度还是会有变化
作者: 人人学会单片机    时间: 2022-9-20 22:24
学单片机请认准《人人学会单片机》系列视频教程。

作者: simple_tt    时间: 2022-9-21 09:00
人人学会单片机 发表于 2022-9-20 22:24
学单片机请认准《人人学会单片机》系列视频教程。

CRC也是这样使用的,主要问题是读出的9个字节数据校验不通过,我测试了读这个数据的温度有变化,过温TH和低温TL我写入进去也会有变化,判断数据的读写也没问题。
作者: simple_tt    时间: 2022-9-21 11:26
已经又更换了几个DS18B20测试还是这种现象,读出的序列号CRC校验可以通过,存储器中的值可以写入,读出来的温度也会有变化,就只是CRC校验不行。我读出来的那3个保留位一直是0xA5,0xA5,0x66
作者: wufa1986    时间: 2022-9-21 14:53
没问题的,我以前做过CRC,因为探头线很长,防止错误
作者: yzwzfyz    时间: 2022-9-21 17:15
如果不做CRC读DS18B20不错,这个问题就与DS18B20无关。
不是用CRC“加密”出了问题,就是用CRC“解密”出了问题。估计问题出在数据的次序、起讫点、高低位序、CRC起始码上。
作者: simple_tt    时间: 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


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

谢谢指导,CRC“加密”工作是DS18B20内部自己操作出来的,“解密”的结果和我用网上的CRC计算器也对的上,就只是DS18B20对不上,代码部分我粘贴在上面了。
作者: simple_tt    时间: 2022-9-22 11:03
"被DS18B20支配的恐惧,怀疑买到假的芯片(CRC8校验不通过)"
我找到了一个和我这边现象一样的帖子,这个问题搞的真的头大。
作者: simple_tt    时间: 2022-9-22 12:01
我感觉手上这批DS18B20是仿制品,存储器写入值可以,但是不能掉电保存,更改分辨率,但实际读出的数字的分辨率并不会更改。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1