標(biāo)題:
關(guān)于DS18B20的CRC-8校驗(yàn)計(jì)算的問(wèn)題
[打印本頁(yè)]
作者:
Brookg
時(shí)間:
2016-10-27 21:01
標(biāo)題:
關(guān)于DS18B20的CRC-8校驗(yàn)計(jì)算的問(wèn)題
我從DS18B20中讀出的64位ROM是28 ff 15 8a 74 16 4 72(16進(jìn)制,下同),前56位是ROM,后8位是校驗(yàn)碼。DS18B20的生成多項(xiàng)式是 x^8 + x^5 + x^4 + 1,即二進(jìn)制 10011 0001,化十六進(jìn)制為 0x131。 我計(jì)算校驗(yàn)碼的時(shí)候,根據(jù)網(wǎng)上的教程:
1) 將56位數(shù)據(jù)左移8位,變成 28 ff 15 8a 74 16 4 00
2) 用 28 ff 15 8a 74 16 4 00 對(duì) 0x131 做模2除法
但最終得到的結(jié)果卻是 0x36,而非讀出的0x72。求問(wèn)我是哪里出錯(cuò)了?正確的計(jì)算應(yīng)該是什么樣子的?求指導(dǎo)
下面圖片是我具體的運(yùn)算過(guò)程。
crc-8-ds18b20.html.png
(37.45 KB, 下載次數(shù): 152)
下載附件
2016-10-27 20:59 上傳
作者:
Brookg
時(shí)間:
2016-10-27 22:27
問(wèn)題解決了。感謝
51黑dd
的帖子,
http://www.torrancerestoration.com/bbs/dpj-47738-1.html
。
DS18B20使用CRC校驗(yàn)和常規(guī)的CRC校驗(yàn)并不一樣,并不能按照我之前使用的算法計(jì)算。MAXIM官網(wǎng)有詳細(xì)的中文介紹,鏈接如下:
應(yīng)用筆記27 理解和運(yùn)用Maxim
i
Button產(chǎn)品中的循環(huán)冗余校驗(yàn)(CRC)
希望對(duì)同我有一樣困惑的同學(xué)有幫助。
作者:
admin
時(shí)間:
2016-11-13 20:51
解決就好,謝謝分享幫助更多的人.
作者:
13586540685
時(shí)間:
2018-7-26 15:31
樓主 最后自己搞懂了 但是其他不懂的人來(lái)看 就看不懂了
本人仔細(xì)研究了樓主提供的資料 給“后來(lái)者”做一個(gè)說(shuō)明
首先 樓主的算法是可以的,只是樓主的64位被除數(shù)排序錯(cuò)了
原來(lái)樓主給出的排序是:十六進(jìn)制28 FF 15 8A 74 16 04 00
二進(jìn)制0010 1000 1111 1111 0001 0101 1000 1010 0111 0100 0001 0110 0000 0100 0000 0000
給出正確的排序前的說(shuō)明:8位CRC碼+48位序列號(hào)+8位系列碼
00 04 16 74 8A 15 FF 28(說(shuō)明:DS18B20的系列碼都是28H,這里CRC碼寫成00是因?yàn)闃侵飨胪ㄟ^(guò)余數(shù)與CRC碼72H相等 判斷讀取的64位ROM數(shù)據(jù)正確)
正確的排序應(yīng)該是:將 00 04 16 74 8A 15 FF 28右移出來(lái)的位,再次從左到右排列。
第一位為8H的低位0001 0100 1111 1111 1010 1000 0101 0001 0010 1110 0110 1000 0010 0000 0000 0000最后一位為0H的高位
然后將上述的數(shù)據(jù)除以100110001,最后的余數(shù)就等于0100 1110。也就是72H右移,然后各位從左往右排列。
最后,樓主給的“MAXIM官網(wǎng)有詳細(xì)的中文介紹,鏈接”非常有用,大家一定要仔細(xì)看。我也是看了官方的說(shuō)明才理解的。這個(gè)CRC碼的驗(yàn)證困擾了我整整兩天。
雖然,如果只用一個(gè)DS18B20根本不用管說(shuō)明CRC碼,但是,作為強(qiáng)迫癥的我,既然遇上了就一定要把它弄懂。畢竟CRC碼的生產(chǎn)和解碼還是有點(diǎn)用的。
作者:
伊伊
時(shí)間:
2018-12-19 14:54
不必這么麻煩,算法與普通的CRC區(qū)別是需要逆序校驗(yàn);就是校驗(yàn)多項(xiàng)式反序一下:多項(xiàng)式的最高位一般不參與運(yùn)算,即0x131參與運(yùn)算的為0x31,反序后為0x8c;之后進(jìn)行正常CRC運(yùn)算校驗(yàn)即可;
相關(guān)例程如下:讀寫復(fù)位函數(shù)略;RUN_18B20()函數(shù)每次調(diào)用間隔要大于溫度轉(zhuǎn)換周期
//#define CRCV_DS 0x31 //多項(xiàng)式為:P(x)=x^8+x^5+x^4+x^0
#define CRCV_DS 0x8c //多項(xiàng)式為: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)//¸ºÖµ
{
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;
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1