搜索
bottom↓
回复: 13

关于SHT11的CRC使用心得

[复制链接]

出0入0汤圆

发表于 2010-10-14 17:23:17 | 显示全部楼层 |阅读模式
根据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校验的,能够帮我确认一下是否真的是这样.

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-10-14 17:24:34 | 显示全部楼层
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
}

出0入0汤圆

发表于 2010-10-14 17:27:17 | 显示全部楼层
他只是高低位反了而已,没有你想嘀那么复杂...

出0入0汤圆

 楼主| 发表于 2010-10-20 10:29:39 | 显示全部楼层
控制寄存器不更改的时候确实只是高地位反了而已,一旦更改控制寄存器的b0位为1的时候,就不只是高地位反了这么简单,而是需要再异或一个0xAB,至少我已经在十几片SHT11上验证过了

出0入0汤圆

发表于 2010-10-26 09:49:40 | 显示全部楼层
楼主辛苦了!

出0入0汤圆

发表于 2011-9-16 20:09:00 | 显示全部楼层
算法搞的有点晕了,楼主能给个简明的算法吗,

出0入0汤圆

发表于 2011-10-29 21:44:16 | 显示全部楼层
楼主威武

出0入0汤圆

发表于 2011-10-30 14:34:16 | 显示全部楼层
mark

出110入109汤圆

发表于 2012-3-10 02:41:41 | 显示全部楼层
MArk

出0入0汤圆

发表于 2013-4-15 17:20:49 | 显示全部楼层
有SHT11算校验码的代码么?

出0入0汤圆

发表于 2013-10-10 15:05:25 | 显示全部楼层
哈哈,和我遇到的问题相同。
我不是改测量精度,而是使用了加热功能,同样是修改了控制寄存器,于是CRC就不对了。
然后我和楼主做了同样的分析,得到的异或结果是9E。
这个问题,我正在等待SENSIRION的回答。

出0入0汤圆

发表于 2013-11-9 16:31:36 | 显示全部楼层
Q-Phil 发表于 2013-10-10 15:05
哈哈,和我遇到的问题相同。
我不是改测量精度,而是使用了加热功能,同样是修改了控制寄存器,于是CRC就不 ...

有结果了吗?你们说的我没看懂

出0入0汤圆

发表于 2013-11-30 00:40:29 来自手机 | 显示全部楼层
楼主有钻研精神!人才!

出0入0汤圆

发表于 2013-12-4 13:03:49 | 显示全部楼层
官方没有给我回复,我好像已经找到规律了,近期需要进行试验后最终确定。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 07:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表