SPI是英文Serial Peripheral Interface的縮寫,中文意思是串行外圍設備接口,SPI是Motorola公司推出的一種同步串行通訊方式,是一種三線同步總線,因其硬件功能很強,與SPI有關的軟件就相當簡單,使CPU有更多的時間處理其他事務。
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個時鐘週期的數據情況演示一遍:假設上升沿發送數據
下面是SPI讀寫協議的移位過程,每個CLK都是按照四種模式要求的邊沿觸發方式,來移位的。下表就是每一個CLK,主機SBUFF傳輸數據的移位過程。
脈衝 | 主機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 E2PROM的讀寫介紹如下:
MOTOROLA公司的SPI總線的基本信號線爲3根傳輸線,即SI、SO、SCK。傳輸的速率由時鐘信號SCK決定,SI爲數據輸入、SO爲數據輸出。採用SPI總線的系統如圖8-27所示,它包含了一個主片和多個從片,主片通過發出片選信號-CS來控制對哪個從片進行通信,當某個從片的-CS信號有效時,能通過SI接收指令、數據,並通過SO發回數據。而未被選中的從片的SO端處於高阻狀態。
圖8-27 SPI總線的系統
主片在訪問某一從片時,必須使該從片的片選信號有效;主片在SCK信號的同步下,通過SI線發出指令、地址信息;如需將數據輸出,則接着寫指令,由SCK同步在SI線上發出數據;如需讀回數據,則接着讀指令,由主片發出SCK,從片根據SCK的節拍通過SO發回數據。
因而對具有SPI接口的從片器件來講,SCK、SI是輸入信號,SO是輸出信號。SCK用於主片和從片通信的同步。SI用於將信息傳輸到器件,輸入的信息包括指令、地址和數據,指令、地址和數據的變化在SCK的低電平期間進行,並由SCK信號的上升沿鎖存。SO 用於將信息從器件傳出,傳出的信息包括狀態和數據,信息在SCK信號的下降沿移出。
Microchip公司的25XX系列的串行E2PROM採用了SPI總線,該系列器件的性能如表8-2所示。
表8-2 Microchip公司的25XX系列的串行E2PROM
型號 |
25XX040 |
25XX080 |
25XX160 |
25XX320 |
容量 |
4K (512 X 8bit) |
8K (1024 X 8bit) |
16K (4096 X 8bit) |
32K (4096 X 8bit) |
地址信號 |
A0~A8 |
A0~A9 |
A0~A10 |
A0~A11 |
以25XX320爲例,該器件是4K字節的E2PROM,結構如圖8-28所示,接口信號爲SCK、SI和SO,此外還具有-CS、-WP、-HOLD信號線。其中 -CS爲器件選中信號,當此信號爲低電平時器件被選中,高電平時器件處於等待狀態。
圖8-28 25XX320的結構
與並行接口電路不同的是,在並行接口電路中對器件進行操作的控制信號,在串行接口電路中只能用指令實現,25XX320的操作指令有數據讀指令、寫操作的允許和禁止指令、寫數據指令和狀態寄存器的讀寫指令。在器件的內部有一個8位的指令寄存器,在SCK的上升沿,通過SI信號線,指令輸入到上述寄存器並被執行。
表8-3 25系列串行存儲器的指令
指令名稱 |
指令格式 |
描述 |
READ |
00000011 |
從選定的地址開始讀存儲器數據 |
WRITE |
00000010 |
從選定的地址開始寫存儲器數據 |
WRDI |
00000100 |
禁止寫操作 |
WREN |
00000110 |
允許寫操作 |
RDSR |
00000101 |
讀狀態寄存器 |
WRSR |
00000001 |
寫狀態寄存器 |
器件的讀操作時序如圖8-29所示。當-CS信號有效時,在SCK信號的同步下,8位的讀指令送入器件,接着送入16位地址(由於25XX320只使用地址信號 A0~A11,地址的高4位無效)。在讀指令和地址發出後,SCK繼續發出時鐘信號,此時存儲在該地址的數據由SCK控制從SO引腳移出。在每個數據移出後,內部的地址指針自動加1,如繼續對器件發送SCK信號,可讀出下一個數據。當地址指針計到0FFFH之後,將回到0000H。讀操作的結束由-CS信號變高實現。
圖8-29 25系列串行存儲器的讀時序
25XX系列的串行EEPROM的寫操作通過寫允許及禁止指令控制,寫操作必須在器件處於寫允許狀態時進行。
寫允許及禁止指令均爲8位的指令,指令的操作過程爲:將-CS信號置爲低電平,在SCK信號的作用下,通過SI引腳輸入上述指令,在8位的指令送入器件之後,將-CS信號置爲高電平,使器件鎖存於寫允許或寫禁止狀態。如在輸入寫允許指令後未將-CS信號置爲高電平,則寫允許狀態未鎖存,此時如直接進行寫操作,數據將不能寫入存儲器。在上電、寫禁止指令、寫狀態寄存器指令、寫數據指令執行之後,器件的寫允許狀態將被複位,即處於寫禁止狀態。
寫操作通常在寫允許指令之後進行,其時序如圖8-30所示。在寫允許狀態鎖存後,將-CS變高;再將-CS變低,在SCK的同步下輸入寫操作指令並送入16位地址,緊接着發送需寫入的數據,寫入的數據一次最多可達32個,但必須保證在同一頁內。一頁數據的地址從XXXX XXXX XXX0 0000 開始,到XXXX XXXX XXX1 1111結束,當內部的地址指針計數器達到XXXX XXXX XXX1 1111後,繼續發送時鐘信號將使地址計數器回覆到該頁的第一個地址,即XXXX XXXX XXX0 0000H。
圖8-30 25系列串行存儲器的寫時序
爲了使數據有效寫入,-CS信號只能在寫入數據的最後一個字節的最低位寫入後變高。如-CS信號在其他時間變高,將無法保證數據的完整寫入。在寫操作的過程中,能通過讀狀態指令將狀態寄存器的內容讀回,當寫操作完成後,寫允許鎖存狀態將被複位。
二,.SPI功能模塊的設計
根據功能定義及SPI的工作原理,將整個IP Core分爲8個子模塊:uC接口模塊、時鐘分頻模塊、發送數據FIFO模塊、接收數據FIFO模塊、狀態機模塊、發送數據邏輯模塊、接收數據邏輯模塊以及中斷形式模塊。
深入分析SPI的四種傳輸協議可以發現,根據一種協議,只要對串行同步時鐘進行轉換,就能得到其餘的三種協議。爲了簡化設計規定,如果要連續傳輸多個數據,在兩個數據傳輸之間插入一個串行時鐘的空閒等待,這樣狀態機只需兩種狀態(空閒和工作)就能正確工作。