總線基礎--SPI總線

歡迎轉載,轉載請註明出處。

前言

SPI(Serial Peripheral Interface)串行外設接口的縮寫。是由Motorola 公司推出的一種同步串行接口技術,SPI 總線在物理上是通過接在外圍設備微控制器(PICmicro) 上面的微處理控制單元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模塊(Module)來實現的, 它允許 MCU 以全雙工的同步串行方式, 與各種外圍設備進行高速數據通信.

SPI

SPI總線由基本的四根線組成,一條時鐘線SCK,一條主機輸出從機輸入線MOSI(master output slave input),一條主機輸出從機輸出線MISO和一條信號線,有的SPI芯片還會添加寫保護(Write Protect)和信號保持(Hold)引腳,感興趣的可以自己找一份SPI芯片的數據手冊,去了解這兩個引腳的作用,這裏就不做介紹。

  • 全雙工
    關於全雙工的概念,上一篇文章已經做了介紹,SPI有兩條數據線MOSI和MISO,可以同時接收和發送串行數據,所以SPI是一種全雙工串行接口。

  • 同步
    關於同步和異步、串行和並行很多人分不清概念;串行和並行我在前面也做了介紹,簡單的說就是串行數據是一位一位的傳輸,並行一次可以傳輸一個或多個字節。很多人會把同步理解成「一起/共同」,認爲同步就是一起傳輸,異步就是分開傳輸。其實這種理解是有偏差的,同步指按照一定的步驟,有規律,有節奏的執行;執行過程之間有一定的邏輯關係,比如當前執行的過程依賴於上一過程的結果,只有當前一步操作結束後,當前過程才能執行,那這兩個過程就可以稱作是同步的;相反的,異步指兩個過程之間沒有什麼依賴性,就算上一過程沒有執行結束,只要有需要,當前過程也可以執行。舉個例子:比如工作和聊天,如果工作和聊天存在依賴關係,即只有工作結束後才能聊天,否則就一直工作,那麼這兩個過程就可以稱作是同步的;但是如果是工作累了,去聊會天休息一下,或者正聊着天,突然被領導發現了,趕緊回來工作,那麼就可認爲這兩個過程是異步的。
    注意:這裏千萬不要把異步理解爲多進程/多線程,同步和異步只是一種傳輸或工作方式,多進程/多線程也可以有同步和異步兩種工作方式。
    SPI的兩條數據線MOSI/MISO,都由同一條信號線控制,控制傳輸時序,所以SPI是同步通訊。

  • 多主從
    SPI支持多主從結構,但同一時刻只能有一個主機工作,因爲數據的傳輸時鐘信號只能由主機產生(從機的信號線SCK,是與主機的信號線連在一起的);前面I2C總線,主機是通過從設備的地址信息來找到需要通信的從設備,那麼SPI總線是不是也通過這種方式來區別從設備呢?答案是否定的,前面說到SPI由基本的四條線組成,有一條叫片選線(CS),主機選擇與某個SPI設備通信時,會先發出片選信號(把CS信號線置爲高/低電平,具體看從設備要求),選擇從設備,從設備被選中後就開始工作。

  • 數據交換
    這裏說的是數據交換,而不是數據傳輸,因爲SPI協議規定,SPI設備不能只做「接收者」或「發送者」,每個時鐘週期都會發送並且接收1位數據,這些通過移位寄存器完成,如下圖:主機和從機各有一個移位寄存器,且鏈接形成了一個環狀(通過MOSI/MISO),伴隨着時鐘脈衝,數據從高位到地位,依次移出主機寄存器和從機寄存器,並且移入從機寄存器和主機寄存器,當寄存器中數據全部移出後,就完成了主機和從機間的數據交換。這裏SPI有個缺點就是不像I2C一樣有應答機制,無法判斷是否接收到數據。

移位寄存器

四種工作模式

SPI總線有四種工作方式,由時鐘極性(CPOL)和時鐘相位(CPHA)決定。
CPOL:時鐘極性,決定SPI總線空閒時的時鐘狀態;CPOL = 0,表示時鐘空閒時爲低電平;CPOL = 1,表示時鐘空閒時爲高電平。
CPHA:時鐘相位,決定數據在時鐘的第幾個跳變沿被採樣;CPHA = 0,表示在時鐘的第一個跳變沿(上升沿或下降沿)數據被採樣;CPHA = 1,表示在時鐘的第二個跳變沿被採樣。

注意:這裏很多人對時鐘相位(CPHA)有誤解,認爲「 *CPHA = 1時, SPI 設備在時鐘信號下降沿時觸發數據採樣, 在上升沿時發送數據. 當 CPHA = 0 時也正好相反.」*,這個理解顯然是錯的,CPHA並不能決定數據在上升沿還是下降沿採樣。

我們來看下面這幅圖,當CPHA = 0時,數據採樣發生在時鐘的第一個跳變沿;當CPHA = 1時,數據採樣發生在第二個時鐘跳變沿。但我們可以注意到,在CPOL取值不同時,時鐘的第一個跳變沿和第二個跳變沿是不一樣的(CPOL = 0,第一個跳變沿爲低電平到高電平,即上升沿;CPOL = 1,第一個跳變沿爲下降沿),所以數據採樣發生在上升沿還是下降沿應該是CPHA和CPOL共同決定的結果

SPI時序圖

爲了更清楚的理解SPI總線的四種工作方式,我從S3C2440數據手冊截取了四幅圖,來比較一下區別。
忽略MSB和LSB的區別,可以看到圖1中,總線空閒時SPICLK爲低電平,在時鐘的第一個跳變沿(上升沿)數據被採樣。
model1

與圖1相比,圖2中,總線空閒狀態沒變(因爲CPOL相同),但採樣時間變了,圖2中,在時鐘的第二個跳變沿(下降沿)數據被採樣,採樣邊沿也由圖1中的上升沿變爲下降沿,但這並不能說明 CPHA可以完全控制邊沿觸發信號。
model2

圖3與圖1的區別在於總線空閒時,時鐘信號爲高電平,數據也是在第一個跳變沿(下降沿)被採樣(CPHA = 0),雖然圖1和圖3的時鐘相位(CPHA)相同,但採樣邊沿卻相反,這進一步證明將CPHA理解爲控制採樣邊沿方式是不對的。
model3

同樣的道理,對比圖3和圖4,我們可以進一步的理解,採樣邊沿是由CPOL和CPHA共同作用的結果。
model4

這裏值得一提的是,主機的工作模式得參考從設備來決定,因爲主設備的MOSI和從設備的MISO口相連,從設備的MOSI口和主設備的MISO口相連,所以主設備的時鐘配置和從設備的時鐘配置應該是相反的。我們在配置時鐘的極性時,一定要弄清楚從設備是在上升沿還是下降沿接收數據,是在上升沿還是下降沿發送數據。例如Sychip Wlan8100 Module Spec 上規定:主設備在時鐘的下降沿發送數據,從設備在時鐘的上升沿接收數據。因此主設備這邊 SPI 時鐘極性應該配置爲下降沿有效。在 LCD Driver IC SSD1289中也規定:從設備 SSD1289 在時鐘的上升沿接收數據,而且是按照從高位到低位的順序接收數據的。因此主設備的 SPI 時鐘極性同樣應該配置爲下降沿有效。
只有在時鐘極性和時鐘相位配置正確後,數據才能準確的在主從設備間傳遞,因此配置時鐘時,要參照從設備的接口時序或相關數據手冊來配置主設備的時鐘(因爲從設備的時鐘信號由主設備提供)。

總結

到此SPI總線的相關介紹就結束了,儘管SPI總線需要佔用主機較多的口線(每個從機都需要一根CS線),而且無應答信號;但因爲其支持全雙工,操作簡單,傳輸效率高等優點,被很多廠商青睞。關於SPI總線的介紹就到這裏,下一篇將介紹功能強大的UART。