韋小剛
(1. 國網電力科學研究院 南京 210003;2. 南瑞集團公司)
一種改進型SPI高可靠通信機制設計*
韋小剛1,2
(1. 國網電力科學研究院 南京 210003;2. 南瑞集團公司)
SPI通信作為一種全雙工高速通信方式,電路實現簡單、占用資源少,在工業嵌入式系統中應用十分廣泛。但是,通信過程中沒有握手、應答和數據校驗,影響了系統通信的可靠性。本文通過對嵌入式系統中的SPI通信機制的研究與分析,設計了一種高可靠性的SPI通信機制。這種SPI通信機制的高可靠性通過系統長期的現場應用得到了驗證。
SPI接口;可靠性;改進;外設
串行外圍設備(SPI)接口是由Motorola公司開發的,用來在微控制器MCU和外圍設備芯片之間以串行方式實現數據交換的,低成本、易使用的接口。其中,外圍設備包括顯示驅動器、網絡控制器、A/D轉換器、內存及微控制器MCU(如DSP、ARM、加密芯片等)等。與標準的串行接口不同,SPI是一個同步協議接口,全雙工通信,所有的傳輸都參照一個共同的時鐘,這個同步時鐘信號由主端(Master)產生。接收數據的外設使用時鐘對串行比特流的接收進行同步化[1-2]。
SPI通信采用主從方式進行,一般情況下,通過4根線完成通信,分別為兩根數據線(主輸出從輸入MOSI和主輸入從輸出MISO)、一根時鐘線(SCK)和一根片選線(CS)。其中,時鐘信號SCK由主端發出,片選信號用于由主設備控制外設芯片使能。
SPI通信示意圖如圖1所示。微控制器MCU采用SPI通信時,片選信號CS(一般情況下為低電平)使能外圍設備。主端提供時鐘脈沖SCK,數據以串行方式傳輸,主端數據輸出通過MOSI,而數據輸入通過MISO,從端數據輸出通過MISO,而數據輸入通過MOSI,傳輸一位數據需要一個時鐘信號SCK,這樣傳輸一個字節數據至少需要8個時鐘信號SCK。

圖1 SPI通信示意圖
由以上SPI通信過程的描述可知,時鐘信號SCK完全由主端設備控制。標準的串行通信一次連續傳輸至少8位數據,而SPI通信因為時鐘信號SCK完全由主端設備控制,所以通信過程中數據是可以一位一位傳輸的,若沒有主端設備的時鐘跳變SCK,通信就會暫停,這樣主端設備就可以通過控制時鐘信號SCK進而控制整個數據的通信,這是SPI通信的一個優點[3]。SPI通信還有個優點,即數據輸出和數據輸入彼此獨立,采用不同的信號線,可以同時完成數據的輸入與輸出,實現全雙工高速通信。此外,相對于ISO7816通信和I2C總線通信等其他接口通信方式,SPI通信實現起來較為簡單,就是主端和從端的8位SPI寄存器進行數據的傳輸。
由于SPI通信有著諸多的優點,所以工業嵌入式系統開發中用到的很多芯片都支持SPI接口。但是,SPI通信的缺點也很明顯,通信過程中沒有握手,沒有應答,沒有數據校驗。SPI主端設備向從端設備發出數據后,從端設備有沒有收到數據?SPI從端設備收到的數據是否與SPI主端設備發出的數據完全一致?如果不一致,SPI主端設備是否應該向從端重傳數據?這些都是不得而知的。
通信可靠性對于工業嵌入式系統來說至關重要,直接決定工業嵌入式系統是否有應用價值,一個可靠性欠缺的工業嵌入式系統可能會給企業、社會乃至國家帶來莫大的損失。由此可知,SPI通信機制完全有必要改進。
SPI通信過程有必要加入握手、應答和數據校驗等環節,以保證SPI主端和從端通信的可靠性。一般來說,對任何機制的改進都不會是憑空想象,都是建立在原型的基礎之上。在SPI通信機制改進時,筆者參考了TCP連接的三次握手機制[4]和ISO7816協議的應答機制[5-6]。
2.1 通信流程
改進型SPI通信的流程如圖2所示,SPI通信由主端控制,主端通過片選引腳使能從端并向從端發出時鐘脈沖,從端以應答的方式與主端進行交互,過程如下:
① SPI主端向從端發出命令頭,該命令頭有5個字節;
② SPI從端向主端發出應答數據,該數據為之前收到的命令頭的第二個字節(標志字節);
③ SPI主端向從端發出數據幀,該數據幀由幀頭、實際數據、校驗值及幀尾表示;
④ SPI從端向主端發出應答數據,該數據為標志字節、數據長度、實際數據、校驗值及狀態字(兩個字節)組成。

圖2 SPI通信流程(無數據重傳環節)
以上過程中,步驟①和②可以看作是SPI通信主端對從端就緒狀態的探測,步驟③和④才是真正的數據交互。步驟①、②中,當SPI從端未就緒時,SPI主端無法收到從端的應答,那么SPI主端就需要進行超時重傳,重新傳送之前的命令頭,重傳次數達到上限后就不再重傳,否則會浪費系統資源。步驟③、④中,SPI主端會對從端發過來應答數據中的實際數據進行校驗并得出一個校驗值,將該校驗值與從端發過來的應答數據中的校驗值進行比對,如果不一致,那么主端有必要進行重傳,如圖3所示。

圖3 SPI通信流程(有數據重傳環節)
2.2 通信數據格式
SPI通信過程中,主端發給從端的數據分為兩類,即命令頭和數據幀:
① 命令頭。由ISO7816協議中的APDU(Application Protocol Data Unit)命令格式組成,即CLA、INS、P1、P2、Len[5-6]。
② 數據幀。一個完整的數據幀由幀頭、實際數據、校驗值及幀尾組成,如表1所列。

表1 SPI通信數據幀的組成
SPI通信過程中,從端給主端發出的應答有兩種:一種是主端探測從端時從端響應給主端的標志,另一種就是實際通信中的應答,這個完整的應答報文由標志字節、數據長度、實際數據、校驗值及狀態字組成,如表2所列。

表2 SPI通信應答報文的組成
按照上述的流程,SPI通信過程中主端的代碼如下所示,讀者可以依此寫出SPI從端的代碼。
int SpiMaster(unsigned char *rxbuf, unsigned char *in, int len, unsigned char *out){
int i = 0, cnt = 0;
unsigned char cmd[5] = {0xA0, 0xE0, 0x80, 0x00, len};
CMD_RESEND1:
SendCmdHeader(cmd, rxbuf); //發送命令頭
RcvINS(rxbuf,cmd[1]); //接收標志字節
if(errorTimeout){ //超時全局變量
//超時重傳,超過3次則結束
errorTimeout = 0;
if(cnt<3){
cnt++;
goto CMD_RESEND1;
}
else{
printf("Timeout ERROR! ");
return -1;
}
}
cnt = 0;
CMD_RESEND2:
SendData(cmd, rxbuf+1, in, len);//發送實際數據及校驗碼
RcvINS(cmd,rxbuf,cmd[1]); //接收標志字節
RcvLenL(cmd,rxbuf+1, cmd[3]*0x0100+cmd[4]+1);
//接收長度
RcvData(cmd, rxbuf+3); //接收實際數據及校驗碼
RcvSW(cmd, rxbuf+3+len+1, 0x90); //接收狀態字
//計算接收到數據的CRC校驗值
if(get_crc7(rxbuf+3, rxbuf[1]*0x100+rxbuf[2]-1)
!= rxbuf[rxbuf[1]*0x100+rxbuf[2]+1+1]){
//CRC校驗值比對,不一致,則命令重傳,超過3次,結束
if(cnt<3){
cnt++;
goto CMD_RESEND2;
}
else{
printf("CRC check ERROR! ");
return -1;
}
}
for(i=0; i< len; i++){
out[i]=rxbuf[i+3];
}
return 0;
}

[1] Motorola.SPI Block Guide V03.06. Original Release Date: 21 JAN 2000Revised: 04 FEB,2003.
[2] 馬鳴錦,蔣烈輝,杜威,等. 基于M-CORE微控制器的嵌入式系統[M]. 北京:國防工業出版社,2003.
[3] 喬贊麗. 高可靠性SPI通信機制及其應用探討[J].信息通信,2013(8):202-203.
[4] TCP/IP協議原理與應用 [M].3版. 張長富, 等譯. 北京: 清華大學出版社, 2009.
[5] ISO/IEC 7816-3 —2006 Smart Card Standard, Part3 Electronic Signals and Transmission Protocols[S].
[6] ISO/IEC 7816-4—2005 Smart Card Standard, Part4 Interindustry Commands for Interchange[S].
韋小剛(碩士),主要研究方向為電力系統信息網絡安全。
Design of Improved High-reliability Communication Mechanism with SPI
Wei Xiaogang1,2
(1.State Grid Electric Power Research Institute, Nanjing 210003, China;2.Mary Group Corporation)
a full-duplex high-speed communication mode,SPI has simple circuit and low resource consumption,and it is widely used in embedded systems of industry. However, there are no handshake, response and data checking in communication so that the reliability of system communication is reduced. By the research and analysis of SPI communication mechanism in embedded systems, a high-reliability SPI communication mechanism is designed, which is validated in long-term practical applications.
SPI interface;reliability;improvement;peripheral equipment
* 項目來源:國網電力科學研究院智能電網終端安全防護項目。
TP393.8
A
2014-02-12)