打印

XWJ大师来看看……

[复制链接]
2405|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zeromicro|  楼主 | 2007-4-14 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CRC, rc, ps
一:
---------------------------------------------------
按照你给出的公式,CRC8左移的结果是否可以这样计算?
   CRC8  = X8+X5+X4+1 
   CRC(n)=0x131-(n<<8)%0x131
   ::发送数据为0X01时,CRC(n)=0X131-(0X01<<8)%0x131
                           =0X31
   ::发送数据为0X00时,CRC(n)=0X131-(0X00<<8)%0x131
                               =???
                         此时正确值应该等于0X00,公式计算不正确。
   ::发送数据为0X33时,CRC(n)=0X131-(0X33<<8)%0x131
                               =0X3B
                         此时正确值应该等于0X96,公式计算也不正确。

我怎么计算是可以得到正确结果的:
::发送数据0X33时
    (0X33<<8)=0B'11001100000000',0X131=0B'100110001'
     11001100000000
   ^ 100110001
--------------------------
     0101010010
   ^  100110001
--------------------------
      00110001100
   ^    100110001
--------------------------
        0101111010
   ^     100110001
--------------------------
         0010010110----------->0X96

二:
当发送数据为多字节的时候,例如发送0X0102,那么这个两字节数据的CRC值可这样计算:
(CRC8左移计算CRC值)
CRC(0X01)=0X31;
0X31^0X02=0X33;
CRC(0X33)=0X96;
所以CRC(0X0102)=0x96;

三:当使用CRC8右移计算CRC值的时候,如何计算结果?
例如,要发送的数据为0X01,那么如何计算才能得到0X5E的CRC值呢?
PS:CRC8左移计算0X01的CRC值步骤是否如下:
    0X01<<8=0X100--->0B'100000000';
    0X131=0B'100110001'

    100000000
  ^ 100110001
--------------------------
    000110001------->0X31(这么计算对不对?)

相关帖子

沙发
xwj| | 2007-4-14 20:41 | 只看该作者

嗯,确实不对...

使用特权

评论回复
板凳
zeromicro|  楼主 | 2007-4-15 20:50 | 只看该作者

那请问CRC8右移计算CRC值,

执行什么样的计算可以得到0X01的CRC值=0X5E?

使用特权

评论回复
地板
lenglx| | 2007-4-17 12:32 | 只看该作者

不知道你说的右移的意思是否是"低位先发送"的意思.

如果是:
那么你照高位在前的计算方法,0x01相当于发送数据0x80
CRC(0x80) = 0x7a
经过高低位调换,结果是0x5e

   1000 0000 0000 0000
^  1001 1000 1
------------------------
      1 1000 1000 0000
^     1 0011 0001
------------------------
        1011 1001 0000
^       1001 1000 1
------------------------
          10 0001 1000
^         10 0110 001
------------------------
          00 0111 1010   <= result

高低调换, 0101 1110 => 0x5e

使用特权

评论回复
5
zeromicro|  楼主 | 2007-4-17 19:56 | 只看该作者

为什么计算完的结果要执行高低反转?

为什么不说生成的CRC值=0X7A,而必须反转成0X5E?

可不可以这样理解:不管是左移还是右移动,只要发送/接受采用同样的移动方式,就可以实现CRC校验?

对于MCU来说,从移动时计算方便性来看,是不是右移计算增加了很多麻烦,所以,想达到CRC校验,用左移计算方式更简便

使用特权

评论回复
6
lenglx| | 2007-4-17 20:56 | 只看该作者

呵呵

1.为什么不说生成的CRC值=0X7A,而必须反转成0X5E?
  从CRC硬件电路看来,没有LSB/MSB的概念,只能说生成的8位CRC序列是:01111010,应为你的CRC序列位的发送也是跟数据一样,先发送的地位,所以这个序列的值是:0x5e.

2.可不可以这样理解:不管是左移还是右移动,只要发送/接受采用同样的移动方式,就可以实现CRC校验?
  我不知道怎么表达.
  但大致可以说:所谓LSB/MSB应当通讯双方协议上的一个约定,从硬件的角度看,没有什么左移/右移,只是一个bit流而已.

3.对于MCU来说,从移动时计算方便性来看,是不是右移计算增加了很多麻烦,
所以,想达到CRC校验,用左移计算方式更简便
   我不以为有什么麻烦.
   如果你采用BIT位计算的话,无非是从地位开始算起,不会比从高位开始计算增加什么开销.
   如果你采用查表的方式,你可以预先计算出LSB方式下的表值,也不会比从MSB方式困难,只不过表的值不一样而已.

使用特权

评论回复
7
zeromicro|  楼主 | 2007-4-24 09:50 | 只看该作者

这个图如何理解?

1:这个图是否代表着右移方式计算CRC8?
2:图中下方的CRC表达式为何只有0~7位?CRC8的表达式是0X131,为何在此可以把最高位舍去?
3:这个图片是否可以这样理解?
先做三个假设:
::假设发送的数据为0X55
::所以发送的数据流为:LSB-----------------MSB
::                    1--0--1--0--1--0--1--0
::假设图片下方的CRC数据初值=0X00(暂时规定这个值用符号CRCDATA表示)
::假设CRC8的多项式值=0X31,用CRCTEMP符号表示;
我理解的运算过程如下:
第一步:数据流LSB位移出,如果LSB位=0则直接跳到第二步,如果LSB位=1,则执行CRCDATA=CRCTEMP^CRCDATA,因为发送的数据(0X55)的第一位为1,所以本步执行完毕后CRCDATA=0X31
第二步:发送数据位=0,所以直接跳到第三步执行,CRCDATA=0X31
第三步:发送数据位=1,所以CRCDATA=CRCTEMP^CRCDATA=0X31^0X31=0?
       好象已经错了,下面的我已经推导不出来了.
请哪位老大就上面三步的错误指教一下.

使用特权

评论回复
8
zeromicro|  楼主 | 2007-4-24 09:52 | 只看该作者

俺认为哪位老大能把这个例子讲解清楚,

基本上就把CRC的计算过程全讲解明白了.


使用特权

评论回复
9
zeromicro|  楼主 | 2007-4-25 08:20 | 只看该作者

大家快来看啊……

CRC大甩卖拉……

使用特权

评论回复
10
lenglx| | 2007-4-25 09:42 | 只看该作者

RE:

第一步:数据流LSB位移出,如果LSB位=0则直接跳到第二步,如果LSB位=1,则执行CRCDATA=CRCTEMP^CRCDATA,因为发送的数据(0X55)的第一位为1,所以本步执行完毕后CRCDATA=0X31 第二步:发送数据位=0,所以直接跳到第三步执行,CRCDATA=0X31 第三步:发送数据位=1,所以CRCDATA=CRCTEMP^CRCDATA=0X31^0X31=0? 好象已经错了,下面的我已经推导不出来了. 请哪位老大就上面三步的错误指教一下.

过程应当如下:
你的那个CRCTEMP变量名称容易引起误会,我改成GX进行描述.
第一步:数据流LSB位移出,如果LSB位^CRCDATA.7=0则CRCDATA = CRCDATA << 1,否则CRCDATA = CRCDATA << 1,CRCDATA=GX^CRCDATA,因为发送的数据(0X55)的第一位为1,而且CRCDATA.7=0,(初始化是CRCDATA=0,如果曾经有一些数据曾经经过移位寄存器,则需要考虑当前CRCDATA的BIT7),所以本步执行完毕后CRCDATA=0X31;
 第二步:发送数据位=0,所以CRCDATA=0X31<<1CRCDATA=0x62.
 第三步:发送数据位=1,所以CRCDATA=0x62<<1;CRCDATA ^= GX;CRCDATA = 0xC4 ^ 0x31 = 0xF5.
 

使用特权

评论回复
11
zeromicro|  楼主 | 2007-4-25 22:05 | 只看该作者

狂谢lenglx老大的推导……

还有不知道CRC算法的嘛?


看这个推导过程就基本上明白了。



嘿嘿,我消化吸收中……



谢谢谢谢谢谢……













谢谢谢谢谢谢……

使用特权

评论回复
12
zeromicro|  楼主 | 2007-4-26 14:50 | 只看该作者

消化不良,继续问……

过程应当如下:
你的那个CRCTEMP变量名称容易引起误会,我改成GX进行描述.
第一步:数据流LSB位移出,如果LSB位^CRCDATA.7=0则CRCDATA = CRCDATA << 1,否则CRCDATA = CRCDATA << 1,CRCDATA=GX^CRCDATA,因为发送的数据(0X55)的第一位为1,而且CRCDATA.7=0,(初始化是CRCDATA=0,如果曾经有一些数据曾经经过移位寄存器,则需要考虑当前CRCDATA的BIT7),所以本步执行完毕后CRCDATA=0X31;
第二步:发送数据位=0,所以CRCDATA=0X31<<1CRCDATA=0x62.
第三步:发送数据位=1,所以CRCDATA=0x62<<1;CRCDATA ^= GX;CRCDATA = 0xC4 ^ 0x31 = 0xF5.
 
:::数据流是LSB先移出,为什么CRCDATA却要按照<<计算?那个CRC示意图怎么看可以确定CRCDATA是左移?
:::图上的第一个符号如何理解?
:::我这么理解这个图可不可以:
   1:数据按照MSB-->...--->LSB--->顺序移动
   2:CRC寄存器按照0--->....---7--->顺序移动
   3:数据每移出一位后,此时也就是数据的LSB位移出,CRC寄存器也向前移动一位,也就是CRCDATA.7移出,从图片最下面的那个返回线来看,即产生CRCDATA.7^LSB动作,并且执行LSB^CRCDATA.4,LSB^CRCDATA.5动作
   4:8位数据按照上面3步移动完毕也就是CRCDATA计算完毕
   5:CRCDATA计算完后,CRCDATA送出结果,送出顺序为0->1->2->3->4--...-->7
   6:假如发送数据0X01,则CRCDATA=0X7A,对应图中CRC电路,位对应关系如下
     位:0----1----2----3----4----5----6----7
     数:0    1    0    1    0    1    1    1
        ------------------------------------------------
        =0X5E
     所以CRC结果是0X7A还是0X5E完全取决于CRC电路如何把结果送出去了,所以我是否可以这样认为,不管是0X7A还是0X5E的结果,都已经完成了CRC运算,都可以达到CRC检错的目的.
:::最后问一个MCU实现的问题
   假设我使用查表的方式得到CRC值,如果我发送的数据为0X010203,则我是否可以这样做:CRC(0X010203)=CRC{CRC[CRC(0X01)^0X02]^0X03}
解释如下:先查表得到第一个发送数据0X01的CRC查表值(用CRC(0X01)符号表示这个值),然后执行CRC(0X01)^0X02(用CRCBUF1表示),然后把CRCBUF1当成发送数据,求得它的CRC结果(假设用CRCBUF2表示),接着计算CRCBUF2^0X03(用CRCBUF3表示),求得CRC(CRCBUF3)的结果就是发送数据0X010203的CRC结果.

使用特权

评论回复
13
zeromicro|  楼主 | 2007-4-26 15:04 | 只看该作者

假设发送0X010203,CRC8右移计算CRC

CRC初值=0X00,CRC计算过程如下,请指教对不对:
1:CRC(0X01)=0X5E
2:0X5E^0X02=0X5C
  CRC(0X5C)=0X78
3:0X78^0X03=0X7B
  CRC(0X7B)=0XD8
所以发送0X010203后发送的第四个CRC校验值=0XD8,接受方接受到后亦依据此判断是否出错.

使用特权

评论回复
14
zeromicro|  楼主 | 2007-4-30 15:04 | 只看该作者

哇哇哇……

???

使用特权

评论回复
15
zeromicro|  楼主 | 2007-5-6 21:24 | 只看该作者

wawawa^--^^--^

使用特权

评论回复
16
zeromicro|  楼主 | 2007-5-7 11:09 | 只看该作者

哇哇哇……

使用特权

评论回复
17
dengm| | 2007-5-7 15:20 | 只看该作者

最快的不用 DPTR 的 crc8 (51 asm)

CRC_8:
      ;INPUT: R0: RAM DATA
      ;       R7: BYTES
      ;OUTPUT: A
      ;USE: A, R0, R7

     CLR A
CRC_8_1:
      XRL A, @R0
      INC R0
      CALL CRC8_TAB
    DJNZ R7, CRC_8_1
    RET

CRC8_TAB:
      XRL A, #57
      MOVC A, @A+PC
      RET    ; RET 的机器码 为 0x22

TAB_CRC8_57:
      ;DB 022H  RET 
      DB       07CH, 09EH, 0C0H, 043H, 01DH, 0FFH, 0A1H
      DB 0E0H, 0BEH, 05CH, 002H, 081H, 0DFH, 03DH, 063H
      DB 0BFH, 0E1H, 003H, 05DH, 0DEH, 080H, 062H, 03CH
      DB 07DH, 023H, 0C1H, 09FH, 01CH, 042H, 0A0H, 0FEH
      DB 001H, 05FH, 0BDH, 0E3H, 060H, 03EH, 0DCH, 082H
      DB 0C3H, 09DH, 07FH, 021H, 0A2H, 0FCH, 01EH, 040H
      DB 09CH, 0C2H, 020H, 07EH, 0FDH, 0A3H, 041H, 01FH
      DB 05EH, 000H, 0E2H, 0BCH, 03FH, 061H, 083H, 0DDH
      DB 064H, 03AH, 0D8H, 086H, 005H, 05BH, 0B9H, 0E7H
      DB 0A6H, 0F8H, 01AH, 044H, 0C7H, 099H, 07BH, 025H
      DB 0F9H, 0A7H, 045H, 01BH, 098H, 0C6H, 024H, 07AH
      DB 03BH, 065H, 087H, 0D9H, 05AH, 004H, 0E6H, 0B8H
      DB 047H, 019H, 0FBH, 0A5H, 026H, 078H, 09AH, 0C4H
      DB 085H, 0DBH, 039H, 067H, 0E4H, 0BAH, 058H, 006H
      DB 0DAH, 084H, 066H, 038H, 0BBH, 0E5H, 007H, 059H
      DB 018H, 046H, 0A4H, 0FAH, 079H, 027H, 0C5H, 09BH
      DB 0AEH, 0F0H, 012H, 04CH, 0CFH, 091H, 073H, 02DH
      DB 06CH, 032H, 0D0H, 08EH, 00DH, 053H, 0B1H, 0EFH
      DB 033H, 06DH, 08FH, 0D1H, 052H, 00CH, 0EEH, 0B0H
      DB 0F1H, 0AFH, 04DH, 013H, 090H, 0CEH, 02CH, 072H
      DB 08DH, 0D3H, 031H, 06FH, 0ECH, 0B2H, 050H, 00EH
      DB 04FH, 011H, 0F3H, 0ADH, 02EH, 070H, 092H, 0CCH
      DB 010H, 04EH, 0ACH, 0F2H, 071H, 02FH, 0CDH, 093H
      DB 0D2H, 08CH, 06EH, 030H, 0B3H, 0EDH, 00FH, 051H
      DB 0E8H, 0B6H, 054H, 00AH, 089H, 0D7H, 035H, 06BH
      DB 02AH, 074H, 096H, 0C8H, 04BH, 015H, 0F7H, 0A9H
      DB 075H, 02BH, 0C9H, 097H, 014H, 04AH, 0A8H, 0F6H
      DB 0B7H, 0E9H, 00BH, 055H, 0D6H, 088H, 06AH, 034H
      DB 0CBH, 095H, 077H, 029H, 0AAH, 0F4H, 016H, 048H
      DB 009H, 057H, 0B5H, 0EBH, 068H, 036H, 0D4H, 08AH
      DB 056H, 008H, 0EAH, 0B4H, 037H, 069H, 08BH, 0D5H
      DB 094H, 0CAH, 028H, 076H, 0F5H, 0ABH, 049H, 017H
;-------------------------------------------------------
 

使用特权

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

本版积分规则

7

主题

99

帖子

0

粉丝