<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è) > 手機與無(wú)線(xiàn)通信 > 設計應用 > CRC校驗編程和硬件快速校驗探討

CRC校驗編程和硬件快速校驗探討

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

引 言
循環(huán)冗余(Cyclic Remdancy Check,)是最為常用的計算機和儀表數據通信的方法。碼是一種線(xiàn)性分組碼,編碼簡(jiǎn)單但具有很強的檢錯糾錯能力。除了各種嵌入式儀表、變頻器等設備,還有一些數字型傳感器的輸出數據也提供碼,如數字溫度傳感器DSl8820、集成溫濕度采集芯片SHTll等。但是,各廠(chǎng)商所提供的CRC多項式(用于同通信碼模除)互有差別,且有CRC一8和CRC一16之分。另外,規定模除余數初始值所有的位有全清0或全置1之分(其CRC生成電路不同),故其模除求余的運算過(guò)程也不相同。初接觸者往往難以領(lǐng)晤,省略CRC校驗使通信的可靠性降低。而不少C語(yǔ)言程序,運算時(shí)需要使用較多的RAM單元,較難在80C51、PIC16等低檔單片機上運行。
因此,對于嵌入式系統中的CRC校驗,事先根據特定的校驗多項式,算出1字節數據范圍所對應的256個(gè)余數,將其作為表格,寫(xiě)到程序存儲器中查詢(xún)而避免在線(xiàn)運算,已是非常通用的做法。鑒于此,有些廠(chǎng)商在說(shuō)明書(shū)中就直接給出了這個(gè)列表。但如果是CRC一16校驗,存儲表格要占512字節(CRC一32則需要1 KB),對于有限的單片機ROM資源來(lái)說(shuō)所占比例不小,往往只因為多裝了此表,就不得不升級單片機的型號。
本文分析和解釋了實(shí)際CRC校驗碼的生成特點(diǎn),據此給出節省RAM和ROM且運算的通用CRC校驗思想和程序結構,并了用少量實(shí)現、可靠CRC校驗的方法。

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


1 CRC原理和實(shí)際校驗碼的反序生成特點(diǎn)
一個(gè)k位二進(jìn)制數據在傳送時(shí),按一定規律附加一些冗余位而增大其碼距,就能檢錯和糾錯。標準CRC碼是將原數據左移r位,再用r+1位的特別約定多項式(poly—nomial funetion)模除之,獲得最多為r(8、16、32)位的余數,跟隨原數據之后生成k+r位的編碼發(fā)送。接收方再用相同的約定多項式,模除收到的數據,余數為O則傳輸無(wú)誤,為其他值則對應各個(gè)位的出錯。
但是對于實(shí)際應用,為加快通信速度,r位的余數并不是每次都傳輸,而是采用累計模加(異或)的方法,不斷地與下一個(gè)k位數據異或運算,組成新的中間余數(仍為r位,因一般選擇r≥k),再被約定多項式模除得到新的余數值,依此類(lèi)推,直到所有通信數據都同中間余數異或,再模除完為止。如此得到最終的r位余數,作為全組數據校驗的CRC碼附在該組數據之后發(fā)送。接收方以同樣的過(guò)程,算得收到數組的最終余數,再同最后收到的CRC碼對比(或將CRC碼也作為數據,看最后余數是否為O)。當然這樣只能查出該組數據的傳輸是否有錯,而不能糾錯。
首數據的余數是唯一的,再異或進(jìn)后續的任何一個(gè)特定數據之后,結果依然唯一。所以只要選擇r有足夠的位數,就能保證多個(gè)數據中一旦有個(gè)別位傳輸錯誤,其最終的CRC余數與傳輸正確的余數相等的可能性極低,因此能查出傳輸錯誤。
對于元器件和不少的設備來(lái)說(shuō),其最終余數,即組校驗的CRC碼,是靠生成的。為了使硬件電路簡(jiǎn)化,也為了接收方易于校驗,往往采用變形生成的CRC碼和與其對應的校驗處理方式。
對于模除余數的初始值,ISO/IEC 13239標準規定各位(8、16、32)均置1,而DSl8820器件和一些控制儀表的通信CRC碼卻是清0。在軟件編程時(shí)要根據不同器件賦予不同的初始值。
特別約定多項式g(x)都是r+1位的,如ISO/IEC13239標準的CRC一8,g(x)=x8+x2+x+1。其最高位恒為1,將其隱含則可簡(jiǎn)化模除運算,但這樣一來(lái)后面多位是O,較難在多字節(如16位需2字節)CRC校驗中定位計算和存儲。因此,大多數CRC碼生成和校驗的處理都采用將約定多項式反序的方法,即將最低位1放到最高位并丟棄最高次冪系數1,從而將運算和存儲都降為r位。
對于CRC一8,g(x)=x8+x2+x+1,去高位反序后的模除數為11100000(OEOH),r=8。
對于CRC一16,g(x)=x16+x15+x2+1,去高位反序后的模除數為OA001H,r=16。
對于CRC一CCITT,g(x)=x16+x12+x5+1,同樣處理后的模除數為8408H,但也常用正序值1021H。
對于CRC一32,g(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1,處理后的模除數為0EDB88320H,r=32。
如上處理后,按理說(shuō)被模除數和余數也應該反序。但這樣的話(huà)r位的余數在同下一個(gè)k位數據模加時(shí)不但k位數據應反序,而且必須左端(最高位)對齊進(jìn)行異或,處理起來(lái)不但麻煩也容易出錯。因此,實(shí)際CRC碼的生成和校驗一般仍是將余數,即被(模)除數,按正序排列,新數據也仍是右對齊異或進(jìn)余數中。但是將被模除數原先的左移r位右添0改成了右移r位左添(r個(gè))O。這相當于k+r位被模除數中僅r位被反序(放左端),而前面k位(現放于右端)依然正序??梢钥闯?,按反序原則,實(shí)際上每一次都是異或進(jìn)通信數據的反序值,如11001000B(0C8H)變?yōu)?00100ll(13H),再異或進(jìn)被模除數來(lái)求取CRC校驗碼。但由于所有二進(jìn)制數的反序值都是唯一對應的,所以并不影響生成CRC碼的唯一確定性,只是接收方需要按照同樣的反序規則處理.

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


分頻器相關(guān)文章:分頻器原理

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

關(guān)鍵詞: 校驗 探討 快速 編程 CRC 硬件

評論


相關(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>