由單片機嵌入式系統與微機組成的工業檢測和數據采集系統中,計算機與單片機之間經常需要進行數據通信。在數字通信過程中,干擾有可能使接收到的二進制數和發送的不一致,造成“0”和“1”互變的差錯。一個實用的通信系統必需能發現這種差錯,并加以糾正或給出重新發送信息。CRC(CyclICRedundancy Code循環冗余碼),也稱多項式編碼。是一種檢錯效率高、原理簡單、易于實現的通信編碼,是目前在數字通信領域應用最為廣泛的一種檢驗方式。如16位的 CRC—CCITT標準可以檢測出所有的單位錯、雙位錯、奇位數錯及小于等于16位的突發錯,大于17位的突發錯檢錯率為99.9984%[1]。可見, CRC碼的檢錯率要大大高于一般的奇偶校驗。因此CRC校驗可以應用于重要數據的通信場合,如下位機運行狀態的檢測、運行模式或參數的在線重設置等。
對于8位的單片機系統,要實現CRC通信就必須編寫生成CRC碼的指令程序,且由于單片機的程序存儲器很少、運算速度也比較低,因此要求程序代 碼盡量少,算法必須簡單。下面將以CRC—CCITT標準為例來介紹CRC通信碼的單片機實現過程。
1 CRC校驗碼的構成
求得余式R(x),使等式左端的代數式恰為CRC校驗式G(x)的整數倍。則將其與待發送的數據多項式xr·M(x)相加得到的r+k次多項式的各個系數(mk-1,mk-2,…,m1,m0,rr-1,rr-2,…,r1,r0)作為編碼一起發送,其中高k位是信息位,低r位是附加校驗位。在數據接收端,再對接收到的信息碼進行校驗,如能被同 一個G(x)整除,則表明通信正確;若余數不為0,表示數據傳輸有誤,從而達到檢錯的目的。
CRC校驗雖然不能100%檢測出錯誤,但它的漏檢率相當低。漏檢概率和所選取的校驗標準相關,國際上已有多種CRC校驗式標準。其中8位的CRC碼標準有CDT約定,其校驗式為G(x)=x8+x2+x+1;16位的標準有CCITT(國際電報電話咨詢委員會推薦)標準G(x)=x16+x12+x5+1,和IBM公司提出的CRC-16標準G(x)=x16+x12+x2+1;校驗錯誤效率最高的是具有32位CRC校驗碼的
2 多字節信息序列CRC碼的快速算法
假設需要傳送的一組信息碼N為k個字節二進制序列:
Nk=[n1 n2……nk]
其中的ni為信息碼中的各個字節。
以16位校驗碼的CRC—CCITT標準來說明生成校驗冗余碼的快速算法。N(x)在計算冗余碼的時候應該在后面補充兩個零字節,作為待計算的信息碼。為方便起見,還統一用N(x)表示。
對應的前k-1個字節構成的序列可以表示為:
關系,若已知算式Nk-1的余項Rk-1,就可以求得Nk的余項Rk,已知Rk-2,就可求得Rk-1,依次類推。因為校驗式G(x)的最高項為16次,x8 Rk-1(x)+nk(x)的最高冪次不超過23,所以最后可歸結為求[n1 n2 n3]3字節序列余項的問題,每次遞推都進行3字節的求余運算。按照上述的方法,很容易編制單片機上CRC校驗碼的實現程序。
3 CRC校驗碼在51單片機上的實現
以CRC-CCITT標準為例,按前面多字節數據CRC冗余碼的構造過程,51系列單片機計算多字節數據的CRC碼程序如下。其中,從31H開始存放信息字節數據,算得校驗碼的高8位存于R3,低8位存于R4。
4 CRC碼的查表方法
上面的程序中,每次計算一組3字節的CRC余項需要進行8次循環操作,每次循環包括2字節的數據移動,和3次異或操作。對于時間要求嚴格的 數據采樣場合,速度可能跟不上。這時可以把對1字節通信數據的所有取值(共256個)求得CRC碼做成一個余項表,用查表的方法來代替余項的循環求取過程。
設一普通3字節碼為Tabc=[a b c],把它分解為一特殊的后2字節為零的3字節序列Ta00=[a 00],和一個2字節序列Tbc=[b c],可以由多項式表
其中Qa00為整數的商式,Ra00和Tbc都是最高次不超過15的余項,它們的和就是Tabc(x)的余項。每次取信息碼的3字節序列Tabc,先查表得出其中Ta00(x)的余項Ra00(x),這是一個2字節的多項式,把它和余下的2字節序列Tbc進行異或操作,得到新的3字節序列的高2字節,然后取信息碼的下一字節附于其后構成新的3字節序列再分解為Ta00和,循環查表計算。運用這種方法可以很快求出多字節信息碼Mk的CRC冗余校驗碼。
建立16位CRC的檢驗碼表共需要2×256個字節。對于80C51系列的單片機來說,程序存儲器ROM一般都有4KB以上的空間,容量上可以滿足要求。
下面給出CRC校驗碼表的求取程序:
每種校驗規則校驗碼的最高位都為1,為編程方便,將其最高位去掉,把校驗碼的位數湊成是一個字節的整數倍。CRC—CCITT的校驗式為G(x)=x16+x12+x5+1,去掉高位后,校驗碼為0001000000100001(1021H)。取一個用來比較的16位數CRC—BYTE=8000H,逐次比較信息碼的最高位是否為1,是則將1記錄在暫存單元CRC—Temp的最低位,如果是0,則低位左移入0,每次暫存單元和信息單元循環左移,相當于把信息字節的數據逐位從左移入暫存單元中。當暫存單元的最高位變為1,說明已移入了16位數據,然后把暫存單元再左移一次,和16位校驗碼做異或操作,也就相當于進行模2除。因為暫存單元被移出的最高位1和校驗碼被舍去的最高位1異或,其結果必然為零,也就等于進行了17位異或操作。把所得的余式存放在暫存單元中,接著循環,直到將信息碼和補充在尾部的零字節都操作結束,把最后的余式復給CRC—Variable輸出,完成對一個余項式的處理。
這種方法的好處是很容易實現對8位或者32位的校驗式求取余項表進行擴展,只需將CRC—MODEL改為8位或32位的校驗式模型,比較字節CRC— BYTE改為80H和800000H,追加末尾0字節LAST—BYTE改為1和4個,然后再把對應于16位數據變量CRC—Variable的 unsigned short型,改為un-signed char或unsigned long就可以了。
5 結束語
利用CRC實現程序可以計算出各種標準下的CRC校驗冗余碼表。在單片機容量允許的情況下,可以利用查表進行CRC校驗。在對時間要求不高、對存儲容量要求嚴格的場合,可以直接利用循環計算來求得余項。編程使用8051系列單片機匯編語言,可以實現最少和高效的指令代碼。該程序算法也可應用于 M68HC和PIC17等系列單片機上。
參考文獻
[1]Joe Campbell著.徐國定,廖衛東譯.串行通訊C程序員指南[M].北京:清華大學出版社.1990.
[2]韓炬.CRC算法實現[J].煤炭科學技術,2000,(2):11-15.
上一篇:單片機對modem需要進行哪些初始化操作?
下一篇:用VB實現16點陣漢字字形碼的源程序
推薦閱讀
史海拾趣
隨著全球市場的不斷擴大,Captive Fastener公司意識到國際合作的重要性。公司積極尋求與國際知名電子制造商的合作機會,通過提供高質量的緊固件產品和技術支持,成功打入國際市場。同時,公司還與國外同行開展技術交流與合作,不斷提升自身的技術水平和市場競爭力。
HSMC深知技術創新是企業發展的核心驅動力。公司不僅擁有豐富的14納米及7納米以下節點FinFET先進邏輯工藝與晶圓級先進封裝技術經驗,還持續投入研發,瞄準世界先進的制程工藝。通過與全球各大科研院所的合作,HSMC不斷儲備行業專利,增強自身的技術壁壘。這種對技術創新的執著追求,為公司的長遠發展奠定了堅實基礎。
ASSMANN WSW components公司的創立源于一個對電子行業充滿熱情的家族。起初,它只是一個小型家族企業,專注于為當地電子市場提供連接器和其他基礎電子元件。然而,憑借其出色的產品質量和專業的服務態度,ASSMANN WSW逐漸贏得了客戶的信任和好評。隨著時間的推移,公司的業務范圍逐漸擴大,不僅在國內市場取得了顯著成績,還開始進軍國際市場。
隨著智能手機和IoT市場的快速發展,AGM敏銳地捕捉到這一機遇。公司不失時機地推出了一款專用于智能手機和IoT的FPGA芯片,并通過了三星嚴格的供應商測試認證。這款芯片成為三星Galaxy手機里除Lattice之外的唯一備選FPGA器件,實現了國內FPGA公司出口零的突破,具有特殊的戰略意義。這一成功不僅展示了AGM在可編程邏輯技術領域的實力,也為公司進一步拓展智能手機和IoT市場打下了堅實基礎。
面對日益激烈的市場競爭和技術變革,Equator始終保持著持續創新的精神。公司不斷投入研發資源,探索新的技術方向和應用場景。例如,在人工智能和機器學習領域,Equator正在積極開展相關研究和實踐工作,探索將這些先進技術應用于視頻處理領域的可能性。通過持續創新和努力,Equator正致力于引領電子行業未來的發展方向。
為了確保產品質量和客戶滿意度,Amerace Electronic Components公司建立了嚴格的質量管理體系。公司引進了先進的生產設備和技術,并對生產過程進行嚴格的監控和管理。同時,Amerace還注重員工培訓和技能提升,確保員工具備高度的專業素養和責任意識。這些措施使得Amerace的產品質量得到了有效保障,贏得了客戶的信任和支持。
該怎么說呢?我們大家既然都愿意在壇子工作學習和生活,可是為什么那么多的人把垃圾發到壇子里呢?大家睜眼看看吧!看看那些垃圾的發布者,一個個名字耳熟能詳,真不好意思罵人。陌生人發垃圾我們可以詛咒他,封他的ID。可是這些熟人為什么就不能稍 ...… 查看全部問答∨ |
|
原來按"Download and Debug"后每次都自動重新"BUILD"工程,這個就忍了 ...… 查看全部問答∨ |
|
int main(void) { unsigned int i,j; /*!< At this stage the microcontroller clock setting is already configured to 168 MHz, this is done through SystemInit() function which is called from ...… 查看全部問答∨ |
|
1.MSP430開發環境建立 1.安裝IAR dor msp430 軟件,軟件帶USB仿真器的驅動。2.插入USB仿真器,驅動選擇安裝目錄的/drivers/TIUSBFET3.建立一個工程,選擇"option"選項,設置 a、選擇器件,在"General"項的"Target"標簽選擇 ...… 查看全部問答∨ |