完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先看一个CRC8的校验程序,是DS18B20使用的G(x)=x^8+x^5+x^4+1;uint8_t CRC8( uint8_t *P,uint8_t Len )
{ uint8_t num,Data; uint8_t CRC_Reg=0; while(Len--) { Data = *P; for (num=0;num<8;num++) { if ((Data^CRC_Reg)&0X01 != 0) // DS18B20数据的最低位开始移入移位寄存器 { // 若数据的最低位与移位寄存器的最低位异或结果为1 //CRC_Reg ^= 0X18; // 第四五位与1做或运算并且存入移位寄存器 //CRC_Reg >>= 1; // 移位寄存器数据右移一位 //CRC_Reg |= 0X80; // 运算结果1存入数据移位寄存器最后一位 CRC_Reg >>= 1; CRC_Reg ^= 0X8C; } else { // 若数据的最低位与移位寄存器的最低位异或结果为0 // 第四五位与0做异或运算并且存入移位寄存器,0做异或运算为原数值 CRC_Reg >>= 1; // 移位寄存器数据右移一位,与此同时也完成了末位添加0的运算 } Data >>= 1; } P++; } return CRC_Reg; } 上一个测试了一下没什么问题,又编写了CRC16CCIT的G(x)=x^16+x^12+x^5+1;uint16_t CRC_CCIT_16( uint8_t *P,uint16_t Len ) //指针指向的数据顺序影响校验结果, { //此计算过程先计算指针指向的最低字节 uint16_t CRC_Reg; uint8_t num; uint8_t Data; CRC_Reg = 0; while(Len--) //剩余需要校验的字节数 { Data = *P; for (num=0;num<8;num++) //每一个校验字节要移动8次 { if ((Data^CRC_Reg)&0X0001 != 0) //校验数据从LSB开始 { CRC_Reg >>= 1; //判断完成后将最低位移除 CRC_Reg = CRC_Reg^0X8408; /*CRC_Reg |= 0X8000;*/ //0X8408可将最高位设置为1 } else { CRC_Reg >>= 1; } Data >>= 1; } P++; } return CRC_Reg; } 但是这个程序就有问题,我一直没照找到哪里有问题!下面给一个网络上找的自己稍微修改了一下,没什么问题,uint16_t CRC16( uint8_t *P,uint16_t Len ) { uint16_t CRC=0; uint8_t Data,i; while(Len--) { Data = *P; for(i=0x01;i!=0;i<<=1) { if ((CRC&0X8000)!=0) { CRC <<= 1; CRC ^= 0X1021; } else { CRC <<= 1; } if((Data&i)!=0) CRC ^= 0X1021; } P++; } return CRC; } 问题来了,我的第二个程序自己是将第三个正确程序的CRC_Reg(移位寄存器)左右颠倒使用,再就是将数据移入位和从寄存器移出的那一位的异或结果一次性判断来完成。不知道表述清楚没,希望有心的人给看看不胜感激!就当自己复习了,我比较愚钝看了三天还是无解······ |
|
相关推荐 |
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
148 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
348 浏览 2 评论
558 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译
252 浏览 0 评论
388 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11972 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 20:21 , Processed in 0.547592 second(s), Total 36, Slave 29 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号