关于SHT11的CRC使用心得
根据SHT11的数据手册,在读取采集数据的时候SHT11提供了一个字节的CRC8校验。而在我的数据采集系统中由于种种原因,数据偶尔有出错的现象,故而考虑将SHT11的CRC利用起来。从网上找到了一些提供CRC8的工具和算法,把从SHT11读取的CRC字节与工具计算的出的结果比对,完全不一样。自己按照网上的算法写了个工具,结果还是不一样(自己的工具和网上的工具得出的结果一样)。后来在SHT的官网下载对于SHT11关于CRC的说明文档CRC_Calculation_SHTxx_v1.03.pdf,发现网上的算法多项式为X8+X5+X4+1而SHT11采用的多项式为X8+X5+X4,而且根据这个说明其CRC结果还要做一个镜像(高地位颠倒),即b7=b0,b6=b1……b4=b3;当我高高兴兴的吧校验算法移植到我的数据采集系统上去以后,开始采集数据,然后奇异的事情发生了,采集器只有湿度数据传上来,温度数据一直没上来,调试发现温度的CRC8校验不过。而我的测试程序不论温度还是湿度都是可以校验通过的,冥思苦想了一个上午,得出初步的结论是,使用12bit精度的湿度采集和14bit精度的温度采集时,CRC8是可以通过的,这需要设置SHT控制寄存器的b0=0,即SHT11控制寄存器的默认值,而使用8bit精度的湿度采集或者12bit精度的温度采集时(设置),测试程序中CRC8的结果都是错误的。然后就是无尽的痛苦……无论是把读出的结果高低半字节交换还是做镜像,都和正确结果一点关系都没有,正当绝望的时候突然发现,所有错误结果和正确结果的异或值都为0xAB。写了个程序验证之,不停的采集和验证,40分钟都没有问题。结果的到初步的确定,即采用控制寄存器的b0=0时按照正常的CRC8算法验证,控制寄存器的b0=1时,除了按照正常的CRC8算法计算外还要将其结果异或0XAB。
有没有做过SHT11的CRC校验的,能够帮我确认一下是否真的是这样. const uchar
#ifdef C51
code CRC_Table[]
#endif
#ifdef AVR
CRC_Table[] PROGMEM
#endif
= {
0, 49, 98, 83, 196, 245, 166, 151, 185, 136, 219, 234, 125, 76, 31, 46, 67, 114, 33, 16,
135, 182, 229, 212, 250, 203, 152, 169, 62, 15, 92, 109, 134, 183, 228, 213, 66, 115, 32, 17,
63, 14, 93, 108, 251, 202, 153, 168, 197, 244, 167, 150, 1, 48, 99, 82, 124, 77, 30, 47,
184, 137, 218, 235, 61, 12, 95, 110, 249, 200, 155, 170, 132, 181, 230, 215, 64, 113, 34, 19,
126, 79, 28, 45, 186, 139, 216, 233, 199, 246, 165, 148, 3, 50, 97, 80, 187, 138, 217, 232,
127, 78, 29, 44, 2, 51, 96, 81, 198, 247, 164, 149, 248, 201, 154, 171, 60, 13, 94, 111,
65, 112, 35, 18, 133, 180, 231, 214, 122, 75, 24, 41, 190, 143, 220, 237, 195, 242, 161, 144,
7, 54, 101, 84, 57, 8, 91, 106, 253, 204, 159, 174, 128, 177, 226, 211, 68, 117, 38, 23,
252, 205, 158, 175, 56, 9, 90, 107, 69, 116, 39, 22, 129, 176, 227, 210, 191, 142, 221, 236,
123, 74, 25, 40, 6, 55, 100, 85, 194, 243, 160, 145, 71, 118, 37, 20, 131, 178, 225, 208,
254, 207, 156, 173, 58, 11, 88, 105, 4, 53, 102, 87, 192, 241, 162, 147, 189, 140, 223, 238,
121, 72, 27, 42, 193, 240, 163, 146, 5, 52, 103, 86, 120, 73, 26, 43, 188, 141, 222, 239,
130, 179, 224, 209, 70, 119, 36, 21, 59, 10, 89, 104, 255, 206, 157, 172 };
uchar CRC8(uchar inData, uchar crc)
{
#ifdef C51
return CRC_Table;
#endif
#ifdef AVR
return pgm_read_byte(&CRC_Table);
#endif
} 他只是高低位反了而已,没有你想嘀那么复杂... 控制寄存器不更改的时候确实只是高地位反了而已,一旦更改控制寄存器的b0位为1的时候,就不只是高地位反了这么简单,而是需要再异或一个0xAB,至少我已经在十几片SHT11上验证过了 楼主辛苦了! 算法搞的有点晕了,楼主能给个简明的算法吗, 楼主威武 mark MArk 有SHT11算校验码的代码么? 哈哈,和我遇到的问题相同。
我不是改测量精度,而是使用了加热功能,同样是修改了控制寄存器,于是CRC就不对了。
然后我和楼主做了同样的分析,得到的异或结果是9E。
这个问题,我正在等待SENSIRION的回答。 Q-Phil 发表于 2013-10-10 15:05 static/image/common/back.gif
哈哈,和我遇到的问题相同。
我不是改测量精度,而是使用了加热功能,同样是修改了控制寄存器,于是CRC就不 ...
有结果了吗?你们说的我没看懂 楼主有钻研精神!人才! 官方没有给我回复,我好像已经找到规律了,近期需要进行试验后最终确定。
页:
[1]