<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 循環(huán)冗余校驗碼的單片機及CPLD實(shí)現

循環(huán)冗余校驗碼的單片機及CPLD實(shí)現

作者: 時(shí)間:2012-03-20 來(lái)源:網(wǎng)絡(luò ) 收藏

1 基本原理

本文引用地址:http://dyxdggzs.com/article/171833.htm

串行數據的差錯檢驗是保證數據正確的必要手段,通常采用奇遇法和冗余法。這兩種方法都是通過(guò)冗余數據來(lái)提供必要信息。奇偶法適用于以字節為單位數據傳輸。例如用偶校驗傳送1個(gè)ASCII字符時(shí),要附加1個(gè)校驗位,從而使全部9位中“1”的個(gè)數為偶數。奇偶校驗簡(jiǎn)單易行,但當數據崩潰或出現多位錯誤時(shí),往往不能檢驗出來(lái),因而可靠性不高。

冗余碼校驗法利用了和反饋機制,校驗碼由輸入數據與歷史數據經(jīng)過(guò)較為復雜的運算而得到。因此,冗余碼包含了更為豐富的數據間的信息,可靠性更高。校好的循環(huán)冗余碼可校驗出以下錯誤:①全部數據位任意奇數個(gè)位出錯;②全部數據位中任意連續2位出錯;③處于一個(gè)8位時(shí)間窗內的任1~8位數據出錯。

使用循環(huán)冗余碼校驗方法通信時(shí),發(fā)送方先計算待發(fā)數據的校驗碼,然后將數據與校驗碼起發(fā)出;接收方接收數據的同時(shí)進(jìn)行循環(huán)冗余碼的計算,并將計算結果與來(lái)自發(fā)送方的校驗碼相比較,如不相同表示傳輸過(guò)程中出現了錯誤,接收方必須通知發(fā)送方再次發(fā)送該組數據。

假設要傳輸64位數據(最后8位是校驗碼),并使用多項式x8+x5+x4+1來(lái)產(chǎn)生8位循環(huán)冗余校驗碼(以下簡(jiǎn)稱(chēng)CRC碼)。其邏輯結構可用異或門(mén)和移位寄存器表示,如圖1所示。寄存器的值即為輸入數據的CRC碼。首先來(lái)輸入數據與最低位的異或值,如為“0”,只需將當前CRC碼邏輯右移1位(首位補零),即可得到新CRC碼;如為“1”,則將當前CRC碼與18H異或,再循環(huán)右移1位即可。該校驗碼有以下特點(diǎn):①當輸入的8位數據(低位在前)與當前 CRC碼相同時(shí),輸出的CRC碼將是零。因此,當包含8位CRC碼的全部64位數據輸入后,輸出的CRC碼應為零。②只要有非零位即可判決傳輸錯誤,而必復雜的校驗技術(shù)。

39.gif

2 用匯編語(yǔ)言產(chǎn)生循環(huán)冗長(cháng)余校驗碼

在8051上,由以下代碼可得8位CRC碼(存于變量CRC中),8位輸入數據暫存于A(yíng)CC中。
DO_CRC:PUSH ACC ;保存輸入數據
PUSH B ;保存B寄存器
PUSH ACC ;再次保存
MOV B,#8 ;共有8位數據
CRC_LOOP:XRL A,CRC
RRC A ;將最低位與輸入數據的異或值放入進(jìn)位標志中
MOV A,CRC
JNC ZERO
XRL A,#18H;當前CRC碼與18H異或
ZERO: RRC A ;右移1位
MOV CRC,A ;保存新CRC碼
POP ACC
RR A ;取出輸入數據的第2位
PUSH ACC
DJNZ B,CRC_LOOP ;循環(huán)
POP ACC
POP B
POP ACC ;恢復各寄存器
RET

上述程序對每一位輸入數據都要執行一系列操作,運算量很大,但內存占用少,適合于內存緊張的情況。當內存充裕時(shí),可以使用效率更高的查表法。

3 用查表法求CRC碼

將輸入數據按字節分開(kāi),每字節值在0~255之間。令當前CRC碼為00H,當分別輸入0~255時(shí),得到256個(gè)CRC碼。將它們順序排列就構成了循環(huán)冗余校驗碼表。用當前CRC碼與輸入字節異或后的值作為下標,查表即可求出新CRC碼。下例中,crc存放CRC碼,ACC存放輸入字節, crc_table為循環(huán)冗余校驗表的入口地址。代碼如下:
XRL A,crc ;當前CRC碼與輸入數據異或
PUSH DPH
PUSH DPL ;保存數據指針
MOV DPTR #crc_table
MOVC A,@A+DPTR;查表
MOV crc,A
POP DPL
POP DPH ;恢復數據指針
RET
crc_table:
DB 00H,5EH,BCH,E2H,61H,3FH,DDH,83H
DB C2H,9CH,7EH,20H,A3H,FDH,1FH,41H
DB 9DH,C3H,21H,7FH,FCH,A2H,40H,1EH
……


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>