標(biāo)題: 單片機(jī)+DS18B20 CRC檢驗(yàn)不通過(guò)? [打印本頁(yè)]

作者: simple_tt    時(shí)間: 2022-9-19 17:47
標(biāo)題: 單片機(jī)+DS18B20 CRC檢驗(yàn)不通過(guò)?
在使用DS18B20時(shí)加入CRC校驗(yàn),讀序列號(hào)時(shí)CRC校驗(yàn)可以通過(guò),但是讀存儲(chǔ)器中9個(gè)字節(jié)數(shù)據(jù)時(shí)校驗(yàn)不通過(guò)(使用正點(diǎn)原子例程其中溫度值是有,也會(huì)變化。)


作者: wulin    時(shí)間: 2022-9-20 06:29
這個(gè)示例可能對(duì)你有所幫助

DS18b20 CRC8位校驗(yàn)示例 仿真.rar (251.24 KB, 下載次數(shù): 21)


作者: TTQ001    時(shí)間: 2022-9-20 09:14
它總是沒(méi)有通過(guò) CRC 檢查還是只是有時(shí)它沒(méi)有通過(guò) CRC 檢查?
作者: simple_tt    時(shí)間: 2022-9-20 12:13
TTQ001 發(fā)表于 2022-9-20 09:14
它總是沒(méi)有通過(guò) CRC 檢查還是只是有時(shí)它沒(méi)有通過(guò) CRC 檢查?

是一直沒(méi)通過(guò),我用的CRC程序沒(méi)問(wèn)題,序列號(hào)的可以通過(guò),就是9個(gè)字節(jié)的存儲(chǔ)器讀的值一直沒(méi)通過(guò)
作者: simple_tt    時(shí)間: 2022-9-20 12:14
wulin 發(fā)表于 2022-9-20 06:29
這個(gè)示例可能對(duì)你有所幫助

CRC校驗(yàn)程序上沒(méi)問(wèn)題,就是讀存儲(chǔ)器中的9個(gè)字節(jié)數(shù)據(jù),前8個(gè)進(jìn)行校驗(yàn)和第9個(gè)總是對(duì)不上,可是前兩個(gè)字節(jié)的溫度還是會(huì)有變化
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2022-9-20 22:24
學(xué)單片機(jī)請(qǐng)認(rèn)準(zhǔn)《人人學(xué)會(huì)單片機(jī)》系列視頻教程。

作者: simple_tt    時(shí)間: 2022-9-21 09:00
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2022-9-20 22:24
學(xué)單片機(jī)請(qǐng)認(rèn)準(zhǔn)《人人學(xué)會(huì)單片機(jī)》系列視頻教程。

CRC也是這樣使用的,主要問(wèn)題是讀出的9個(gè)字節(jié)數(shù)據(jù)校驗(yàn)不通過(guò),我測(cè)試了讀這個(gè)數(shù)據(jù)的溫度有變化,過(guò)溫TH和低溫TL我寫(xiě)入進(jìn)去也會(huì)有變化,判斷數(shù)據(jù)的讀寫(xiě)也沒(méi)問(wèn)題。
作者: simple_tt    時(shí)間: 2022-9-21 11:26
已經(jīng)又更換了幾個(gè)DS18B20測(cè)試還是這種現(xiàn)象,讀出的序列號(hào)CRC校驗(yàn)可以通過(guò),存儲(chǔ)器中的值可以寫(xiě)入,讀出來(lái)的溫度也會(huì)有變化,就只是CRC校驗(yàn)不行。我讀出來(lái)的那3個(gè)保留位一直是0xA5,0xA5,0x66
作者: wufa1986    時(shí)間: 2022-9-21 14:53
沒(méi)問(wèn)題的,我以前做過(guò)CRC,因?yàn)樘筋^線很長(zhǎng),防止錯(cuò)誤
作者: yzwzfyz    時(shí)間: 2022-9-21 17:15
如果不做CRC讀DS18B20不錯(cuò),這個(gè)問(wèn)題就與DS18B20無(wú)關(guān)。
不是用CRC“加密”出了問(wèn)題,就是用CRC“解密”出了問(wèn)題。估計(jì)問(wèn)題出在數(shù)據(jù)的次序、起訖點(diǎn)、高低位序、CRC起始碼上。
作者: simple_tt    時(shí)間: 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. 序列號(hào)CRC可以校驗(yàn),溫度值校驗(yàn)不通過(guò)還是
  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;//溫度為負(fù)  
  47.                         }else temp=1;//溫度為正                    
  48.                         *tem=TH; //獲得高八位
  49.                         (*tem)<<=8;   
  50.                         *tem+=TL;//獲得底八位
  51.                         *tem=(double)*tem*0.625;//轉(zhuǎn)換
  52.                         if(!temp) *tem =-(*tem);                                        // 負(fù)數(shù)
  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. }
復(fù)制代碼

實(shí)驗(yàn)30 DS18B20數(shù)字溫度傳感器實(shí)驗(yàn).7z

318.12 KB, 下載次數(shù): 7


作者: simple_tt    時(shí)間: 2022-9-22 08:30
yzwzfyz 發(fā)表于 2022-9-21 17:15
如果不做CRC讀DS18B20不錯(cuò),這個(gè)問(wèn)題就與DS18B20無(wú)關(guān)。
不是用CRC“加密”出了問(wèn)題,就是用CRC“解密”出 ...

謝謝指導(dǎo),CRC“加密”工作是DS18B20內(nèi)部自己操作出來(lái)的,“解密”的結(jié)果和我用網(wǎng)上的CRC計(jì)算器也對(duì)的上,就只是DS18B20對(duì)不上,代碼部分我粘貼在上面了。
作者: simple_tt    時(shí)間: 2022-9-22 11:03
"被DS18B20支配的恐懼,懷疑買(mǎi)到假的芯片(CRC8校驗(yàn)不通過(guò))"
我找到了一個(gè)和我這邊現(xiàn)象一樣的帖子,這個(gè)問(wèn)題搞的真的頭大。
作者: simple_tt    時(shí)間: 2022-9-22 12:01
我感覺(jué)手上這批DS18B20是仿制品,存儲(chǔ)器寫(xiě)入值可以,但是不能掉電保存,更改分辨率,但實(shí)際讀出的數(shù)字的分辨率并不會(huì)更改。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1