串行通信_SPI通訊協議

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的四種傳輸協議可以發現,根據一種協議,只要對串行同步時鐘進行轉換,就能得到其餘的三種協議。爲了簡化設計規定,如果要連續傳輸多個數據,在兩個數據傳輸之間插入一個串行時鐘的空閒等待,這樣狀態機只需兩種狀態(空閒和工作)就能正確工作。

 
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文檔說明來正確配置主設備的時鐘。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章