单片机CRC快速算法
式表。由于Te00和Tf00中只有半个字节不为零,所以,每个余式表只需16个单元(32个字节),两个余式表总共只占用64个字节,这样就可满足PIC单片机的要求了。 由上述思路可知,e=a∧0F0H ,f=a∧0FH ,因此可得,Ta00=Te00? Tf00,同时,还可以证明它们余式的关系为Ra00=Re00? Rf00,也就是说,如果设Ra00=[ ha00 la00 ]、Re00=[ he00 le00 ]和Rf00=[ hf00 lf00 ],则ha00=he00? hf00 ,la00=le00? lf00。这样,三字节序列[a 0 0 ] 的计算可由图3所示的方法来进行,其中,[e 0 0 ]和[f 0 0 ]余式表见表2和表3。
表2 [ e 0 0 ] 余式表
00 10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0
0000 1231 2462 3653 48C4 5AF5 6CA6 7E97 9188 83B9 B5EA A7DB D94C CB7D FD2E EF1F
表3 [ f 0 0 ] 余式表
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 1021 2042 3063 4084 50A5 60C6 70E7 8108 9129 A14A B16B C18C D1AD E1CE F1EF
显然,对于PIC单片机来说,三字节序列[ a b c ]的计算需要综合图2和图3 所示的两种办法来进行,下面就给出一个这样的PIC子程序,它的使用与上面所述的51系列单片机子程序基本相同,即,在第一次被调用之前,先将m1、 m2和m3分别存入通用寄存器BYTEa、BYTEb和BYTEc中;从第二次调用时开始,每次在调用之前只需先将参与本次运算的字节存入BYTEc即可(第二次是m4,第三次是m5,...,第i次是mi+2,...)。每次子程序返回时,计算结果将存放在BYTEa和BYTEb中,最后一次调用返回后,BYTEa和BYTEb分别存放的就是最终结果h和l。子程序中,除BYTEa、BYTEb和BYTEc外,ADDR、RESULTh和RESULTl也是通用寄存器。

图3 三字节序列[ a 0 0 ]的计算办法
START MOVLW DATAe
MOVWF ADDR ;将[e 0 0]余式表首地址DATAe存入ADDR
SWAPF BYTEa,0
ANDLW 0FH ;求e和e指定的[e 0 0] 余式高字节的相对地址
ADDWF ADDR,1 ;取其绝对地址,存入ADDR
START MOVLW DATAe
MOVF ADDR,0 ;把这一绝对地址再存入W
CALL TABLE ;查表,返回时he00放在W中
MOVWF RESULTh ;把he00存入RESULTh
MOVLW 16
ADDWF ADDR,0 ;求e指定的[e 0 0]余式低字节的绝对地址
CALL TABLE ;查表,返回时le00放在W中
MOVWF RESULTl ;把le00存入RESULTl
MOVLW DATAf
MOVWF ADDR ;将[f 0 0]余式表首地址DATAf存入ADDR
MOVF BYTEa,0
ANDLW 0FH ;求f和f指定的[f 0 0]余式高字节的相对地址
ADDWF ADDR,1 ;取其绝对地址,存入ADDR
MOVF ADDR,0 ;把这一绝对地址再存入W
CALL TABLE ;查表,返回时hf00放在W中
XORWF RESULTh,0 ;he00与hf00异或,得ha00,存入W
XORWF BYTEb,0 ;ha00与b异或,得habc,存入W
MOVF BYTEa ;habc存入BYTEa
MOVLW 16
ADDWF ADDR,0 ;求f指定的[f 0 0]余式低字节的绝对地址
CALL TABLE ;查表,返回时lf00放在W中
XORWF RESULTl,0 ;le00与lf00异或,得la00,存入W
XORWF BYTEc,0 ;la00与c异或,得labc,存入W
MOVF BYTEb ;labc存入BYTEb
RETLW 0
- CCITT CRC-16计算原理与实现(07-23)
- 嵌入式系统开发不难,保证可靠性有这几大技巧(06-04)
- 如何开发一款该可靠性的嵌入式系统?这七大技巧值得一学(09-04)
- CRC校验原理与程序设计——(RS485总线系统应用之1)(12-15)
- STM32 CRC ST库3.0.0(12-03)
- CRC16和CRC32探讨(12-02)
