关于SHT11的CRC使用心得

2020-01-25 15:32发布

根据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校验的,能够帮我确认一下是否真的是这样.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
14条回答
lysoft
2020-01-25 16:37
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[inData ^ crc];
        #endif
        #ifdef AVR
        return pgm_read_byte(&CRC_Table[inData ^ crc]);
        #endif
}

一周热门 更多>