OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7527|回复: 7

初学CRC校验,跪求赐教!

[复制链接]

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-8-5
在线时间
11 小时
发表于 2013-12-3 16:45:39 | 显示全部楼层 |阅读模式
 
  1. public static void main(String[] args) {   
  2.     int a = 0x61;   
  3.     int b = 0x62;   
  4.     //先计算a的CRC   
  5.     int CRC = a;   
  6.     CRC <<= 8;   
  7.     for (int i = 0; i < 8; i++) {   
  8.         if ((CRC & 0x8000) != 0) {   
  9.             CRC <<= 1;   
  10.             CRC = CRC ^ 0x1021;   
  11.         } else {   
  12.             CRC <<= 1;   
  13.         }   
  14.     }   
  15.     System.out.println((Integer.toHexString(CRC & 0xffff)));   

    问题:在第9、10行为什么是先“CRC <<= 1;”,后“CRC = CRC ^ 0x1021; ”?
    我感觉应该倒过来比较正常啊?这应该是我线性移位寄存器没理解对吧?求大侠解答一下……
自强不息,厚德载物。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-12-3 16:49:09 | 显示全部楼层
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-8-5
在线时间
11 小时
 楼主| 发表于 2013-12-4 14:50:51 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
thank  you!!
自强不息,厚德载物。
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-12-4 17:23:20 | 显示全部楼层
计算机CRC的bit算法中
如果首位为1,将其左移1位(最低位从下一个字节获得),再与生成多项式(即0x1021)异或~~
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-12-4 17:30:50 | 显示全部楼层
其实我在想为什么你最开始是给CRC左移8bit、
CRC16是有16bit余项才对哒嘛。
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-8-5
在线时间
11 小时
 楼主| 发表于 2013-12-5 19:03:47 | 显示全部楼层
回复【5楼】lsj9383:
-------------------------------
首先,谢谢您的解答。
这个问题我已经想明白了!
1、"其实我在想为什么你最开始是给CRC左移8bit、 。"
答:这段程序不是校验程序,而是求校验码的程序(如若不求校验码的程序,就应该用查表法)。
既然是求校验码的程序,那么在应用16位寄存器(用16位是为了求和存16位的校验)的基础上,在“int CRC = a;”之后才可以使寄存器刚好充满数据,然后求解
2、“问题:在第9、10行为什么是先“CRC <<= 1;”,后“CRC = CRC ^ 0x1021; ”?”
答:是因为0x1021省略了最高位(为什么省略呢?因为使用16位寄存器,而0x11021是17位数,故省略最高位),应该是0x11021
3、这有个讲解比较好的网页:
http://www.doc88.com/p-774412772604.html
嘻嘻……
自强不息,厚德载物。
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-12-6 12:33:46 | 显示全部楼层
回复【6楼】 张国旗 :
---------------------------------
呵呵,谢谢,看看~~
只知道怎么笔算CRC,还没用计算机算过
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-12-11 20:21:30 | 显示全部楼层
// CRC 校验长度配置
  NRF_RADIO->CRCCNF = 2; // 校验长度 2个char
  if ((NRF_RADIO->CRCCNF & 0x03)== 2 )
  {
    NRF_RADIO->CRCINIT = 0xFFFFUL;      // 校验初始值
    NRF_RADIO->CRCPOLY = 0x11021UL;     // CRC poly: x^16+x^12^x^5+1
  }
  else if ((NRF_RADIO->CRCCNF & 0x03) == 1 )
  {
    NRF_RADIO->CRCINIT = 0xFFUL;        // 校验初始值
    NRF_RADIO->CRCPOLY = 0x107UL;       // CRC poly: x^8+x^2^x^1+1
  }

//接收寄存器是  NRF_RADIO->ACKETPTR
}
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-19 07:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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