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