不必这么麻烦,算法与普通的CRC区别是需要逆序校验;就是校验多项式反序一下:多项式的最高位一般不参与运算,即0x131参与运算的为0x31,反序后为0x8c;之后进行正常CRC运算校验即可; 相关例程如下:读写复位函数略;RUN_18B20()函数每次调用间隔要大于温度转换周期 //#define CRCV_DS 0x31 //多项式为:P(x)=x^8+x^5+x^4+x^0 #define CRCV_DS 0x8c //多项式为: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; } } |
楼主 最后自己搞懂了 但是其他不懂的人来看 就看不懂了 本人仔细研究了楼主提供的资料 给“后来者”做一个说明 首先 楼主的算法是可以的,只是楼主的64位被除数排序错了 原来楼主给出的排序是:十六进制28 FF 15 8A 74 16 04 00 二进制0010 1000 1111 1111 0001 0101 1000 1010 0111 0100 0001 0110 0000 0100 0000 0000 给出正确的排序前的说明:8位CRC码+48位序列号+8位系列码 00 04 16 74 8A 15 FF 28(说明:DS18B20的系列码都是28H,这里CRC码写成00是因为楼主想通过余数与CRC码72H相等 判断读取的64位ROM数据正确) 正确的排序应该是:将 00 04 16 74 8A 15 FF 28右移出来的位,再次从左到右排列。 第一位为8H的低位0001 0100 1111 1111 1010 1000 0101 0001 0010 1110 0110 1000 0010 0000 0000 0000最后一位为0H的高位 然后将上述的数据除以100110001,最后的余数就等于0100 1110。也就是72H右移,然后各位从左往右排列。 最后,楼主给的“MAXIM官网有详细的中文介绍,链接”非常有用,大家一定要仔细看。我也是看了官方的说明才理解的。这个CRC码的验证困扰了我整整两天。 虽然,如果只用一个DS18B20根本不用管说明CRC码,但是,作为强迫症的我,既然遇上了就一定要把它弄懂。毕竟CRC码的生产和解码还是有点用的。 |
解决就好,谢谢分享帮助更多的人. |
问题解决了。感谢 51黑dd 的帖子,http://www.51hei.com/bbs/dpj-47738-1.html。 DS18B20使用CRC校验和常规的CRC校验并不一样,并不能按照我之前使用的算法计算。MAXIM官网有详细的中文介绍,链接如下: 应用笔记27 理解和运用Maxim iButton产品中的循环冗余校验(CRC)希望对同我有一样困惑的同学有帮助。 |