www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]前一段時(shí)間做協(xié)議轉(zhuǎn)換器的時(shí)間用到CRC-16校驗(yàn),查了不少資料發(fā)現(xiàn)都不理想。查表法要建表太麻煩,而計(jì)算法覺(jué)得那些例子太羅嗦。最后只好自己寫(xiě)了,最后發(fā)現(xiàn)原來(lái)挺簡(jiǎn)單嘛:)

   前一段時(shí)間做協(xié)議轉(zhuǎn)換器的時(shí)間用到CRC-16校驗(yàn),查了不少資料發(fā)現(xiàn)都不理想。查表法要建表太麻煩,而計(jì)算法覺(jué)得那些例子太羅嗦。最后只好自己寫(xiě)了,最后發(fā)現(xiàn)原來(lái)挺簡(jiǎn)單嘛:)

兩個(gè)子程序搞定。這里用的多項(xiàng)式為:
CRC-16    = X16 + X12 + X5 + X0 = 2^0+2^5+2^12+2^16=0x11021

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

CRC_Byte:計(jì)算單字節(jié)的CRC值
CRC_Data:計(jì)算一幀數(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)計(jì)算
       goto        CRC10
       goto        CRCend
CRC10
       bcf                STATUS, C
       rlf                  CRC_Low
       rlf                  CRC_High
       
       btfss              STATUS, C
       goto        CRC                                          ;為0不需計(jì)算
       movlw           10H                                    ;若多項(xiàng)式改變,這里作相應(yīng)變化
       xorwf            CRC_High, f
       movlw           21H                                    ;若多項(xiàng)式改變,這里作相應(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                       ;需計(jì)算的字節(jié)數(shù)
       
       movf              CRC_High, w
       xorwf            CRC16_Low, w
       movwf           CRC16_High

       movf              CRC_Low, w
       movwf           CRC16_Low

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

       return

;<>-------------------------------------------------------------
;             CRC date end
;<>-------------------------------------------------------------



說(shuō)明: CRC 的計(jì)算原理如下(一個(gè)字節(jié)的簡(jiǎn)單例子)
    11011000 00000000 00000000  <- 一個(gè)字節(jié)數(shù)據(jù), 左移 16b
   ^10001000 00010000 1         <- CRC-CCITT 多項(xiàng)式, 17b
    --------------------------
     1010000 00010000 10        <- 中間余數(shù)
    ^1000100 00001000 01
     -------------------------
       10100 00011000 1100
      ^10001 00000010 0001
       -----------------------
         101 00011010 110100
        ^100 01000000 100001
         ---------------------
           1 01011010 01010100
          ^1 00010000 00100001
           -------------------
             01001010 01110101  <- 16b CRC

仿此,可推出兩個(gè)字節(jié)數(shù)據(jù)計(jì)算如下:d 為數(shù)據(jù),p 為項(xiàng)式,a 為余數(shù)
    dddddddd dddddddd 00000000 00000000 <- 數(shù)據(jù) D ( D1, D0, 0, 0 )
   ^pppppppp pppppppp p                 <- 多項(xiàng)式 P
    -----------------------------------
    ...
             aaaaaaaa aaaaaaaa 0        <- 第一次的余數(shù) A’ ( A’1, A’0 )
            ^pppppppp pppppppp p
             --------------------------
             ...
                      aaaaaaaa aaaaaaaa <- 結(jié)果 A ( A1, A0 )

由此與一字節(jié)的情況比較,將兩個(gè)字節(jié)分開(kāi)計(jì)算如下:
先算高字節(jié):
    dddddddd 00000000 00000000 00000000 <- D1, 0, 0, 0
   ^pppppppp pppppppp p                 <- P
    -----------------------------------
    ...
             aaaaaaaa aaaaaaaa          <- 高字節(jié)部分余數(shù) PHA1, PHA0

此處的部分余數(shù)與前面兩字節(jié)算法中的第一次余數(shù)有如下關(guān)系,即 A’1 = PHA1 ^ D0, A’0 = PHA0:
             aaaaaaaa aaaaaaaa          <- PHA1, PHA0
            ^dddddddd                   <- D0
             -----------------
             aaaaaaaa aaaaaaaa          <- A’1, A’0

低字節(jié)的計(jì)算:
             aaaaaaaa 00000000 00000000 <- A’1, 0, 0
            ^pppppppp pppppppp p        <- P
             --------------------------
             ...
                      aaaaaaaa aaaaaaaa <- 低字節(jié)部分余數(shù) PLA1, PLA0
                     ^aaaaaaaa          <- A’0 , 即 PHA0
                      -----------------
                      aaaaaaaa aaaaaaaa <- 最后的 CRC ( A1, A0 )

總結(jié)以上內(nèi)容可得規(guī)律如下:
設(shè)部分余數(shù)函數(shù)
    PA = f( d )
其中 d 為一個(gè)字節(jié)的數(shù)據(jù)(注意,除非 n = 0 ,否則就不是原始數(shù)據(jù),見(jiàn)下文)
第 n 次的部分余數(shù)
    PA( n ) = ( PA( n - 1 ) << 8 ) ^ f( d )
其中的
    d = ( PA( n - 1 ) >> 8 ) ^ D( n )
其中的 D( n ) 才是一個(gè)字節(jié)的原始數(shù)據(jù)。

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

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

再來(lái)看 CRC 表是如何計(jì)算出來(lái)的,即函數(shù) f( d ) 的實(shí)現(xiàn)方法。分析前面一個(gè)字節(jié)數(shù)據(jù)的 計(jì)算過(guò)程可發(fā)現(xiàn),d 對(duì)結(jié)果的影響只表現(xiàn)為對(duì) P 的移位異或,看計(jì)算過(guò)程中的三個(gè) 8 位 的列中只低兩個(gè)字節(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)在的問(wèn)題就是如何根據(jù) d 來(lái)對(duì) P 移位異或了,從上面的例子看,也可以理解為每步 移位,但根據(jù) d 決定中間余數(shù)是否與 P 異或。從前面原來(lái)的例子可以看出,決定的條件是中間余數(shù)的最高位為0,因?yàn)?nbsp;P 的最高位一定為1,即當(dāng)中間余數(shù)與 d 相應(yīng)位異或的最高位為1時(shí),中間余數(shù)移位就要和 P 異或,否則只需移位即可。其方法如下例(上例的變形,注意其中空格的移動(dòng)表現(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é)合這些,前面的程序就好理解了。 
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

武漢2025年9月9日 /美通社/ -- 7月24日,2025慧聰跨業(yè)品牌巡展——湖北?武漢站在武漢中南花園酒店隆重舉辦!本次巡展由慧聰安防網(wǎng)、慧聰物聯(lián)網(wǎng)、慧聰音響燈光網(wǎng)、慧聰LED屏網(wǎng)、慧聰教育網(wǎng)聯(lián)合主辦,吸引了安防、...

關(guān)鍵字: AI 希捷 BSP 平板

上海2025年9月9日 /美通社/ -- 9月8日,移遠(yuǎn)通信宣布,其自研藍(lán)牙協(xié)議棧DynaBlue率先通過(guò)藍(lán)牙技術(shù)聯(lián)盟(SIG)BQB 6.1標(biāo)準(zhǔn)認(rèn)證。作為移遠(yuǎn)深耕短距離通信...

關(guān)鍵字: 藍(lán)牙協(xié)議棧 移遠(yuǎn)通信 COM BSP

上海2025年9月9日 /美通社/ -- 為全面落實(shí)黨中央、國(guó)務(wù)院和上海市委、市政府關(guān)于加快發(fā)展人力資源服務(wù)業(yè)的決策部署,更好發(fā)揮人力資源服務(wù)業(yè)賦能百業(yè)作用,8月29日,以"AI智領(lǐng) HR智鏈 靜候你來(lái)&quo...

關(guān)鍵字: 智能體 AI BSP 人工智能

北京2025年9月8日 /美通社/ -- 近日,易生支付與一汽出行達(dá)成合作,為其自主研發(fā)的"旗馭車(chē)管"車(chē)輛運(yùn)營(yíng)管理平臺(tái)提供全流程支付通道及技術(shù)支持。此次合作不僅提升了平臺(tái)對(duì)百余家企業(yè)客戶的運(yùn)營(yíng)管理效率...

關(guān)鍵字: 一汽 智能化 BSP SAAS

深圳2025年9月8日 /美通社/ -- 晶泰科技(2228.HK)今日宣布,由其助力智擎生技制藥(PharmaEngine, Inc.)發(fā)現(xiàn)的新一代PRMT5抑制劑PEP0...

關(guān)鍵字: 泰科 AI MT BSP

上海2025年9月5日 /美通社/ -- 由上海市經(jīng)濟(jì)和信息化委員會(huì)、上海市發(fā)展和改革委員會(huì)、上海市商務(wù)委員會(huì)、上海市教育委員會(huì)、上海市科學(xué)技術(shù)委員會(huì)指導(dǎo),東浩蘭生(集團(tuán))有限公司主辦,東浩蘭生會(huì)展集團(tuán)上海工業(yè)商務(wù)展覽有...

關(guān)鍵字: 電子 BSP 芯片 自動(dòng)駕駛

推進(jìn)卓越制造,擴(kuò)大產(chǎn)能并優(yōu)化布局 蘇州2025年9月5日 /美通社/ --?耐世特汽車(chē)系統(tǒng)與蘇州工業(yè)園區(qū)管委會(huì)正式簽署備忘錄,以設(shè)立耐世特亞太總部蘇州智能制造項(xiàng)目。...

關(guān)鍵字: 智能制造 BSP 汽車(chē)系統(tǒng) 線控

慕尼黑和北京2025年9月4日 /美通社/ -- 寶馬集團(tuán)宣布,新世代首款量產(chǎn)車(chē)型BMW iX3將于9月5日全球首發(fā),9月8日震撼亮相慕尼黑車(chē)展。中國(guó)專(zhuān)屬版車(chē)型也將在年內(nèi)與大家見(jiàn)面,2026年在國(guó)內(nèi)投產(chǎn)。 寶馬集團(tuán)董事...

關(guān)鍵字: 寶馬 慕尼黑 BSP 數(shù)字化

北京2025年9月4日 /美通社/ --?在全球新一輪科技革命與產(chǎn)業(yè)變革的澎湃浪潮中,人工智能作為引領(lǐng)創(chuàng)新的核心驅(qū)動(dòng)力,正以前所未有的深度與廣度重塑各行業(yè)發(fā)展格局。體育領(lǐng)域深度融入科技變革浪潮,駛?cè)霐?shù)字化、智能化轉(zhuǎn)型快車(chē)...

關(guān)鍵字: 人工智能 智能體 AI BSP

上海2025年9月2日 /美通社/ -- 近日,由 ABB、Moxa(摩莎科技)等八家企業(yè)在上海聯(lián)合發(fā)起并成功舉辦"2025 Ethernet-APL 技術(shù)應(yīng)用發(fā)展大會(huì)"。會(huì)議以"破界?融合...

關(guān)鍵字: ETHERNET 智能未來(lái) BSP 工業(yè)通信
關(guān)閉