打印

CRC半字节查表 与 ISO/IEC 14443-3

[复制链接]
6176|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzqxs89|  楼主 | 2013-6-17 17:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
关于NFC 14443-3中提到的CRC_A 是CRC-CCITT还是CRC16?


1、CRC的基本原理:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。
这个信息码怎么理解?
比如我现在发送的数据时 04 CRC0 CRC1,但是实际的数据流是 1 0010 000 0,CRC0, CRC1。在计算CRC的时候是以04计算,还是以1 0010 000 0 计算。
2、还有个疑问是,如果用半字节查表法怎么计算像 1 0010 000 0 这样的数据啊?
没弄明白半字节查表函数那个指针参数指向的数据是怎么得到的。
是不是{0x02,0x40} ?


相关帖子

沙发
zhangmangui| | 2013-6-17 20:03 | 只看该作者
CRC16和CRC-CCITT是完全不同的  两者的计算公式不同  
他们的计算过程其实就是先计算第一个8bit的  这个8bit和初始值一起计算会得到一个16bit的校验值   这个校验值在和下一个字节的计算又得到一个新的16bit的校验值  依次进行下去知道将要传输的字节计算完为止
查表法就是将计算的值存起来  这是为了提高速度  然后根据要计算的字节的值去取值就可以啦
14443的我觉得应该是CCITT的  因为15693协议的是这个

使用特权

评论回复
板凳
zhangmangui| | 2013-6-17 20:06 | 只看该作者

上图是我写的小软件  每种计算方法都会有左移和右移两种方法  看你所采用协议中用的是那种了  
右边就以所谓的表  需要去查表  提高计算速度

使用特权

评论回复
地板
zhangmangui| | 2013-6-17 20:06 | 只看该作者
这个还是有点复杂的  慢慢研究一下  这个软件还是不能给你的

使用特权

评论回复
5
dirtwillfly| | 2013-6-17 20:10 | 只看该作者
楼上有那么好的东东

使用特权

评论回复
6
dirtwillfly| | 2013-6-17 20:15 | 只看该作者

使用特权

评论回复
7
liuzhongkai123| | 2013-6-17 20:23 | 只看该作者
原理是很复杂  但是编起来并不难吧

使用特权

评论回复
8
lzqxs89|  楼主 | 2013-6-18 11:43 | 只看该作者
zhangmangui 发表于 2013-6-17 20:03
CRC16和CRC-CCITT是完全不同的  两者的计算公式不同  
他们的计算过程其实就是先计算第一个8bit的  这个8bi ...

已经看了两天半的CRC了,原理感觉明白了,但是自己计算出来的值,与NFC文档上面给的例子对应不上。

使用特权

评论回复
9
zhangmangui| | 2013-6-18 12:10 | 只看该作者
lzqxs89 发表于 2013-6-18 11:43
已经看了两天半的CRC了,原理感觉明白了,但是自己计算出来的值,与NFC文档上面给的例子对应不上。 ...

你把你要计算的指令给我  然后理论上的结果也给我  我看看是哪种计算方法  然后你在做深入研究

使用特权

评论回复
10
lzqxs89|  楼主 | 2013-6-18 13:52 | 只看该作者
zhangmangui 发表于 2013-6-18 12:10
你把你要计算的指令给我  然后理论上的结果也给我  我看看是哪种计算方法  然后你在做深入研究  ...

Transmission of data, first byte ="00",second byte ="00",CRC_A appended
Calculated CRC_A =“1EA0”
First bit transmitted
------------------------------------------------------------------------
|S| 0000 0000 | 1 | 0000 0000 | 1 | 0000 0101 | 1 |  0111 1000 | 1 | E |
------------------------------------------------------------------------
     "00"       P      "00"     P     "A0"     P     "1E"        P

S:表示数据的开始,波形是逻辑 1
P:奇偶位
E:结束位

疑问:计算CRC_A的信息码是“|S| 0000 0000 | 1 | 0000 0000 | 1 |”还是“| 0000 0000 | 1 | 0000 0000 | 1 |”?或者是其它。

使用特权

评论回复
11
zhangmangui| | 2013-6-18 14:25 | 只看该作者
lzqxs89 发表于 2013-6-18 13:52
Transmission of data, first byte ="00",second byte ="00",CRC_A appended
Calculated CRC_A =“1EA0” ...

我去  14443还分了CRC_A和CRC_B   为什么要要搞两种啊   刚仔细研究了一下  给你计算出来了
他的初始值是0x6363   我们以前计算初始值一般都是0xffff   
还有计算不需要取反  CRC_B和15693协议的计算方法是一样的  
给你代码吧  你看看
unsigned short crc16_ccitt(unsigned char data,unsigned short crc1)
{
        unsigned short ccitt16 = 0x8408;
        int i;
        crc1 ^= data;   /*新的数据与原来的余数(就是crc)相加(加法就是异或操作)*/
        for(i=0;i<8;i++)
        {
                if(crc1 & 0x0001)  /*最低位为1,减去除数 */
                {
                        crc1 >>= 1;
                        crc1 ^= ccitt16;
                }
                else         /*最低位为0,不需要减去除数 */
                {
                        crc1 >>= 1;  /*直接移位*/
                }
        }
        return crc1;
}


int main()
{
        int i ;
        unsigned short crc;
        char data[11] ={0x00,0x00};
        crc = 0x6363;
        for(i=0;i<2;i++)
        {
                crc = crc16_ccitt(data,crc);
        }
//        crc = ~crc;
        printf("crc is %x",crc);
        return 0;
}
计算结果看截图中  和你说的相同  



使用特权

评论回复
12
zhangmangui| | 2013-6-18 14:26 | 只看该作者
lzqxs89 发表于 2013-6-18 13:52
Transmission of data, first byte ="00",second byte ="00",CRC_A appended
Calculated CRC_A =“1EA0” ...

在RFID中都是先发送低位  再发高位  所以是A0  1E

使用特权

评论回复
13
lzqxs89|  楼主 | 2013-6-18 14:59 | 只看该作者
zhangmangui 发表于 2013-6-18 14:25
我去  14443还分了CRC_A和CRC_B   为什么要要搞两种啊   刚仔细研究了一下  给你计算出来了
他的初始值是 ...

先谢谢版主。回头好好学习学习!

使用特权

评论回复
14
zhangmangui| | 2013-6-18 16:18 | 只看该作者
lzqxs89 发表于 2013-6-18 14:59
先谢谢版主。回头好好学习学习!

哈哈  好好学习  研究这个的人比较少

使用特权

评论回复
15
lzqxs89|  楼主 | 2013-6-18 16:37 | 只看该作者
zhangmangui 发表于 2013-6-18 14:25
我去  14443还分了CRC_A和CRC_B   为什么要要搞两种啊   刚仔细研究了一下  给你计算出来了
他的初始值是 ...

百度百科
计算过程:
1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。

对照这个看你的代码,还有一点不明白。为什么多项式码是"0x8408"而不是0x1021?
而且百科后面有也这样的一段代码
#define CRCCCITT 0x1021
#define CCITT-REV 0x8408
#define CRC16 0x8005
#define CRC16-REV 0xA001
#define CRC32-POLYNOMIAL 0xEDB88320L
我明白0x1021是CRC(CCITT) = X16+X12 +X5+1得到的,1 0001 0000 0010 0001。
写到这里明白了0x8408。
但是什么情况下是取0x1021,什么情况下取0x8408?

使用特权

评论回复
16
zhangmangui| | 2013-6-18 16:43 | 只看该作者
lzqxs89 发表于 2013-6-18 16:37
百度百科
计算过程:
1.设置CRC寄存器,并给其赋值FFFF(hex)。

左移和右移啊   右移的时候是8408  左移是1021
给你计算的是右移的

使用特权

评论回复
17
zhangmangui| | 2013-6-18 16:44 | 只看该作者
lzqxs89 发表于 2013-6-18 16:37
百度百科
计算过程:
1.设置CRC寄存器,并给其赋值FFFF(hex)。

他这个有问题  
不可能所有的CRC寄存器都赋值ffff
像CRC_A赋值就是6363

使用特权

评论回复
18
lzqxs89|  楼主 | 2013-6-18 16:48 | 只看该作者
zhangmangui 发表于 2013-6-18 16:18
哈哈  好好学习  研究这个的人比较少

我前两天是参考百度百科 CRC校验 里面提到的

生成步骤
1、将x的最高次幂为R的生成多项式G(x)转换成对应的R+1位二进制数。
2、将信息码左移R位,相当于对应的信息多项式C(x)*x的R次方。
3、用生成多项式(二进制数)对信息码做除,得到R位的余数。
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。
”计算CRC,得到的都不对。
这个生成步骤与百度百科 CRC 里面提到的

计算过程
1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。

是相同的码?

使用特权

评论回复
19
lzqxs89|  楼主 | 2013-6-18 16:52 | 只看该作者
zhangmangui 发表于 2013-6-18 16:44
他这个有问题  
不可能所有的CRC寄存器都赋值ffff
像CRC_A赋值就是6363

嗯。这个明白!
你所指的“右移”是不是指“ 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。”?

使用特权

评论回复
20
zhangmangui| | 2013-6-18 16:52 | 只看该作者
lzqxs89 发表于 2013-6-18 16:52
嗯。这个明白!
你所指的“右移”是不是指“ 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。”? ...

( ⊙ o ⊙ )是的   就是这儿的左移和右移之分

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

391

帖子

0

粉丝