国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

計算法簡單實現(xiàn)crc校驗

發(fā)布時間:2010-11-1 21:43    發(fā)布者:eetech
關(guān)鍵詞: CRC , 計算法 , 校驗
前一段時間做協(xié)議轉(zhuǎn)換器的時間用到CRC-16校驗,查了不少資料發(fā)現(xiàn)都不理想。查表法要建表太麻煩,而計算法覺得那些例子太羅嗦。最后只好自己寫了,最后發(fā)現(xiàn)原來挺簡單嘛:)

兩個子程序搞定。這里用的多項式為:

CRC-16    = X16 + X12 + X5 + X0 = 2^0+2^5+2^12+2^16=0x11021

因最高位一定為“1”,故略去計算只采用0x1021即可

CRC_Byte:計算單字節(jié)的CRC值
CRC_Data:計算一幀數(shù)據(jù)的CRC值
CRC_High  CRC_Low:存放單字節(jié)CRC值
CRC16_High  CRC16_Low:存放幀數(shù)據(jù)CRC值

;-------------------------------------------------------------
;      Function:       CRC one byte
;      Input:             CRCByte
;      Output:           CRC_High CRC_Low
;-------------------------------------------------------------

CRC_Byte:
       clrf         CRC_Low
       clrf         CRC_High
       movlw           09H
       movwf           v_Loop1
       movf              CRCByte, w
       movwf           CRC_High
CRC:
       decfsz            v_Loop1                              ;8次循環(huán),每一位相應(yīng)計算
       goto        CRC10
       goto        CRCend
CRC10
       bcf                STATUS, C
       rlf                  CRC_Low
       rlf                  CRC_High
        
       btfss              STATUS, C
       goto        CRC                                          ;為0不需計算
       movlw           10H                                    ;若多項式改變,這里作相應(yīng)變化
       xorwf            CRC_High, f
       movlw           21H                                    ;若多項式改變,這里作相應(yīng)變化
       xorwf            CRC_Low, f
       goto        CRC
CRCend:
       nop
       nop
       return
;-------------------------------------------------------------
;      CRC one byte end
;-------------------------------------------------------------
;-------------------------------------------------------------
;      Function:       CRC date
;      Input:             BufStart(A,B,C)(一幀數(shù)據(jù)的起始地址) v_Count (要做CRC的字節(jié)數(shù))
;      Output:           CRC16_High CRC16_Low(結(jié)果)
;-------------------------------------------------------------
CRC_Data:

       clrf         CRC16_High
       clrf         CRC16_Low

CRC_Data10

       movf              INDF, w
       xorwf            CRC16_High,w

       movwf           CRCByte
       call         CRC_Byte
       incf         FSR
       decf        v_Count                       ;需計算的字節(jié)數(shù)
        
       movf              CRC_High, w
       xorwf            CRC16_Low, w
       movwf           CRC16_High

       movf              CRC_Low, w
       movwf           CRC16_Low

       movf              v_Count, w                                          ;計算結(jié)束?
       btfss              STATUS, Z
       goto        CRC_Data10

       return

;-------------------------------------------------------------
;             CRC date end
;-------------------------------------------------------------



說明: CRC 的計算原理如下(一個字節(jié)的簡單例子)
    11011000 00000000 00000000  > 8 ) ^ D( n )
其中的 D( n ) 才是一個字節(jié)的原始數(shù)據(jù)。

公式如下:
    PA( n ) = ( PA( n - 1 ) > 8 ) ^ D( n ) )

可以注意到函數(shù) f( d ) 的參數(shù) d 為一個字節(jié),對一個確定的多項式 P, f( d ) 的返回值 是與 d 一一對應(yīng)的,總數(shù)為 256 項,將這些數(shù)據(jù)預(yù)先算出保存在表里,f( d )就轉(zhuǎn)換為一 個查表的過程,速度也就可以大幅提高,這也就是查表法計算 CRC 的原理。

再來看 CRC 表是如何計算出來的,即函數(shù) f( d ) 的實現(xiàn)方法。分析前面一個字節(jié)數(shù)據(jù)的 計算過程可發(fā)現(xiàn),d 對結(jié)果的影響只表現(xiàn)為對 P 的移位異或,看計算過程中的三個 8 位 的列中只低兩個字節(jié)的最后結(jié)果是余數(shù),而數(shù)據(jù)所在的高 8 位列最后都被消去了,因其 中的運(yùn)算均為異或,不產(chǎn)生進(jìn)位或借位,故每一位數(shù)據(jù)只影響本列的結(jié)果,即 d 并不直接 影響結(jié)果。再將前例變化一下重列如下:
    11011000
    --------------------------
    10001000 00010000 1        // P
   ^ 1000100 00001000 01       // P
   ^  000000 00000000 000      // 0
   ^   10001 00000010 0001     // P
   ^    0000 00000000 00000    // 0
   ^     100 01000000 100001   // P
   ^      00 00000000 0000000  // 0
   ^       1 00010000 00100001 // P
           -------------------
             01001010 01110101

現(xiàn)在的問題就是如何根據(jù) d 來對 P 移位異或了,從上面的例子看,也可以理解為每步 移位,但根據(jù) d 決定中間余數(shù)是否與 P 異或。從前面原來的例子可以看出,決定的條件是中間余數(shù)的最高位為0,因為 P 的最高位一定為1,即當(dāng)中間余數(shù)與 d 相應(yīng)位異或的最高位為1時,中間余數(shù)移位就要和 P 異或,否則只需移位即可。其方法如下例(上例的變形,注意其中空格的移動表現(xiàn)了 d 的影響如何被排除在結(jié)果之外):

    d --------a--------
    1 00000000 00000000 <- HSB = 1
      0000000 000000000 <- a <<= 1
      0001000 000100001 <-不含最高位的 1
      -----------------
    1 0001000 000100001
      001000 0001000010
      000100 0000100001
      -----------------
    0 001100 0001100011 <- HSB = 0
      01100 00011000110
      -----------------
    1 01100 00011000110 <- HSB = 1
      1100 000110001100
      0001 000000100001
      -----------------
    1 1101 000110101101 <- HSB = 0
      101 0001101011010
      -----------------
    0 101 0001101011010 <- HSB = 1
      01 00011010110100
      00 01000000100001
      -----------------
    0 01 01011010010101 <- HSB = 0
      1 010110100101010
      -----------------
    0 1 010110100101010 <- HSB = 1
       0101101001010100
       0001000000100001
      -----------------
       0100101001110101 <- CRC

結(jié)合這些,前面的程序就好理解了。
本文地址:http://m.qingdxww.cn/thread-35746-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 更佳設(shè)計的解決方案——Microchip模擬開發(fā)生態(tài)系統(tǒng)
  • 利用模擬開發(fā)工具生態(tài)系統(tǒng)進(jìn)行安全電路設(shè)計
  • 你仿真過嗎?使用免費(fèi)的MPLAB Mindi模擬仿真器降低設(shè)計風(fēng)險
  • Cortex-M4外設(shè) —— TC&TCC結(jié)合事件系統(tǒng)&DMA優(yōu)化任務(wù)培訓(xùn)教程
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 我不卡影视 | 色香婷婷 | 国产91在线免费观看 | gay80岁帅老头毛都白了 | 日本高清中文字幕一区二区三区a | 美女如厕视频 | 97在线观看永久免费视频下载 | 欧美成人a大片 | 国产高清一区二区 | 久久久久久久久久久久久久久 | 精品国产欧美另类一区 | 777久久婷婷成人综合色 | 污网站免费观看在线高清 | 天天影视亚洲 | 欧美精品一区二区久久 | 亚洲欧美视屏 | 欧美日韩一区二区在线视频 | 免费看一片| 国产成人精品一区二区不卡 | 91极品女神嫩模在线播放 | 综合色婷婷| 色网站在线免费观看 | 日日操日日操 | www.4虎影院| 亚洲 欧美 另类中文字幕 | 国产成人亚洲综合一区 | 激情综合站 | 91成人精品| 色婷婷综合久久久久中文一区二区 | 三级在线观看 | 黄毛片视频 | 亚洲视频自拍偷拍 | 男女视频网站在线观看 | 国产自制一区 | 日本护士在线视频xxxx免费 | 亚洲欧洲日产国码一级毛片 | 高清欧美一区二区免费影视 | 偷偷鲁国内视频视频在线 | 四虎国产精品永久地址49 | 99色网站| 五月婷婷在线观看视频 |