SPI總線協議及應用

SPI,是英語Serial Peripheral Interface的縮寫,顧名思義就是串行外圍設備接口。SPI,是一種高速的,全雙工,同步的通信總線,並且在芯片的管腳上只佔用四根線,節約了芯片的管腳,同時爲PCB的佈局上節省空間,提供方便,正是出於這種簡單易用的特性,現在越來越多的芯片集成了這種通信協議。

SPI是一個環形總線結構,由ss(cs)、sck、sdi、sdo構成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位寄存器進行數據交換。

上升沿發送、下降沿接收、高位先發送。

上升沿到來的時候,sdo上的電平將被髮送到從設備的寄存器中。

下降沿到來的時候,sdi上的電平將被接收到主設備的寄存器中。

假設主機和從機初始化就緒:並且主機的sbuff=0xaa (10101010),從機的sbuff=0x55 (01010101),下面將分步對spi的8個時鐘週期的數據情況演示一遍(假設上升沿發送數據)。

---------------------------------------------------

脈衝 主機sbuff 從機sbuff sdi sdo

---------------------------------------------------

0 00-0 10101010 01010101 0 0

---------------------------------------------------

1 0--1 0101010x 10101011 0 1

1 1--0 01010100 10101011 0 1

---------------------------------------------------

2 0--1 1010100x 01010110 1 0

2 1--0 10101001 01010110 1 0

---------------------------------------------------

3 0--1 0101001x 10101101 0 1

3 1--0 01010010 10101101 0 1

---------------------------------------------------

4 0--1 1010010x 01011010 1 0

4 1--0 10100101 01011010 1 0

---------------------------------------------------

5 0--1 0100101x 10110101 0 1

5 1--0 01001010 10110101 0 1

---------------------------------------------------

6 0--1 1001010x 01101010 1 0

6 1--0 10010101 01101010 1 0

---------------------------------------------------

7 0--1 0010101x 11010101 0 1

7 1--0 00101010 11010101 0 1

---------------------------------------------------

8 0--1 0101010x 10101010 1 0

8 1--0 01010101 10101010 1 0

---------------------------------------------------

這樣就完成了兩個寄存器8位的交換,上面的0--1表示上升沿、1--0表示下降沿,sdi、 sdo相對於主機而言的。根據以上分析,一個完整的傳送週期是16位,即兩個字節,因爲,首先主機要發送命令過去,然後從機根據主機的名準備數據,主機在下一個8位時鐘週期才把數據讀回來。

SPI總線是Motorola公司推出的三線同步接口,同步串行3線方式進行通信:一條時鐘線SCK,一條數據輸入線MOSI,一條數據輸出線MISO;用於 CPU與各種外圍器件進行全雙工、同步串行通訊。SPI主要特點有:可以同時發出和接收串行數據;可以當作主機或從機工作;提供頻率可編程時鐘;發送結束中斷標誌;寫衝突保護;總線競爭保護等。

SPI總線有四種工作方式(SP0, SP1, SP2, SP3),其中使用的最爲廣泛的是SPI0和SPI3方式。

SPI模塊爲了和外設進行數據交換,根據外設工作要求,其輸出串行同步時鐘極性和相位可以進行配置,時鐘極性(CPOL)對傳輸協議沒有重大的影響。如果CPOL=0,串行同步時鐘的空閒狀態爲低電平;如果CPOL=1,串行同步時鐘的空閒狀態爲高電平。時鐘相位(CPHA)能夠配置用於選擇兩種不同的傳輸協議之一進行數據傳輸。如果 CPHA=0,在串行同步時鐘的第一個跳變沿(上升或下降)數據被採樣;如果CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)數據被採樣。 SPI主模塊和與之通信的外設音時鐘相位和極性應該一致。

 

SPI時序圖詳解-SPI接口在模式0下輸出第一位數據的時刻

SPI接口在模式0下輸出第一位數據的時刻

SPI接口有四種不同的數據傳輸時序,取決於CPOL和CPHL這兩位的組合。圖1中表現了這四種時序,

時序與CPOL、CPHL的關係也可以從圖中看出。

SPI總線協議及SPI時序圖詳解【轉】 - pcwebmaster - pcwebmaster的博客

 

圖1

 

CPOL是用來決定SCK時鐘信號空閒時的電平,CPOL=0,空閒電平爲低電平,CPOL=1時,

空閒電平爲高電平。CPHA是用來決定採樣時刻的,CPHA=0,在每個週期的第一個時鐘沿採樣,

CPHA=1,在每個週期的第二個時鐘沿採樣。

 

由於我使用的器件工作在模式0這種時序(CPOL=0,CPHA=0),所以將圖1簡化爲圖2,

只關注模式0的時序。

SPI總線協議及SPI時序圖詳解【轉】 - pcwebmaster - pcwebmaster的博客

 

圖2

我們來關注SCK的第一個時鐘週期,在時鐘的前沿採樣數據(上升沿,第一個時鐘沿),

在時鐘的後沿輸出數據(下降沿,第二個時鐘沿)。首先來看主器件,主器件的輸出口(MOSI)輸出的數據bit1,

在時鐘的前沿被從器件採樣,那主器件是在何時刻輸出bit1的呢?bit1的輸出時刻實際上在SCK信號有效以前,

比 SCK的上升沿還要早半個時鐘週期。bit1的輸出時刻與SSEL信號沒有關係。再來看從器件,

主器件的輸入口MISO同樣是在時鐘的前沿採樣從器件輸出的bit1的,那從器件又是在何時刻輸出bit1的呢。

從器件是在SSEL信號有效後,立即輸出bit1,儘管此時SCK信號還沒有起效。關於上面的主器件

和從器件輸出bit1位的時刻,可以從圖3、4中得到驗證。

SPI總線協議及SPI時序圖詳解【轉】 - pcwebmaster - pcwebmaster的博客

 

圖3

注意圖3中,CS信號有效後(低電平有效,注意CS下降沿後發生的情況),故意用延時程序

延時了一段時間,之後再向數據寄存器寫入了要發送的數據,來觀察主器件輸出bit1的情況(MOSI)。

可以看出,bit1(值爲1)是在SCK信號有效之前的半個時鐘週期的時刻開始輸出的(與CS信號無關),

到了SCK的第一個時鐘週期的上升沿正好被從器件採樣。

SPI總線協議及SPI時序圖詳解【轉】 - pcwebmaster - pcwebmaster的博客

 

圖4

圖4中,注意看CS和MISO信號。我們可以看出,CS信號有效後,從器件立刻輸出了bit1(值爲1)。

 

通常我們進行的spi操作都是16位的。圖5記錄了第一個字節和第二個字節間的相互銜接的過程。

第一個字節的最後一位在SCK的上升沿被採樣,隨後的SCK下降沿,從器件就輸出了第二個字節的第一位。

SPI總線協議及SPI時序圖詳解【轉】 - pcwebmaster - pcwebmaster的博客

 

 

 

 

 

 

 

SPI總線協議介紹(接口定義,傳輸時序)

一、技術性能

SPI接口是Motorola 首先提出的全雙工三線同步串行外圍接口,採用主從模式(Master Slave)架構;支持多slave模式應用,一般僅支持單Master。

時鐘由Master控制,在時鐘移位脈衝下,數據按位傳輸,高位在前,低位在後(MSB first);SPI接口有2根單向數據線,爲全雙工通信,目前應用中的數據速率可達幾Mbps的水平。

-------------------------------------------------------

二、接口定義

SPI接口共有4根信號線,分別是:設備選擇線、時鐘線、串行輸出數據線、串行輸入數據線。

SPI總線協議及SPI時序圖詳解【轉】 - pcwebmaster - pcwebmaster的博客

(1)MOSI:主器件數據輸出,從器件數據輸入

(2)MISO:主器件數據輸入,從器件數據輸出

(3)SCLK :時鐘信號,由主器件產生

(4)/SS:從器件使能信號,由主器件控制

-------------------------------------------------------

三、內部結構

SPI總線協議及SPI時序圖詳解【轉】 - pcwebmaster - pcwebmaster的博客

-------------------------------------------------------

四、傳輸時序

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

SPI總線協議及SPI時序圖詳解【轉】 - pcwebmaster - pcwebmaster的博客

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,是英語Serial Peripheral interface的縮寫,顧名思義就是串行外圍設備接口。SPI,是一種高速的,全雙工,同步的通信總線,並且在芯片的管腳上只佔用四根線,節約了芯片 的管腳,同時爲PCB的佈局上節省空間,提供方便,正是出於這種簡單易用的特性,現在越來越多的芯片集成了這種通信協議,比如P89LPC900.

SPI,是一種高速的,全雙工,同步的通信總線,其工作模式有兩種:主模式和從模式,無論那種模式,都支持

3Mbit/s的速率,並且還具有傳輸完成標誌和寫衝突保護標誌。到目前爲止,我使用過的具有SPI總線的器件,就是存儲芯片 Eprom:at25128,在使用過程中,發現的確是有這種總線的優點。下面以P89LPC900單片機的SPI總線來解釋SPI總線的通用使用規 則。

LPC900單片機的SPI接口主要由4個引腳構成:SPICLK、MOSI、MISO及/SS,其中SPICLK是整個SPI總線的公用時 鍾,MOSI、MISO作爲主機,從機的輸入輸出的標誌,MOSI是主機的輸出,從機的輸入,MISO是主機的輸入,從機的輸出。/SS 是從機的標誌管腳,在互相通信的兩個SPI總線的器件,/SS管腳的電平低的是從機,相反/SS管腳的電平高的是主機。在一個SPI通信系統中,必須有主機。

SPI總線可以配置成單主單從,單主多從,互爲主從。今以互爲主從模式作爲講解:

要進行SPI互爲主從操作,必須遵照以下步驟:

1 對A、B進行初始化,均設爲主機(需要進行以下操作)。

a) SPI端口初始化爲準雙向。

b) SPCTL配置爲0x50,SSIG=0,SPEN=1,MSTR=1。

c) 清除SPSTAT中的SPIF及WCOL標誌位爲0。

d) 如果需要使用SPI中斷,可使能相應中斷位。

2 將A上一個引腳連接到B的/SS引腳上,然後拉低/SS,可將B強行置爲從機模式,同時B機會發生以下變化:

a) B機的MSTR位自動清0。

b) B機的MOSI及SPICLK強行變爲輸入模式,MISO則變爲輸出模式。

c) B機SPIF位置位。

d) 如果SPI中斷使能,B機將執行SPI中斷服務程序。

3 B機可設置爲查詢接收或中斷接收方式,以時刻準備接收由A機發送過來的數據,要使B機恢復爲主機,必須完整執行步驟1。 本示例中,通過兩塊DP932 實驗板構成了SPI互爲主從測試系統。

程序中應注意的問題:

1 程序中應注意對首次拉低SS引腳進行處理:當A機首次通過B_SS將B機設置爲從機後,從機的SBIF位會置位(會被認爲完成一次傳輸),如果這之前,使 能了SPI中斷,則從機則會執行相應的中斷服務程序(本示例程序中,當B機的SS引腳被拉爲低電平,B機的SBIF首次置位進行處理)。

2 關於從機恢復爲主機的問題:互爲主從模式中,當B機被A機設置爲從機後,CPCTL寄存器中MSTR位被清除爲0,且SPIF被置1,MOSI和SPICLK強制變爲輸入模式,MISO強制變爲輸出模式。要想恢復爲主機,必須執行以下操作:

a) 將MSTR位置1,SPIF位清0。

b) 將MOSI,SPICLK,MISO及SS重新恢復爲準雙向口。

c) 在a)、b)之前,需要注意將B_SS拉高,如果其一直爲低電平,即使完成a)、b)操作,也會將B機重新設置爲從機。

3 在SPI總線的使用過程中,可以通過DORD(SPI數據順序選擇位),CPOL(SPI時鐘極性選擇位),CPHA( SPI時鐘相位選擇位)控制主/從機傳輸格式。對於本實驗,可以忽略這些位的影響,但是在使用一些其他SPI器件時,必須根據從器件數據手冊的要求,對 SPI數據的傳輸順序,SPI的時鐘極性,及SPI的時鐘相位進行正確的設置。

4 一些SPI的應用系統,由於硬件的設計並不是很合理,所以有時SPI通信不正常(傳輸數據出錯,或其他情況),你可以試着降低SPI總線的傳輸速率,或者調節一些SPI時鐘極性及相位,以使傳輸穩定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章