強小燕,史興強,劉夢影
(中科芯集成電路股份有限公司,江蘇無錫 214072)
為適應復雜的通信環(huán)境和高速的通信速率要求,能夠快速可靠地完成大量數(shù)據(jù)交換的數(shù)據(jù)總線是極其重要的,因此設計一個高效可靠的通信接口就十分重要。
SPI接口技術(shù)是一種高速高效的串行接口技術(shù)[1],其接口連線簡單、配置靈活、傳輸效率高[2],廣泛應用于擴展外設和進行數(shù)據(jù)交換[3]。隨機噪聲和干擾等因素存在于串行通信傳輸中,可能導致數(shù)據(jù)傳輸錯誤。通過采用硬件措施進而加強通信傳輸?shù)目煽啃钥蓹z測這類錯誤,或在設計中增加校驗功能,通過該方法檢測數(shù)據(jù)在傳輸過程中是否發(fā)生錯誤[4]。CRC是由分組線性碼的分支而來[5],該算法簡單易實現(xiàn),能夠同時檢測和抗干擾,是一種高效可靠的差錯校驗法[6]。該方法導致數(shù)據(jù)的冗余量增加,發(fā)送端不僅發(fā)送數(shù)據(jù),最后還需將CRC碼發(fā)送給接收端。接收端也對接收的數(shù)據(jù)進行CRC計算,如果計算的校驗碼與接收到的校驗碼相同,則數(shù)據(jù)傳輸正確,反之亦然。
SPI因其高速高效的優(yōu)勢得到眾多關(guān)注和研究,CRC編碼簡單易實現(xiàn),進而頻繁應用以提高數(shù)據(jù)通信的有效性。史星晟、王黎明[7]等設計的SPI總線僅實現(xiàn)了高速無線通信,保證通訊系統(tǒng)的穩(wěn)定性和高效性;汪永琳、丁一[8]為減少SPI接口連線,設計了一種僅支持半雙工的SPI接口以完成數(shù)據(jù)交互。廖堅、于海勛[9]為滿足USB協(xié)議高達48 Mbps的傳輸速率,討論CRC校驗的并行算法并運用Verilog HDL實現(xiàn)該算法。滕立偉、李小花[10]推導出一種并行CRC算法,并更進一步地于USB3.0中實現(xiàn)該算法,提高USB數(shù)據(jù)傳輸速率和可靠性。王鵬[11]在CAN總線設計中加入CRC校驗,對通信過程進行差錯控制。陳基昕、王忠等[12]針對傳統(tǒng)CRC校驗方法存在的漏檢問題,改進了傳統(tǒng)的方法以提高校驗檢錯率。
本文為了實現(xiàn)高速可靠的通信接口,設計了一種具有CRC校驗功能的SPI接口。首先介紹了CRC串行算法的原理及公式推導;其次,簡要闡述了SPI的主要功能和工作模式;接著詳細描述了具有CRC校驗功能的SPI接口的設計框架、流程及其功能;最后,采用Verilog HDL語言進行RTL設計SPI接口,通過仿真驗證了該設計數(shù)據(jù)傳輸?shù)母咝院涂煽啃浴?/p>
CRC碼是一種截短循環(huán)碼,運用的主要原理為線性編碼理論。如果發(fā)送端待發(fā)送k位二進制信息碼序列,并依照一定規(guī)則生成一個n-k位的信息碼,該信息碼用于校驗的監(jiān)督碼,通常稱為CRC碼,且附于信息碼后,構(gòu)成一個n位的新二進制碼序列。隨后接收端根據(jù)信息碼和監(jiān)督碼之間所遵循的規(guī)則進行檢驗,從而判定數(shù)據(jù)通信過程中是否出錯。
CRC的根本依據(jù)是模-2除法求余數(shù)。假定待發(fā)送的k位二進制信息碼為M,將信息碼的比特序列作為多項式M(x)的系數(shù),則:
然后根據(jù)CRC碼的長度,對于發(fā)送端和接收端規(guī)定一個(n-k)階生成多項式G(x):
隨后,將信息碼左移(n-k)位,得到相應多項式xn-kM(x),以此作被除數(shù),G(x)作除數(shù),做模-2多項式除法操作,可得:
式(3)中G(x)表示商多項式,r(x)則為余數(shù)多項式。假定r(x)表示為:
將式(1)和式(4)帶入式(3)推導得出:
如果將發(fā)送碼多項式定義為C(x)=Q(x)G(x),那么則有:C=(mk-1,mk-2,…,m1,m0,rn-k-1,rn-k-2,…,r0),其中 C 為發(fā)送序列碼,(rn-k-1,rn-k-2,…,r0)為CRC碼。
如果接收端接收信息完全正確,即不存在誤碼,即說明接收碼多項式R(x)能夠被生成多項式G(x)模-2整除。反之亦然。
如果每一位分別進行除法或減法運算,其結(jié)果均不會相互影響,那么模-2多項式除法在邏輯上與異或運算等效。由于CRC編碼采用模-2多項式除法,因此由一組移位寄存器以及邏輯門能夠完成CRC串行算法,圖1為該算法的結(jié)構(gòu)圖。
圖1 CRC串行實現(xiàn)的典型電路結(jié)構(gòu)
圖1中rj(i)表示在i時刻第j個觸發(fā)器的狀態(tài),根據(jù)圖1的電路結(jié)構(gòu)推導可得CRC碼的關(guān)系式為:
其中,“·”為位于運算,“⊕”代表異或運算。M表示k位信息碼序列,從圖1可知,它按照高位至低位順序串行輸入,信息碼完全輸入后,寄存器最終輸出所求CRC校驗碼,由此可知,k位信息碼的CRC碼經(jīng)歷k個時鐘周期即可算出。該串行算法編碼原理簡單,設計代碼易實現(xiàn),可靈活修改,并具有良好的可移植性。
SPI總線系統(tǒng)是一種同步串行外設接口,其允許MCU和外部設備同步串行通信,支持多種工作模式,從而進行接收與發(fā)送數(shù)據(jù)的操作,通過移位寄存器完成數(shù)據(jù)串并轉(zhuǎn)換。通常,SPI通過4個引腳與外部設備連接。MISO為主設備輸入引腳或從設備輸出引腳;MOSI為主設備輸出或從設備輸入引腳;SCK作為主設備的串行時鐘輸出引腳或從設備串行時鐘輸入引腳;NSS則為從設備的片選引腳。
SPI模塊與外部設備進行通信時,根據(jù)工作要求可配置SPI工作為主設備或從設備;設定SPI通信模式為全雙工模式、半雙工僅發(fā)送/僅接收或簡單通信/僅接收。主設備可控制數(shù)據(jù)傳輸頻率。在不同的通信模式下,SPI引腳連接方式不盡相同。當SPI配置為全雙工模式時,引腳連接方式如圖2所示;如果SPI配置為半雙工模式,則引腳如圖3連接;當SPI配置為簡單通信模式,則主發(fā)從收模式和主收從發(fā)模式分別如圖4和圖5所示。
圖2 全雙工模式下主從設備連接方式
為確保數(shù)據(jù)能夠更有效可靠地傳輸,本文設計的SPI接口具有2個獨立的CRC計算單元,分別為TXCRC和RXCRC計算模塊,用以檢查發(fā)送和接收數(shù)據(jù)的正確可靠性。通過配置寄存器CRCPR規(guī)定CRC生成多項式,它可固定設置為8位或16位。
圖3 半雙工模式下主從設備連接方式
圖4 簡單通信(主發(fā)從收)模式下主從設備連接方式
圖5 簡單通信(主收從發(fā))模式下主從設備連接方式
該SPI架構(gòu)如圖6所示,端口信號包括APB總線的控制信號和讀寫數(shù)據(jù)信號,SPI中斷請求信號,以及SCK、NSS、MOSI和MISO的輸入信號、輸出信號和輸出使能信號;主要由APB接口模塊、控制模塊、TXCRC和RXCRC計算模塊組成。定義的SPI寄存器簡要描述如表1所述。
圖6 設計架構(gòu)
表1 SPI寄存器描述
CRC校驗功能的使用可通過配置SPI_CR1寄存器中的CRCEN=1,從而使能CRC計算。當發(fā)送數(shù)據(jù)全部傳輸完成,緊接著發(fā)送CRC碼。在CRC數(shù)據(jù)傳輸期間,CRC計算停止。如圖7所示,當?shù)谝粋€數(shù)據(jù)開始傳輸,crc_onging立即置為1,CRC計算當即開始;當傳輸完最后一個數(shù)據(jù)TData n,crc_onging置為0,即表示CRC計算停止;crc_phase=1則為CRC數(shù)據(jù)傳輸期間。
圖7 CRC計算示意圖
圖8為TXCRC/RXCRC計算模塊。從圖8中可清晰地看出,該模塊的輸入信號為時鐘信號crc_clk,復位信號crc_rstn,數(shù)據(jù)信號data_in和crcpr,以及控制信號crc_ongoing和cr1_dff。其中,cr1_dff表示數(shù)據(jù)位寬,cr1_dff=0,數(shù)據(jù)位寬為 8 bit;cr1_dff=1,數(shù)據(jù)位寬為16 bit。data_out為輸出信號。計算處理從crc_clk的上升沿開始執(zhí)行,當cr1_dff=0,則data_out[7:0]為有效數(shù)據(jù);cr1_dff=1,data_out[15:0]為有效數(shù)據(jù)。運用CRC串行算法,在crc_ongoing=1的時間段內(nèi),每個crc_clk上升沿時刻,data_out的有效數(shù)據(jù)位進行一次計算,計算公式如圖8中間所示。在crc_onging=1時,data_out[15:0]即時輸出當前計算的crc碼數(shù)值,當crc_onging=0,crc計算模塊停止計算,data_out[15:0]中的數(shù)據(jù)被鎖存。
圖8 TXCRC/RXCRC計算模塊
具有CRC校驗功能的SPI接口通信必須遵循一定的配置流程,通信過程的流程圖見圖9。首先配置SPI的工作模式并使能CRC功能,即置CRCEN=1,在最后一個數(shù)據(jù)傳輸結(jié)束之前必須將SPI_CR1寄存器中的CRCNEXT置為1,以通知發(fā)送端發(fā)送的下一個數(shù)據(jù)來自寄存器SPI_TXCRC,接收端接收的下一個數(shù)據(jù)為CRC校驗碼。在CRC碼傳輸結(jié)束的同時接收端自動檢驗CRC,如果接收到的CRC碼與寄存器SPI_RXCRC中的數(shù)值不一致,發(fā)生CRC錯誤,CRCERR置為1。
圖9 通信流程圖
本文運用硬件語言Verilog HDL實現(xiàn)該設計代碼,并通過Model Sim軟件進行功能仿真并通過觀察波形驗證其時序和功能。為實現(xiàn)設備通信,例化一個SPI與外設進行通信。針對SPI的CRC校驗功能,在全雙工和半雙工模式下分別進行仿真。在仿真中,選擇8位CRC生成多項式X8+X2+x1+1,即SPI_CRCPR配置為0x7,或16位CRC生成多項式X16+X12+x5+1,SPI_CRCPR配置為0x1021。
圖10為CRC校驗功能在主機全雙工模式下的仿真波形。本文設計的SPI工作于主機全雙工模式。數(shù)據(jù)幀位寬固定為8位,總線傳輸完指定數(shù)據(jù)之后,CRC碼計算停止,TXCRC和RXCRC中數(shù)據(jù)凍結(jié),緊接著主機發(fā)送寄存器TXCRC中的數(shù)據(jù)d4,從機發(fā)送ff。從圖10中可以清楚地發(fā)現(xiàn),主機發(fā)送的CRC碼與從機的RXCRC中的數(shù)據(jù)一致,從機發(fā)送的CRC碼則與主機的RXCRC中的數(shù)據(jù)相匹配,進而證明主從設備交換數(shù)據(jù)完全正確。圖10中共3組信號,第1組“RTL_SPI”,為設計的SPI相關(guān)重要信號,包括pclk,spi_tdr,…,spi_sr_crcerr;第 2 組信號分類名為“PAD”,該組信號為SPI的4個引腳的值,包括SPI_NSS,SPI_SCK,SPI_MOSI,SPI_MISO; 第 3 組 信 號 為“peripheral”,該組信號為通信外設的相關(guān)信號,包括SPI_RDR,SPI_TDR,…,SPI_SR_CRCERR。
圖10 主機全雙工模式仿真波形
圖11的仿真波形則驗證了當接收端接收到的CRC碼與寄存器RXCRC中的數(shù)值不一致時,接收端發(fā)生CRC錯誤,CRCERR=1。本文設計的SPI工作于主機全雙工模式。數(shù)據(jù)幀位寬固定為16位,主機接收的數(shù)據(jù)與從機發(fā)送的數(shù)據(jù)不相等,進而主機的RXCRC寄存器中計算得到的CRC碼081a與接收到的CRC碼5c62不匹配,主機發(fā)生CRC錯誤。
圖11 發(fā)送CRC錯誤的主機全雙工模式仿真波形
圖12驗證了CRC校驗功能在從機半雙工接收模式下的有效性。本文設計的SPI工作于從機半雙工接收模式。數(shù)據(jù)幀位寬固定為16位,從機在接收數(shù)據(jù)的同時,RXCRC計算模塊進行CRC碼計算。當接收完最后一個數(shù)據(jù)時,RXCRC計算模塊停止計算并保存CRC計算結(jié)果。從仿真波形可以看出,接收到的CRC碼與寄存器RXCRC中保存一致,說明從機正確地接收到了主機發(fā)送的數(shù)據(jù)。
圖12 從機半雙工接收模式仿真波形
本文運用Verilog HDL設計并實現(xiàn)了CRC校驗在SPI接口的設計,通過SPI總線實現(xiàn)有效可靠的通信系統(tǒng)。本文設計的SPI接口具有CRC校驗功能,通過設計2個獨立的TXCRC和RXCRC計算模塊,能夠在發(fā)送或接收數(shù)據(jù)的同時分別對收發(fā)數(shù)據(jù)進行CRC碼的串行計算,并允許接收端在數(shù)據(jù)傳輸結(jié)束前自動比較CRC碼以證明數(shù)據(jù)傳輸?shù)恼_性,從而確保通信的可靠性和有效性;最后通過仿真驗證了該設計的快速性和可靠性。