辛曉寧,孫文強
(沈陽工業大學 研究生學院,遼寧 沈陽 110870)
SPI串行通信接口是一種常用的標準接口,由于其使用簡單方便且節省系統資源,很多芯片都支持該接口,應用相當廣泛[1]。但是現有文獻和設計多數僅實現了SPI接口的基本發送和接收功能,對SPI接口的時序控制沒有進行深入的研究。全功能SPI接口應具有四種不同的時鐘模式,以適應具有不同時序要求的從控制器。文中主要研究SPI接口的時鐘時序,并用具體電路實現具有4種不同極性和相位的時鐘,最后通過仿真驗證和FPGA驗證[2]。
SPI模塊中的典型結構是用于通信的主從2個控制器之間的連接,如圖1所示。由串行時鐘線(SPICLK)、主機輸入從機輸出線(SPISOMI)、主機輸出從機輸入線(SPISIMO)、SPI選通線(SPISTE)4條線組成[3]。當CPU通過譯碼向主控制器寫入要傳輸的數據時,主控制器通過串行時鐘線來啟動數據傳輸,將會在串行時鐘線的一個邊沿將數據移出移位寄存器,而在串行時鐘的另一個邊沿將數據鎖存在移位寄存器中。SPI選通線是SPI控制器的使能端,可以選擇多個從機,實現一主多從的結構,只要SPI選通信號將要選的從機處的選通信號變為低電平就能夠連接成功。

圖1 SPI主從連接Fig.1 Master-slave link
SPI控制器的原理框圖如圖2所示,其中主要包括:
1)SPI控制器的內部寄存器

圖2 SPI控制器原理框圖Fig.2 Functional block diagram of SPI module
SPI操作控制寄存器(SPICTL),SPI狀態寄存器(SPISTS),SPI波特率設計寄存器 (SPIBRR),SPI接收緩沖寄存器(SPIRXBUF),SPI發送緩沖寄存器 (SPITXBUF),SPI串行數據寄存器(SPIDAT),SPI中斷優先級控制寄存器(SPIPRI)。
2)SPI控制器內的功能模塊
時鐘分頻模塊 (Frequency Divider),內部時鐘產生電路(Clk_Occur), 狀 態 控 制 機 (State Control), 中 斷 控 制 (Int Control),測試模塊(Test),輸出控制模塊(Dateout Control)。
圖2給出了SPI控制器的基本原理框圖。SPI控制器可工作在主模式和從模式下,由于在主模式下需要提供相應的時鐘給從控制器,較從模式下工作更為復雜,所以將用工作在主模式下的SPI控制器描述內部工作原理。
在開始傳送數據前,需將SPI控制器進行配置,設定時鐘波特率(SPIBPR),時鐘相位和極性,需要傳送的字符位數(SPICCR)。基本配置結束后,向 SPITXBUF和SPIDAT 2個寄存器內寫入要傳送的數據時,將會起動一次發送和接收操作。如果有正在傳送的數據,向SPITXBUF內寫入數據,新的數據將在當前數據傳送結束后自動進行發送和接收操作。
寫入SPICRR寄存器里的Char0~Char3位將會配置SPI狀態控制模塊里的計數器。狀態控制是系統的核心部分,為了使系統結構化,設計了狀態機,如圖3所示,分為3種狀態,分別是空閑狀態、發送命令狀態(配置SPI各個寄存器)、數據狀態。其中數據狀態包括數據的傳送和讀取[4]。
作為全功能SPI接口,在設計時加入了測試模塊。使能相關地址譯碼,將使系統內部關鍵節點通過輸出控制模塊傳送到數據總線。

圖3 SPI控制器狀態機Fig.3 State machine of SPI module
SPI控制器為了和外部數據進行交換,根據外設工作要求,其輸出串行同步時鐘極性和時鐘相位可以進行匹配。但時鐘極性對傳輸協議沒有重大影響。如圖4所示,全功能SPI控制器包括4種不同的時鐘模式:
無延時的上升沿:SPI在SPICLK信號上升沿發送數據,在SPICLK信號下降沿接
收數據;
無延時的下降沿:SPI在SPICLK信號下降沿發送數據,在SPICLK信號上升沿接收數據;
有延時的上升沿:SPI在SPICLK信號上升沿之前的半個周期發送數據,在SPICLK信號下降沿接收數據;
有延時的下降沿:SPI在SPICLK信號下降沿之前的半個周期發送數據,在SPICLK信號上升沿接收數據

圖4 與發送和接收相對應的4種時鐘模式Fig.4 Four different clocking schemes when sending and receiving
對于SPI控制器內部時鐘的產生,在對系統時鐘進行分頻之后,還要對生成的時鐘進行一定處理,因為分頻后的時鐘其高電平時間是幾個系統時鐘周期的和,控制移位寄存器的時鐘采用的是系統時鐘,為了在SPICLK的一個時鐘周期內只移位一位數據,必須要求內部時鐘的高電平時間為一個系統時鐘的周期,才能保證在SPICLK的一個時鐘周期內,只有一位數據的接收和發送。
圖5為實現上述功能的具體電路,即SPI控制器時鐘產生的電路結構。在圖5中,分頻后的時鐘為DICLK,作為與門的一個輸入端進入模塊后對其進行處理。節點Y1和Y2的輸出方程為:

分頻時鐘DICLK通過節點Y1和Y2后,其高電平時間僅為一個系統時鐘周期,且Y1較Y2延遲半個周期。MUX1的選擇端S來自配置寄存器的Phase端,選擇有延遲的Y1還是無延遲的Y2通過。分頻后的時鐘將被用于兩個用途,一是產生SPICLK作為從控制器的輸入時鐘。二是作為主控制器的內部時鐘,被用于計數器的計數脈沖和用于控制串行移位寄存器SPIDAT。
當分頻時鐘用于產生SPICLK時,異或門XOR1的一個輸入端來自配置寄存器的Polarity端,用于控制時鐘極性。節點Y3作為D觸發器MTN1的輸出端,輸出方程為:

同時D觸發器MTN1的S0端的輸入方程為:

S0為0,D觸發器上升沿觸發。S0為1,D觸發器保持原狀態。通過MTN1后的分頻時鐘,其高電平時間和低電平時間相等或相差一個系統時鐘周期,這個時鐘即為主模式下產生的SPICLK,通過Phase和Polarity端的選擇將會有四種不同時鐘模式。
當分頻時鐘用于產生SPI控制器的內部時鐘時,MUX2的選擇端S來自配置寄存器的主/從模式選擇端,選擇內部時鐘還是外部時鐘通過。輸出端LANCLK用于SPI控制器的數據輸入/輸出鎖存時鐘。其方程為:

這里的DICLKn為通過MUX2后的分頻時鐘。由于時鐘極性對傳輸協議沒有影響,所以上式將使四種時鐘模式轉變成2種,即上升沿無延遲和下降沿有延遲,而后在用于控制數據的輸入/輸出鎖存。通過節點Y2的分頻時鐘經過控制邏輯傳送到輸出端CNTCLK和DATCLK,這兩個時鐘分別用于SPI控制器內部計數器的計數時鐘和移位寄存器的控制時鐘。
以上分析均是在SPI控制器工作在主模式的情況,當SPI控制器工作在從模式時,外部時鐘來自與門AND1的一個輸入,通過控制邏輯分別到達CNTCLK和DATCLK端。
在時鐘生成模塊里同時具有相應控制功能:Reset引腳,模塊的復位端,低有效。SPISTE引腳,SPI控制器的使能端,低有效。Susp_free和Susp_soft引腳,決定了當仿真器突然中斷時SPI模塊將采取何種動作,在時鐘生成模塊里,Susp_free和Susp_soft被置為00時,將關斷SPICLK,使正在傳送的數據立即停止。

圖5 SPI控制器時鐘產生電路Fig.5 Clk generating circuit of SPImodule
SPI控制器的仿真使用Mentor公司的ModelSim軟件,該軟件可在windows,Linux平臺上使用,支持VHDL或Verilog硬件描述語言(HDL)仿真。它支持所有器件的行為級仿真、VHDL或Verilog仿真激勵。為了測試設計的正確性,編寫了testbench模塊,包括產生時鐘信號,控制寄存器的配置,收發的數據,產生的中斷等[5]。
當SPI工作在主模式下,全功能SPI控制器根據從控制器的時序要求會提供具有4種不同極性和相位的時鐘。圖6為SPI控制器內部時鐘生產模塊的仿真驗證,輸入DICLK為分頻后時鐘,其對系統時鐘進行了14分頻。時鐘生產模塊對DICLK進行處理,產生LANCLK,CNTCLK,DATCLK和4種不同極性和相位的SPICLK。

圖6 SPI控制器內部時鐘產生模塊的仿真結果Fig.6 Simulation results of CLK generating circuit
通過配置寄存器選擇SPI工作在主模式,此時主SPI通過引腳SPICLK提供整個串行網絡的串行時鐘。SPI波特率寄存器決定發送和接收的傳輸速率。發送數據時,主控制器先發送SPICLK信號,然后向SPIDAT和SPITXBUF寄存器寫入數據C00F和8FF,寫入這兩個寄存器都可以啟動SPISIMO引腳上的數據發送(先發送最高有效位)。同時從控制器通過引腳SPISIMO將接收到的數據移入SPIDAT的最低位,當選定量的位發送完時,整個數據發送完畢,數據按照右對齊的格式存入SPIRXBUF中,以備系統讀取(一般為cpu),同時中斷標志位被置為1,當系統發出指令,讀取存在SPITXBUF的數據時,SPI中斷標志位被清零,仿真結果如圖7所示。

圖7 SPI控制器工作在主模式下仿真結果Fig.7 The simulation results of master mode
文中提出了一種全功能硬件SPI接口設計方法,實現了4種具有不同極性和相位的時鐘,它吸取了傳統軟硬件的優點,具有速度快、結構簡單的特點,并已通過功能仿真和FPGA驗證,結果證明本設計是可靠的,可直接用于FPGA中或者作為硬件電路嵌入具體芯片內[6]。
[1]潘新民,王燕芳.微型計算機控制技術[M].北京電子工業出版社,2003.
[2]楊承富,徐志軍.SPI總線接口的FPGA設計與實現[J].軍事通信技術,2004,25(2):72-76.YANG Cheng-fu,XU Zhi-jun.Design and implement SPI bus interface with FPGA[J].Journal of Military Communication Technology,2004,25(2)72-76.
[3]劉樂善,葉濟忠,葉永堅.微型計算機接口技術原理及應用[M].武漢,華中理工大學出版社,1999.
[4]俞莉瓊,付宇卓.有限狀態機的verilog設計與研究[J].微電子學與計算機,2004,21(11):146-148.YU LI-qiong,FU Yu-zhuo.Verilog design and research of finite state machine[J].Microelectr-onics&Computer,2004,21(11):146-148.
[5]張亮.數字電路設計與VerilogHDL[M].北京:人民郵電出版社,2000.
[6]郭兵,沈艷,林永宏,等.SOC技術原理與應用[M].北京清華大學出版社,2006.