SPI及其FPGA實現
SPI是英文Serial Peripheral Interface的縮寫,中文意思是序列外圍裝置介面,SPI是Motorola公司推出的一種同步序列通訊方式,是一種三線同步匯流排,因其硬體功能很強,與SPI有關的軟體就相當簡單,使CPU有更多的時間處理其他事務。
SPI概述
SPI:高速同步序列口。3~4線介面,收發獨立、可同步進行.
SPI,是英語Serial Peripheral interface的縮寫,顧名思義就是序列外圍裝置介面。是Motorola首先在其MC68HCXX系列處理器上定義的。SPI介面主要應用在 EEPROM,FLASH,實時時鐘,AD轉換器,還有數字訊號處理器和數字訊號解碼器之間。SPI,是一種高速的,全雙工,同步的通訊匯流排,並且在晶片的管腳上只佔用四根線,節約了晶片的管腳,同時為PCB的佈局上節省空間,提供方便,正是出於這種簡單易用的特性,現在越來越多的晶片集成了這種通訊協議,比如AT91RM9200.
SPI匯流排系統是一種同步序列外設介面,它可以使MCU與各種外圍裝置以序列方式進行通訊以交換資訊。外圍設定FLASHRAM、網路控制器、LCD顯示驅動器、A/D轉換器和MCU等。SPI匯流排系統可直接與各個廠家生產的多種標準外圍器件直接介面,該介面一般使用4條線:序列時鐘線(SCK)、主機輸入/從機輸出資料線MISO、主機輸出/從機輸入資料線MOSI和低電平有效的從機選擇線SS(有的SPI介面晶片帶有中斷訊號線INT或INT、有的SPI介面晶片沒有主機輸出/從機輸入資料線MOSI)。
SPI的通訊原理很簡單,它以主從方式工作,這種模式通常有一個主裝置和一個或多個從裝置,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基於SPI的裝置共有的,它們是SDI(資料輸入),SDO(資料輸出),SCK(時鐘),CS(片選)。
(1)SDO – 主裝置資料輸出,從裝置資料輸入
(2)SDI – 主裝置資料輸入,從裝置資料輸出
(3)SCLK – 時鐘訊號,由主裝置產生
(4)CS – 從裝置使能訊號,由主裝置控制
其中CS是控制晶片是否被選中的,也就是說只有片選訊號為預先規定的使能訊號時(高電位或低電位),對此晶片的操作才有效。這就允許在同一總線上連線多個SPI裝置成為可能。
接下來就負責通訊的3根線了。通訊是通過資料交換完成的,這裡先要知道SPI是序列通訊協議,也就是說資料是一位一位的傳輸的。這就是SCK時鐘線存在的原因,由SCK提供時鐘脈衝,SDI,SDO則基於此脈衝完成資料傳輸。資料輸出通過 SDO線,資料在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被讀取。完成一位資料傳輸,輸入也使用同樣原理。這樣,在至少8次時鐘訊號的改變(上沿和下沿為一次),就可以完成8位資料的傳輸。
要注意的是,SCK訊號線只由主裝置控制,從裝置不能控制訊號線。同樣,在一個基於SPI的裝置中,至少有一個主控裝置。這樣傳輸的特點:這樣的傳輸方式有一個優點,與普通的序列通訊不同,普通的序列通訊一次連續傳送至少8位資料,而SPI允許資料一位一位的傳送,甚至允許暫停,因為SCK時鐘線由主控裝置控制,當沒有時鐘跳變時,從裝置不採集或傳送資料。也就是說,主裝置通過對SCK時鐘線的控制可以完成對通訊的控制。SPI還是一個數據交換協議:因為SPI的資料輸入和輸出線獨立,所以允許同時完成資料的輸入和輸出。不同的SPI裝置的實現方式不盡相同,主要是資料改變和採集的時間不同,在時鐘訊號上沿或下沿採集有不同定義,具體請參考相關器件的文件。
在點對點的通訊中,SPI介面不需要進行定址操作,且為全雙工通訊,顯得簡單高效。在多個從裝置的系統中,每個從裝置需要獨立的使能訊號,硬體上比I2C系統要稍微複雜一些。
最後,SPI介面的一個缺點:沒有指定的流控制,沒有應答機制確認是否接收到資料。
AT91RM9200的SPI介面主要由4個引腳構成:SPICLK、MOSI、MISO及 /SS,其中SPICLK是整個SPI匯流排的公用時鐘,MOSI、MISO作為主機,從機的輸入輸出的標誌,MOSI是主機的輸出,從機的輸入,MISO 是主機的輸入,從機的輸出。/SS是從機的標誌管腳,在互相通訊的兩個SPI匯流排的器件,/SS管腳的電平低的是從機,相反/SS管腳的電平高的是主機。在一個SPI通訊系統中,必須有主機。SPI匯流排可以配置成單主單從,單主多從,互為主從。
SPI的片選可以擴充選擇16個外設,這時PCS輸出=NPCS,說NPCS0~3接4-16譯碼器,這個譯碼器是需要外接4-16譯碼器,譯碼器的輸入為NPCS0~3,輸出用於16個外設的選擇。
同步外設介面(SPI)是由摩托羅拉公司開發的全雙工同步序列匯流排,該匯流排大量用在與EEPROM、ADC、FRAM和顯示驅動器之類的慢速外設器件通訊。
SPI(Serial Peripheral Interface)是一種串行同步通訊協議,由一個主裝置和一個或多個從裝置組成,主裝置啟動一個與從裝置的同步通訊,從而完成資料的交換。SPI 介面由SDI(序列資料輸入),SDO(序列資料輸出),SCK(序列移位時鐘),CS(從使能訊號)四種訊號構成,CS 決定了唯一的與主裝置通訊的從裝置,如沒有CS 訊號,則只能存在一個從裝置,主裝置通過產生移位時鐘來發起通訊。通訊時,資料由SDO 輸出,SDI 輸入,資料在時鐘的上升或下降沿由SDO 輸出,在緊接著的下降或上升沿由SDI 讀入,這樣經過8/16 次時鐘的改變,完成8/16 位資料的傳輸。
SPI通訊
該匯流排通訊基於主-從配置。它有以下4個訊號:
MOSI:主出/從入
MISO:主入/從出
SCK:序列時鐘
SS:從屬選擇
晶片上“從屬選擇”(slave-select)的引腳數決定了可連到總線上的器件數量。
在SPI傳輸中,資料是同步進行傳送和接收的。資料傳輸的時鐘基於來自主處理器的時鐘脈衝,摩托羅拉沒有定義任何通用SPI的時鐘規範。然而,最常用的時鐘設定基於時鐘極性(CPOL)和時鐘相位(CPHA)兩個引數,CPOL定義SPI序列時鐘的活動狀態,而CPHA定義相對於SO-資料位的時鐘相位。 CPOL和CPHA的設定決定了資料取樣的時鐘沿。
資料方向和通訊速度
SPI傳輸序列資料時首先傳輸最高位。波特率可以高達5Mbps,具體速度大小取決於SPI硬體。例如,Xicor公司的SPI序列器件傳輸速度能達到5MHz。
SPI匯流排介面及時序
SPI匯流排包括1根串行同步時鐘訊號線以及2根資料線。
SPI模組為了和外設進行資料交換,根據外設工作要求,其輸出串行同步時鐘極性和相位可以進行配置,時鐘極性(CPOL)對傳輸協議沒有重大的影響。如果 CPOL="0",串行同步時鐘的空閒狀態為低電平;如果CPOL=1,串行同步時鐘的空閒狀態為高電平。時鐘相位(CPHA)能夠配置用於選擇兩種不同的傳輸協議之一進行資料傳輸。如果CPHA=0,在串行同步時鐘的第一個跳變沿(上升或下降)資料被取樣;如果CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)資料被取樣。SPI主模組和與之通訊的外設音時鐘相位和極性應該一致。SPI介面時序如圖3、圖4所示。
SPI是一個環形匯流排結構,由ss(cs)、sck、sdi、sdo構成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位暫存器進行資料交換。
假設下面的8位暫存器裝的是待發送的資料10101010,上升沿傳送、下降沿接收、高位先發送。
那麼第一個上升沿來的時候資料將會是sdo=1;暫存器=0101010x。下降沿到來的時候,sdi上的電平將所存到暫存器中去,那麼這時暫存器=0101010sdi,這樣在8個時鐘脈衝以後,兩個暫存器的內容互相交換一次。這樣就完成裡一個spi時序。
例子:
假設主機和從機初始化就緒:並且主機的sbuff=0xaa,從機的sbuff=0x55,下面將分步對spi的8個時鐘週期的資料情況演示一遍:假設上升沿傳送資料
脈衝 | 主機sbuff | 從機sbuff | sdi | sdo |
0 | 10101010 | 01010101 | 0 | 0 |
1上 | 0101010x | 1010101x | 0 | 1 |
1下 | 01010100 | 10101011 | 0 | 1 |
2上 | 1010100x | 0101011x | 1 | 0 |
2下 | 10101001 | 01010110 | 1 | 0 |
3上 | 0101001x | 1010110x | 0 | 1 |
3下 | 01010010 | 10101101 | 0 | 1 |
4上 | 1010010x | 0101101x | 1 | 0 |
4下 | 10100101 | 01011010 | 1 | 0 |
5上 | 0100101x | 1011010x | 0 | 1 |
5下 | 01001010 | 10110101 | 0 | 1 |
6上 | 1001010x | 0110101x | 1 | 0 |
6下 | 10010101 | 01101010 | 1 | 0 |
7上 | 0010101x | 1101010x | 0 | 1 |
7下 | 00101010 | 11010101 | 0 | 1 |
8上 | 0101010x | 1010101x | 1 | 0 |
8下 | 01010101 | 10101010 | 1 | 0 |
這樣就完成了兩個暫存器8位的交換,上面的上表示上升沿、下表示下降沿,sdi、sdo相對於主機而言的。其中ss引腳作為主機的時候,從機可以把它拉底被動選為從機,作為從機的是時候,可以作為片選腳用。根據以上分析,一個完整的傳送週期是16位,即兩個位元組,因為,首先主機要傳送命令過去,然後從機根據主機的名準備資料,主機在下一個8位時鐘週期才把資料讀回來
SPI 匯流排是Motorola公司推出的三線同步介面,同步序列3線方式進行通訊:一條時鐘線SCK,一條資料輸入線MOSI,一條資料輸出線MISO;用於 CPU與各種外圍器件進行全雙工、同步序列通訊。SPI主要特點有:可以同時發出和接收序列資料;可以當作主機或從機工作;提供頻率可程式設計時鐘;傳送結束中斷標誌;寫衝突保護;匯流排競爭保護等。圖3示出SPI匯流排工作的四種方式,其中使用的最為廣泛的是SPI0和SPI3方式(實線表示):
圖2 SPI匯流排四種工作方式
SPI 模組為了和外設進行資料交換,根據外設工作要求,其輸出串行同步時鐘極性和相位可以進行配置,時鐘極性(CPOL)對傳輸協議沒有重大的影響。如果 CPOL="0",串行同步時鐘的空閒狀態為低電平;如果CPOL=1,串行同步時鐘的空閒狀態為高電平。時鐘相位(CPHA)能夠配置用於選擇兩種不同的傳輸協議之一進行資料傳輸。如果CPHA=0,在串行同步時鐘的第一個跳變沿(上升或下降)資料被取樣;如果CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)資料被取樣。SPI主模組和與之通訊的外設音時鐘相位和極性應該一致。SPI介面時序如圖3、圖4所示。
二,.SPI功能模組的設計
根據功能定義及SPI的工作原理,將整個IP Core分為8個子模組:uC介面模組、時鐘分頻模組、傳送資料FIFO模組、接收資料FIFO模組、狀態機模組、傳送資料邏輯模組、接收資料邏輯模組以及中斷形式模組。
深入分析SPI的四種傳輸協議可以發現,根據一種協議,只要對串行同步時鐘進行轉換,就能得到其餘的三種協議。為了簡化設計規定,如果要連續傳輸多個數據,在兩個資料傳輸之間插入一個序列時鐘的空閒等待,這樣狀態機只需兩種狀態(空閒和工作)就能正確工作。
SPI協議舉例
SPI是一個環形匯流排結構,由ss(cs)、sck、sdi、sdo構成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位暫存器進行資料交換。
假設下面的8位暫存器裝的是待發送的資料10101010,上升沿傳送、下降沿接收、高位先發送。
那麼第一個上升沿來的時候資料將會是sdo=1;暫存器中的10101010左移一位,後面補入送來的一位未知數x,成了0101010x。下降沿到來的時候,sdi上的電平將鎖存到暫存器中去,那麼這時暫存器=0101010sdi,這樣在 8個時鐘脈衝以後,兩個暫存器的內容互相交換一次。這樣就完成裡一個spi時序。
舉例:
假設主機和從機初始化就緒:並且主機的sbuff=0xaa,從機的sbuff=0x55,下面將分步對spi的8個時鐘週期的資料情況演示一遍:假設上升沿傳送資料
這樣就完成了兩個暫存器8位的交換,上面的上表示上升沿、下表示下降沿,sdi、sdo相對於主機而言的。其中ss引腳作為主機的時候,從機可以把它拉底被動選為從機,作為從機的是時候,可以作為片選腳用。根據以上分析,一個完整的傳送週期是16位,即兩個位元組,因為,首先主機要傳送命令過去,然後從機根據主機的命令準備資料,主機在下一個8位時鐘週期才把資料讀回來。 SPI 匯流排是Motorola公司推出的三線同步介面,同步序列3線方式進行通訊:一條時鐘線SCK,一條資料輸入線MOSI,一條資料輸出線MISO;用於CPU與各種外圍器件進行全雙工、同步序列通訊。SPI主要特點有:可以同時發出和接收序列資料;可以當作主機或從機工作;提供頻率可程式設計時鐘;傳送結束中斷標誌;寫衝突保護;匯流排競爭保護等。下圖示出SPI匯流排工作的四種方式,其中使用的最為廣泛的是SPI0和SPI3方式 (實線表示):
SPI匯流排四種工作方式 SPI 模組為了和外設進行資料交換,根據外設工作要求,其輸出串行同步時鐘極性和相位可以進行配置,時鐘極性(CPOL)對傳輸協議沒有重大的影響。如果 CPOL="0",串行同步時鐘的空閒狀態為低電平;如果CPOL=1,串行同步時鐘的空閒狀態為高電平。時鐘相位(CPHA)能夠配置用於選擇兩種不同的傳輸協議之一進行資料傳輸。如果CPHA=0,在串行同步時鐘的第一個跳變沿(上升或下降)資料被取樣;如果CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)資料被取樣。SPI主模組和與之通訊的外裝置時鐘相位和極性應該一致。
SPI匯流排包括1根串行同步時鐘訊號線以及2根資料線。
SPI模組為了和外設進行資料交換,根據外設工作要求,其輸出串行同步時鐘極性和相位可以進行配置,時鐘極性(CPOL)對傳輸協議沒有重大的影響。如果CPOL=0,串行同步時鐘的空閒狀態為低電平;如果CPOL=1,串行同步時鐘的空閒狀態為高電平。時鐘相位(CPHA)能夠配置用於選擇兩種不同的傳輸協議之一進行資料傳輸。如果CPHA=0,在串行同步時鐘的第一個跳變沿(上升或下降)資料被取樣;如果CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)資料被取樣。SPI主模組和與之通訊的外設音時鐘相位和極性應該一致。SPI介面時序如圖3、圖4所示。
補充:
上文中最後一句話:SPI主模組和與之通訊的外裝置時鐘相位和極性應該一致。個人理解這句話有2層意思:其一,主裝置SPI時鐘和極性的配置應該由外設來決定;其二,二者的配置應該保持一致,即主裝置的SDO同從裝置的SDO配置一致,主裝置的SDI同從裝置的SDI配置一致。因為主從裝置是在SCLK的控制下,同時傳送和接收資料,並通過2個雙向移位暫存器來交換資料。工作原理演示如下圖:
上升沿主機SDO傳送資料1,同時從裝置SDO傳送資料0;緊接著在SCLK的下降沿的時候從裝置的SDI接收到了主機發送過來的資料1,同時主機也接收到了從裝置傳送過來的資料0.
SPI協議心得
SPI介面時鐘配置心得:
在主裝置這邊配置SPI介面時鐘的時候一定要弄清楚從裝置的時鐘要求,因為主裝置這邊的時鐘極性和相位都是以從裝置為基準的。因此在時鐘極性的配置上一定要搞清楚從裝置是在時鐘的上升沿還是下降沿接收資料,是在時鐘的下降沿還是上升沿輸出資料。但要注意的是,由於主裝置的SDO連線從裝置的SDI,從裝置的SDO連線主裝置的SDI,從裝置SDI接收的資料是主裝置的SDO傳送過來的,主裝置SDI接收的資料是從裝置SDO傳送過來的,所以主裝置這邊SPI時鐘極性的配置(即SDO的配置)跟從裝置的SDI接收資料的極性是相反的,跟從裝置SDO傳送資料的極性是相同的。下面這段話是Sychip Wlan8100 Module Spec上說的,充分說明了時鐘極性是如何配置的:
The 81xx module will always input data bits at the rising edge of the clock, and the host will always output data bits on the falling edge of the clock.
意思是:主裝置在時鐘的下降沿傳送資料,從裝置在時鐘的上升沿接收資料。因此主裝置這邊SPI時鐘極性應該配置為下降沿有效。
又如,下面這段話是摘自LCD Driver IC SSD1289:
SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.
意思是:從裝置SSD1289在時鐘的上升沿接收資料,而且是按照從高位到地位的順序接收資料的。因此主裝置的SPI時鐘極性同樣應該配置為下降沿有效。
時鐘極性和相位配置正確後,資料才能夠被準確的傳送和接收。因此應該對照從裝置的SPI介面時序或者Spec文件說明來正確配置主裝置的時鐘。
SPI匯流排介面及時序
SPI是一個環形匯流排結構,由ss(cs)、sck、sdi、sdo構成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位暫存器進行資料交換。
假設下面的8位暫存器裝的是待發送的資料10101010,上升沿傳送、下降沿接收、高位先發送
那麼第一個上升沿來的時候資料將會是sdo=1;暫存器=0101010x。下降沿到來的時候,sdi上的電平將所存到暫存器中去,那麼這時暫存器=0101010sdi,這樣在8個時鐘脈衝以後,兩個暫存器的內容互相交換一次。這樣就完成裡一個spi時序
verilog程式碼設計
為了適應上升沿傳輸,下降沿捕捉,這裡我們使用SPI-CK的兩倍訊號作為系統時鐘,第一個上升沿傳送,下一個上升沿捕捉,正好對應著SPI-CK的上升沿和下降沿
模擬圖如下 上面討論的是SPI作為master時的情況,接下來討論SPI作為SLAVE時候的情況