四川九洲電器集團公司 王維維 馮 碩 昌 暢
一種SPI串口模塊的FPGA實現
四川九洲電器集團公司 王維維 馮 碩 昌 暢
主要介紹了一種在FPGA中實現SPI總線通信串口模塊的方法,并給出了設計方案、仿真結果以及硬件測試結果。本設計可以廣泛應用于常規處理控制器件(單片機、DSP等)同外部外設及其它處理器之間進行SPI數據通信的系統中,特別是需要快速構建數據通信系統的應用環境,在通信、消費電子及工業控制等諸多領域有廣闊的應用前景。
SPI接口;VHDL;FPGA
串行外設接口(SPI)是一個高速同步的串行輸入/輸出口。SPI通常用于處理器和外部外設以及其它處理器之間進行通信。很多新型器件如LCD模塊、FLASH、ADC、EEPROM存儲器以及時鐘芯片等都采用了SPI接口。但在實際開發應用中,若主控制器無SPI接口或需要與多個具有SPI接口的外設通信,就要使用主控制器的I/O口通過軟件來模擬,這在很大程度上限制了其應用給數據傳輸帶來不便。所以采用硬件來實現SPI接口擴充的方法最為可行。
當前,基于主從處理器結構的系統架構已經成為一種主流(如DSP+FPGA,MCU+FPGA等)。FPGA優點主要在于它有很強的靈活性,即其內部的具體邏輯功能可以根據需要配置,對電路的修改和維護很方便。傳統SPI接口的FPGA實現往往采用廠家提供的IP核實現,這種方法雖能基本滿足SPI通信要求,但設計不夠靈活,不利于功能擴展。基于此,提出一種新的基于FPGA的SPI串口模塊實現方法。
SPI串行接口運用4條線可與多種標準中心器件間接接口:串行時鐘線SPICLK,主機輸出/從機輸入數據線SPISIMO,主機輸入/從機輸出數據線SPISOMI和低電平有效的從機選通信號線SPI_CS。
SPICLK為主機時鐘線,是從機的一個輸入,為SPISOMI數據的發送和接收提供同步時鐘信號。時鐘的相位(CPHA)與極性(CPOL)可以用來控制數據的傳輸。CPOL=“0”表示SCLK的靜止狀態為低電平,CPOL=“1”則表示SCLK的靜止狀態為高電平。時鐘相位(CPHA)可以用來選擇兩種不同的數據傳輸模式。如果CPHA=“0”,數據在信號SPI_CS聲明后的第一個SCLK邊沿有效。而當CPHA=“1”時,數據在信號SPI_CS聲明后的第二個SCLK邊沿才有效。因此,主機與從機中SPI設備的時鐘相位和極性必須要一致才能進行通信。
SPI有兩種工作模式:主模式和從模式。工作在主模式下,不管是發送還是接收數據,SPICLK為整個串行通信網絡提供時鐘。串行數據發送時,首先發送的是最高有效位(MSB),時鐘信號的1次作用對應1位數據的發送(SPISIMO)和另1位數據的接收(SPISOMI)。工作在從模式下,不管是發送還是接收數據,一直必需在SPICLK信號作用下停止,并且SPI_CS信號必需有效。1個典型的SPI系統包括一個主MCU和1個或幾個從外圍器件。
SPI主模式的數據接收時序見圖1。
SPI主模式的數據發送時序見圖2。
本設計按一個默認數據通信速率(10Mbps)、時鐘模式(無相位延時的下降沿)、主/從工作方式(主SPI模式)進行SPI數據的收發。可通過外部處理控制器對本模塊進行各種通信參數的動態配置,以適應不同的通信速率、時鐘模式、工作方式、數據長度等情況。配置完畢后,即可開始SPI數據的收發過程。

圖1 SPI主模式數據接收時序

圖2 SPI主模式數據發送時序

圖3 SPI串口模塊系統框圖

圖5 SPI主模式數據發送流程

圖4 SPI主模式數據接收流程

圖6 仿真結果圖
本設計中增加了一根主/從SPI方的握手信號線SPI_STATUS,該信號線在從SPI方發送數據時被從方拉為低電平,而在從SPI方接收數據時被從方設置為高電平。
根據SPI總線的原理,本設計分為兩大功能模塊:數據接收及協議解析、數據發送處理。該SPI串口模塊系統框圖如圖3所示。
在這些子模塊中,數據接收FIFO和數據發送FIFO用來做接收、發送數據的FIFO。通信參數配置單元供處理控制器讀寫配置SPI的各種參數。對外并行接口單元負責與外部處理控制器進行數據交互。串行數據接收、命令解析及中斷產生單元完成串行數據接收、通信命令解析及產生中斷信號通知處理控制器進行數據接收操作。串行時鐘產生及收發控制單元用來發生主模式下的時鐘信號,同時對數據的接收或者發送進行功能切換。串行數據發送處理單元負責把并行進來的數據串行傳出,完成對數據發送的處理。
(1)數據接收及協議解析
當從SPI方發送數據的時刻到來時,本設計檢測到狀態線SPI_STATUS為“低”,則串行時鐘產生及收發控制單元立即啟動接收邏輯,對外輸出串行時鐘SPICLK信號和選通信號SPI_CS,同時在SPICLK上升沿時刻進行數據采樣,并將串行數據進行相應緩存。
每當采樣數據構成一個完整字節時,由接收模塊將收到的數據存入“數據接收FIFO”,同時對串口數據中的特殊字段進行協議解析。過程如下:先檢索收全數據同步頭字節“AAH AAH”后,對后面接收的完整字節進行+1計數處理,再檢索收到串口數據總長度字節后,判斷已收到的字節總數是否達到串口數據總長度值。如果達到接收數據總長度值,則表示一幀數據命令接收完整,此處由接收模塊置出“命令數據接收完整”標志;同時,當檢測到狀態線SPI_STATUS的上升沿到來,給出數據接收完畢中斷標志信號int_rxd及時中斷處理控制器,通知外部控制器讀取數據進行處理,而不必每接收到1個字節就中斷一次,避免了主程序被頻繁中斷。
目前,本設計的接收FIFO和發送FIFO深度均設定為2048字節,可以緩存大量的通信數據,而不會將先前收到的數據覆蓋,外部處理控制器可以在處理完其它緊要任務后,再來進行SPI數據的讀取和后續處理,而不必擔心已接收的SPI數據會丟掉。
接收數據的流程圖如圖4所示。
(2)數據發送處理
當需要發送SPI數據時,外部處理控制器將需要發送的所有數據依次寫入本設計的“數據發送FIFO”中,再對本設計另一個地址單元寫入“啟動發送命令”后,即可啟動數據發送模塊發送數據。該模塊實時判定數據發送FIFO是否為空,若FIFO內有數據則立即對外輸出串行時鐘SPICLK信號和選通信號SPI_CS,并在SPICLK的下降沿時刻對取出的數據進行發送,首先發送的是最高有效位(MSB)。即對主程序而言,就是向一特定地址寫入所有需要發送的數據,再寫入一個啟動發送命令即可自動完成全部數據的發送,無需進行發送流程控制。
發送數據的流程圖如圖5所示。
為了保證代碼的準確性,首先應根據模塊功能需求來編寫相應測試向量作為本SPI模塊的輸入激勵,然后經過查看模塊的輸出結果,判定本SPI模塊的各項功能是否正確。
采用了XILINX公司的EDA編譯軟件平臺ISE10.1,將用VHDL語言描述好的SPI接口模塊進行了綜合,然后用modelsim軟件進行仿真。在建立測試平臺時,首先建立模擬從SPI方數據發送的模塊,同時建立模擬主SPI方數據發送的模塊,再將接收/發送數據內容進行比較、驗證。在仿真軟件的輔助分析下,得到了正確的結果。仿真結果如圖6所示。
仿真通過后,將整個設計工程文件經綜合后的EDIF文件提交給ISE進行布局、布線后,把所生成的mcs文件下載到XILINX公司的FPGA芯片XC3S400中運行,結果與在modelsim中的仿真結果一致,該SPI總線接口模塊能達到所要求實現的性能,具有很強的實用性。
本設計以FPGA為硬件平臺,應用VHDL語言進行程序編制??蓪崿F對SPI通信數據的自動接收和發送,也可由外部程序對該SPI串口進行快速配置,從而完成串口通信速率、時鐘模式、工作方式、數據長度等的動態更改。
通過簡單的程序復用,該設計可擴充為多路SPI數據通信接口,一方面彌補了常規處理控制器件(單片機、DSP等)所自帶的SPI硬件串口操作繁瑣、功能受限的不足,另一方面也把單片機、DSP從頻繁的數據查詢或數據中斷中解放出來,從而投入更多精力到其它的功能控制中。
[1]侯伯亨,顧新,編著.VHDL硬件描述語言與數字邏輯電路設計[M].西安電子科技大學出版社,1999.
[2]孫豐軍,余春暄.SPI串行總線接口的Verilog實現[J].現代電子技術,2005.
王維維(1980—),男,陜西人,2002年畢業于武漢大學,主要從事電子信息方面工作。
馮碩(1984—),男,四川人,2007年畢業于電子科技大學,主要從事電子信息方面工作。
昌暢(1987—),男,重慶人,2009年畢業于四川大學,主要從事電子信息方面工作。