SPI接口與CRC算法在雙DSP數(shù)據(jù)通信中的應用
從機發(fā)送/主機接收的驅(qū)動設計
本文引用地址:http://www.ex-cimer.com/article/117273.htm(1) 從機發(fā)送數(shù)據(jù)的驅(qū)動設計。當從機的發(fā)送FIFO為空時,將觸發(fā)并進入發(fā)送中斷服務函數(shù), 在此函數(shù)中將待發(fā)送的16字數(shù)據(jù)寫入發(fā)送FIFO,然后向主機發(fā)出接收申請。
(2) 主機接收數(shù)據(jù)的驅(qū)動設計。在確知從機已將待發(fā)送的數(shù)據(jù)寫入發(fā)送FIFO之后,主機即向從機發(fā)送一幀無效數(shù)據(jù),目的是提供從機發(fā)送數(shù)據(jù)所需的同步時鐘。與此同時,主機可接收到自從機發(fā)出的16字數(shù)據(jù),并觸發(fā)接收中斷,在相應的中斷服務函數(shù)中將數(shù)據(jù)讀出即可。
通信協(xié)議的設計與實現(xiàn)
協(xié)議的內(nèi)容與實現(xiàn)
(1) 數(shù)據(jù)幀格式。主機與從機遵循相同的幀格式。每個數(shù)據(jù)幀長度為32字節(jié),其中前30字節(jié)為有效數(shù)據(jù),后兩字節(jié)為前30字節(jié)的CRC校驗碼。
(2) 主機的收/發(fā)機制。主機的收/發(fā)流程如圖4所示。在主機中啟動定時器中斷功能,在定時中斷服務函數(shù)中讀取MRE和SCRCE信號的狀態(tài)。其中SCRCE信號標識了從機對前一數(shù)據(jù)幀的校驗結(jié)果,為0表示校驗失敗,當主機讀取到此狀態(tài)時,就將前一數(shù)據(jù)幀重發(fā);MRE信號標識了從機的待發(fā)數(shù)據(jù)準備狀態(tài),為0表示從機已將待發(fā)送的一幀數(shù)據(jù)寫入發(fā)送FIFO,主機讀取到此狀態(tài)時,應立即啟動接收操作,當主機接收到一幀新的數(shù)據(jù)時,應立即對齊進行校驗,并根據(jù)校驗結(jié)果設置MCRCE信號的狀態(tài),作為從機是否重發(fā)的依據(jù)。
(3) 從機的收/發(fā)機制。從機的收/發(fā)流程如圖4所示。在從機中啟動定時器中斷功能,在定時中斷服務函數(shù)中讀取MCRCE信號的狀態(tài),此信號標識了主機對前一數(shù)據(jù)幀的校驗結(jié)果,為0表示校驗失敗,從機讀取到此狀態(tài)時應將前一數(shù)據(jù)幀重發(fā)。若不需重發(fā),則繼續(xù)發(fā)送新的數(shù)據(jù)幀。當從機將待發(fā)送的數(shù)據(jù)幀寫入發(fā)送FIFO后,立即將MRE信號置為0,請求主機接收;當從機接收到新的數(shù)據(jù)幀后,立即進行校驗,若校驗失敗,則將SCRCE信號置為0,請求主機將前一數(shù)據(jù)幀重發(fā)。
基于CRC算法的校驗機制
SPI協(xié)議將數(shù)據(jù)幀全部視作有效數(shù)據(jù),使用同步時鐘協(xié)調(diào)雙方的發(fā)送/接收,實現(xiàn)數(shù)據(jù)的正確傳輸。為進一步提高通信雙方的差錯檢測能力,帶來更高的可靠性保障,在接收方引入了數(shù)據(jù)校驗機制??紤]到CRC (Cyclic Redundancy Check) 算法誤碼檢測能力強且易于實現(xiàn)[5],本系統(tǒng)使用CRC算法實現(xiàn)接收方的數(shù)據(jù)幀校驗。
CRC校驗的原理可概括如下:被校驗的n位數(shù)據(jù)塊可看作是n階二進制多項式m(x)=an-1xn-1 + an-2xn-2 + ? + a1x + a0,發(fā)送方和接收方約定一個r階的生成多項式g(x),發(fā)送方以xrm(x)為被除數(shù),以g(x)為除數(shù),做除法運算,得到余數(shù)多項式y(tǒng)(x)即為m(x)的校驗碼,將該校驗碼附在n位數(shù)據(jù)塊之后一并發(fā)送至接收方。接收方以接收到的數(shù)據(jù)多項式為被除數(shù),以g(x)為除數(shù),做除法運算,若余數(shù)為0,證明校驗成功,否則校驗失敗。
為提高計算效率,本系統(tǒng)采用一種基于查表機制的并行處理方法。
首先選擇生成多項式g(x),考慮到CRC-16國際標準工程實用價值較高,此處也采用該標準,此時g(x)=x16 + x15 + x2 + 1。將所有單字節(jié)數(shù)據(jù)的CRC-16校驗碼提前計算出來,存于表中待查。
將待校驗的數(shù)據(jù)塊(長度為30字節(jié))看作是多字節(jié)序列,取第一個字節(jié)B30并查表得其兩字節(jié)余式,將此余式的高字節(jié)與B29做模2加運算,低字節(jié)與B28做模2加運算,分別得結(jié)果B*29和B*28,并得到新的多字節(jié)序列< B*29 B*28?B3B2B1>,再取B*29重復進行上述操作,得新的多字節(jié)序列< B**28B*27?B3B2B1>,如此往復,直到最后多字節(jié)序列變?yōu)?lt; B*2B1>,將此序列左移16位得< B*2B100>,取B*2并查表得其兩字節(jié)余式,將此余式的高字節(jié)與B1做模2加運算,低字節(jié)與0做模2加運算,分別得結(jié)果B*1和C*2,得新的序列< B*1C*20>,再重復此操作,可得雙字節(jié)序列< C**2C1>,此即序列的CRC-16校驗碼。
將此校驗碼附于之后,一并發(fā)送至接收方;接收方對全部32字節(jié)的數(shù)據(jù)序列進行上述CRC-16編碼運算,若余式為0則認為校驗成功,否則證明傳輸過程中有丟碼或誤碼。
通信相關文章:通信原理
評論