複製鏈接
請複製以下鏈接發送給好友

SPI

(SPI協議)

鎖定
SPI是串行外設接口(Serial Peripheral Interface)的縮寫,是一種高速的,全雙工,同步的通信總線,並且在芯片的管腳上只佔用四根線,節約了芯片的管腳,同時為PCB的佈局上節省空間,提供方便,正是出於這種簡單易用的特性,越來越多的芯片集成了這種通信協議,比如AT91RM9200。
中文名
串行外設接口
外文名
Serial Peripheral Interface
特    性
支持全雙工
縮    寫
SPI
學    科
通信
應    用
手機、數碼、液晶顯示器、機頂盒

SPISPI協議概括

SPI總線是一種4線總線,因其硬件功能很強,所以與SPI有關的軟件就相當簡單,使中央處理器(Central Processing Unit,CPU)有更多的時間處理其他事務。正是因為這種簡單易用的特性,越來越多的芯片集成了這種通信協議,比如AT91RM9200。SPI是一種高速、高效率的串行接口技術。通常由一個主模塊和一個或多個從模塊組成,主模塊選擇一個從模塊進行同步通信,從而完成數據的交換。SPI是一個環形結構,通信時需要至少4根線(事實上在單向傳輸時3根線也可以) [1] 
SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主設備和一個或多個從設備,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基於SPI的設備共有的,它們是MISO(主設備數據輸入)、MOSI(主設備數據輸出)、SCLK(時鐘)、CS(片選)。
(1)MISO– Master Input Slave Output主設備數據輸入,從設備數據輸出;
(2)MOSI– Master Output Slave Input,主設備數據輸出,從設備數據輸入;
(3)SCLK – Serial Clock,時鐘信號,由主設備產生;
(4)CS – Chip Select,從設備使能信號,由主設備控制。
其中,CS是從芯片是否被主芯片選中的控制信號,也就是説只有片選信號為預先規定的使能信號時(高電位或低電位),主芯片對此從芯片的操作才有效。這就使在同一條總線上連接多個SPI設備成為可能。
接下來就負責通訊的3根線了。通訊是通過數據交換完成的,這裏先要知道SPI是串行通訊協議,也就是説數據是一位一位的傳輸的。這就是SCLK時鐘線存在的原因,由SCLK提供時鐘脈衝,SDI,SDO則基於此脈衝完成數據傳輸。數據輸出通過 SDO線,數據在時鐘上升沿或下降沿時改變,在緊接着的下降沿或上升沿被讀取。完成一位數據傳輸,輸入也使用同樣原理。因此,至少需要8次時鐘信號的改變(上沿和下沿為一次),才能完成8位數據的傳輸。
時鐘信號線SCLK只能由主設備控制,從設備不能控制。同樣,在一個基於SPI的設備中,至少有一個主設備。這樣的傳輸方式有一個優點,在數據位的傳輸過程中可以暫停,也就是時鐘的週期可以為不等寬,因為時鐘線由主設備控制,當沒有時鐘跳變時,從設備不採集或傳送數據。SPI還是一個數據交換協議:因為SPI的數據輸入和輸出線獨立,所以允許同時完成數據的輸入和輸出。芯片集成的SPI串行同步時鐘極性和相位可以通過寄存器配置,IO模擬的SPI串行同步時鐘需要根據從設備支持的時鐘極性和相位來通訊。
最後,SPI接口的一個缺點:沒有指定的流控制,沒有應答機制確認是否接收到數據。
SPI的片選可以擴充選擇16個外設,這時PCS輸出=NPCS,説NPCS0~3接4-16譯碼器,這個譯碼器是需要外接4-16譯碼器,譯碼器的輸入為NPCS0~3,輸出用於16個外設的選擇。

SPI協議舉例

SPI是一個環形總線結構,由ss(cs)、sck、sdi、sdo構成,主要是在sck的控制下,兩個雙向移位寄存器進行數據交換。
假設下面的8位寄存器裝的是待發送的數據10101010,上升沿發送、下降沿接收、高位先發送。
合併圖冊
合併圖冊(2張)
那麼第一個上升沿來的時候 數據將會是sdo=1;寄存器=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總線四種工作方式
SPI模塊為了和外設進行數據交換,根據外設工作要求,其輸出串行同步時鐘極性和相位可以進行配置,時鐘極性(CPOL)對傳輸協議沒有重大的影響。如果CPOL=0,串行同步時鐘的空閒狀態為低電平;SPI主模塊和與之通信的外設時鐘相位和極性應該一致。SPI接口時序如圖3、圖4所示。

SPI用户邏輯

該模塊針對用户不同的應用來設計,本質上就是用户的具體業務應用,與SPI-4接口沒有直接關係。當應用支持多個端口時,這部分就顯得至關重要。下面以支持兩個端口的應用來説明用户邏輯的設計技巧。
(1)Sink Core的用户邏輯
端口為兩個時,用户邏輯就需要用兩個不同的FIFO根據端口的地址等來分別緩存用户的兩個業務數據.同時根據FIFO的情況來發出流控信息給SPI4數據接口,如圖1所示。
圖1 Sink Core 兩個端口的用户邏輯
圖1 圖1
(2) Source Core的用户邏輯
當端口為兩個時,用户邏輯就需要根據流控信息和兩個不同的FffiOffJ情況來做仲裁,諛定哪個用户邏輯FIFO需要發送給SPI4數據接口,如圖2所示.
圖2 Source Core2個端口的用户邏輯
圖2 圖2

SPISPI原理

SPI有3種規格,如右圖所示為其模型。
圖
3種SPI的處理流程大同小異,使用最多的SPI-4為例來説明SPI的原理。它在發送接口和接收接口都有各自的數據通道和流控狀態信息通道,其數據通道和流控狀態信息通道是獨立的並且是點對點通信。數據是以包的形式發送,根據數據包中的內嵌地址可支持高達256個端口,以下分別説明基本協議及數據通道和流控狀態信息的處理過程。

SPI時序圖

SPI時序圖詳解 SPI時序圖詳解
SPI時序圖詳解---SPI接口在模式0下輸出第一位數據的時刻。
SPI接口有四種不同的數據傳輸時序,取決於CPOL和CPHA這兩位的組合。圖1中表現了這四種時序,時序與CPOL、CPHA的關係也可以從圖中看出。
CPOL是用來決定SCK時鐘信號空閒時的電平,CPOL=0,空閒電平為低電平,CPOL=1時,空閒電平為高電平。CPHA是用來決定採樣時刻的,CPHA=0,在每個週期的第一個時鐘沿採樣,CPHA=1,在每個週期的第二個時鐘沿採樣 [2] 

SPI同步串行口

SPI:高速同步串行口。是一種標準的四線同步雙向串行總線,是串行外圍設備接口。是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應用在 EEPROM,FLASH,實時時鐘,AD轉換器,還有數字信號處理器和數字信號解碼器之間。
SPI總線系統是一種同步串行外設接口,它可以使MCU與各種外圍設備以串行方式進行通信以交換信息。外圍設置FLASHRAM、網絡控制器、LCD顯示驅動器、A/D轉換器和MCU等。SPI總線系統可直接與各個廠家生產的多種標準外圍器件直接接口,該接口一般使用4條線:串行時鐘線(SCLK)、主機輸入/從機輸出數據線MISO、主機輸出/從機輸入數據線MOSI和低電平有效的從機選擇線SS(有的SPI接口芯片帶有中斷信號線INT、有的SPI接口芯片沒有主機輸出/從機輸入數據線MOSI)。
SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主設備和一個或多個從設備,需要至少4根線,事實上3根也可以(用於單向傳輸時,也就是半雙工方式)。也是所有基於SPI的設備共有的,它們是SDI(數據輸入)、SDO(數據輸出)、SCLK(時鐘)、CS(片選)。
(1)MOSI– SPI總線主機輸出/ 從機輸入(SPI Bus Master Output/Slave Input);
(2)MISO– SPI總線主機輸入/ 從機輸出 (SPI Bus Master Input/Slave Output);
(3)SCLK –時鐘信號,由主設備產生;
(4)CS – 從設備使能信號,由主設備控制(Chip select),有的IC此pin腳叫SS。
其中CS是控制芯片是否被選中的,也就是説只有片選信號為預先規定的使能信號時(高電位或低電位),對此芯片的操作才有效。這就允許在同一總線上連接多個SPI設備成為可能。
接下來就負責通訊的3根線了。通訊是通過數據交換完成的,這裏先要知道SPI是串行通訊協議,也就是説數據是一位一位的傳輸的。這就是SCLK時鐘線存在的原因,由SCK提供時鐘脈衝,SDI,SDO則基於此脈衝完成數據傳輸。數據輸出通過 SDO線,數據在時鐘上升沿或下降沿時改變,在緊接着的下降沿或上升沿被讀取。完成一位數據傳輸,輸入也使用同樣原理。這樣,在至少8次時鐘信號的改變(上沿和下沿為一次),就可以完成8位數據的傳輸。
點對點的通信中,SPI接口不需要進行尋址操作,且為全雙工通信,顯得簡單高效。在多個從設備的系統中,每個從設備需要獨立的使能信號,硬件上比I2C系統要稍微複雜一些。

SPI硬件示意圖

SPI接口在內部硬件實際上是兩個簡單的移位寄存器,傳輸的數據為8位,在主器件產生的從器件使能信號和移位脈衝下,按位傳輸,高位在前,低位在後。如下圖所示,在SCLK的下降沿上數據改變,同時一位數據被存入移位寄存器。

SPI性能特點

AT91RM9200的SPI接口主要由4個引腳構成:SPICLK、MOSI、MISO及 NSS,其中SPICLK是整個SPI總線的公用時鐘,MOSI、MISO作為主機,從機的輸入輸出的標誌,MOSI是主機的輸出,從機的輸入,MISO 是主機的輸入,從機的輸出。NSS是從機的標誌管腳,在互相通信的兩個SPI總線的器件,NSS管腳的電平低的是從機,相反NSS管腳的電平高的是主機。在一個SPI通信系統中,必須有主機。SPI總線可以配置成單主單從,單主多從,互為主從。
SPI的片選可以擴充選擇16個外設,這時PCS輸出=NPCS,説NPCS0~3接4-16譯碼器,這個譯碼器是需要外接4-16譯碼器,譯碼器的輸入為NPCS0~3,輸出用於16個外設的選擇。
SPI接口的一個缺點:沒有指定的流控制,沒有應答機制確認是否接收到數據。

SPI協議舉例

SPI是一個環形總線結構,由ss(cs)、sck、sdi、sdo構成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位寄存器進行數據交換。
假設下面的8位寄存器裝的是待發送的數據10101010,上升沿發送、下降沿接收、高位先發送。
那麼第一個上升沿來的時候 數據將會是sdo=1;寄存器中的10101010左移一位,後面補入送來的一位未知數x,成了0101010x。下降沿到來的時候,sdi上的電平將鎖存到寄存器中去,那麼這時寄存器=0101010sdi,這樣在 8個時鐘脈衝以後,兩個寄存器的內容互相交換一次。這樣就完成了一個spi時序。

SPI性能補充

上文中最後一句話: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舉例

假設主機和從機初始化就緒:並且主機的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,一條數據輸入線MISO,一條數據輸出線MOSI;用於CPU與各種外圍器件進行全雙工、同步串行通訊。SPI主要特點有:可以同時發出和接收串行數據;可以當作主機或從機工作;提供頻率可編程時鐘;發送結束 中斷標誌;寫衝突保護;總線競爭保護等。下圖示出SPI總線工作的四種方式,其中使用的最為廣泛的是SPI0和SPI3方式 (實線表示):
SPI總線四種工作方式 SPI 模塊為了和外設進行數據交換,根據外設工作要求,其輸出串行同步時鐘極性和相位可以進行配置,時鐘極性(CPOL)對傳輸協議沒有重大的影響。如果 CPOL=0,串行同步時鐘的空閒狀態為低電平;如果CPOL=1,串行同步時鐘的空閒狀態為高電平。時鐘相位(CPHA)能夠配置用於選擇兩種不同的傳輸協議之一進行數據傳輸。如果CPHA=0,在串行同步時鐘的第一個跳變沿(上升或下降)數據被採樣;如果CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)數據被採樣。SPI主模塊和與之通信的外設備時鐘相位和極性應該一致。
參考資料