串行外設介面（Serial Peripheral Interface Bus，SPI），是一種用於晶片通信的同步串行通信介面規範，主要應用於單晶片系統中。類似 I²C。
這種介面首先由摩托羅拉公司於 20 世紀 80 年代中期開發，後發展成了行業規範。它的典型應用有快閃記憶體、EEPROM、SD 卡與液晶顯示器。

SPI 裝置之間使用全雙工模式通信，是一個主機和一個或多個從機的主從模式。主機負責初始化影格，這個資料傳輸影格可以用於讀與寫兩種操作，片選線路可以從多個從機選擇一個來回應主機的請求。

有時 SPI 介面被稱作四線式介面，這是為了與其他不同線制的資料傳輸介面加以區分。SPI 準確來講應為「同步串行介面」，但是它又與同步串行介面協定（SSI）是完全不同的兩種協定。雖然 SSI 也是一個四線式同步通信協定，但是它使用差分訊號，而且僅提供一個單工通信信道。於此相對地，SPI 是一個單主機多從機的通信介面。

SPI 是一種事實標準，也就是說這種規範沒有對應的技術標準。因此各個廠家生產的 SPI 器件組態不一樣，不一定有互操作性。



介面

SPI 匯流排規定了 4 個保留邏輯訊號介面：


* SCLK（Serial Clock）：串列時脈，由主機發出

* MOSI（Master Output, Slave Input）：主機輸出從機輸入訊號（資料由主機發出）

* MISO（Master Input, Slave Output）：主機輸入從機輸出訊號（資料由從機發出）

* SS（Slave Select）：片選訊號，由主機發出，一般是低電位有效

儘管上面的引腳名稱是最常用的，但在過去，有時會使用其他引腳命名方式，因此舊的積體電路產品的 SPI 埠引腳名稱可能有所不同。



操作

SPI 匯流排的通訊操作可以在單個主裝置與一或多個從機之間進行。

在只有單一從機的情況下，如果從機允許，SS 線可以固定為邏輯低電平。然而有一些從機需要片選訊號的下降沿來觸發動作，例如 Maxim MAX1242 ADC 在高→低轉換時才會開始進行模數轉換。對於多個從機，每個從機都需要一個獨立的 SS 訊號。

大多數從屬裝置具有三態邏輯的特性，所以當器件未被選中時，它們的 MISO 訊號變為高阻抗（邏輯斷開）。沒有三態輸出的器件不能與其他器件共享 SPI 匯流排段，但是可以使用外接的三態邏輯快取來解決這個問題。

資料傳輸

為了開始通訊，匯流排上的主裝置需要使用從裝置支援的頻率來組態時鐘，這個頻率最高為幾兆赫茲左右。然後主裝置將某個從裝置的 SS 線置為低電平，來選中這個從裝置。如果等待時間是必要的話（例如進行模數轉換），主裝置必須在這段時間結束後，才可以發出時鐘周期訊號。

在每個 SPI 時鐘周期內，都會發生全雙工資料傳輸。主裝置在 MOSI 線上傳送一個位，從裝置讀取它，同時從機在 MISO 線上傳送一位資料，主機讀取它。即使只有單向資料傳輸的目的，主從機之間的通訊工作方式仍然是雙工的。

傳輸通常會使用給定字長的兩個移位暫存器，一個在主裝置中，一個在從裝置中，這兩個暫存器連接成一個虛擬的環形緩衝區。資料通常先從最高位移出。在時鐘訊號邊沿，主機和從機均移出一位，然後在傳輸線上輸出給對方。在下一個時鐘沿，每個接收器都從傳輸線接受對方發出的資料位，並且從移位暫存器的最低位推入。每完成這樣一個移出 —— 推入的周期後，主機和從機就交換暫存器中的一位資料。當所有資料位都經過了這樣的移出 —— 推入過程後，主機和從機就完成了暫存器上的資料交換。如果需要交換的資料比暫存器的位數還要長的話，則需要重新載入移位暫存器並重複該過程。傳輸可能會持續任意數量的時鐘周期。完成後，主裝置會停止傳送時鐘訊號，並通常會取消選擇從裝置。

傳輸暫存器通常包含 8 位元。但是其他字長也很常見，例如觸控式螢幕控制器或音訊編解碼器通常採用 16 位元字長（如德州儀器的 TSC2101），許多數模轉換或者模數轉換的裝置則會採用 12 位元字長。

所有在匯流排上的沒有被片選線啟用的從裝置必須忽略輸入時鐘和 MOSI 訊號，並且不得從 MISO 傳送資料。

獨立的從裝置組態

在獨立的從裝置組態中，每個從裝置都有獨立的晶片選擇線。在一般情況下，要通過上拉電阻將片選線（ss 線）與電源連接起來，以減少器件之間的串擾。
由於從機的 MISO 引腳連接在一起，因此它們需要為三態引腳（高，低或高阻抗）。

中斷

SPI 從裝置有時會使用另一條訊號線將中斷訊號傳送到主裝置的 CPU。 例子包括來自觸控式螢幕感測器的筆下中斷，來自溫度感測器的熱限制警報，即時時鐘晶片發出的警報， SDIO 以及來自手機中聲音編解碼器的耳機插孔插入。 SPI 標準中並不包括中斷。 中斷的使用既不被禁止也不被標準規定。

SPI 代碼範例



優點和缺點

優點


* SPI 協定預設是全雙工通信。

* 與漏極開路輸出相反，SPI 的推輓輸出可提供良好的訊號完整性和高速度

* 比 I²C 或 SMBus 更高的傳輸頻寬 。 不限於任何最大時脈頻率，可實現高速執行

* 完整的傳輸位協定靈活性
  
* 不限於 8 位元字
  
* 任意選擇訊息大小，內容和目的地

* 簡單的線路連接
  
* 由於電路較少（包括上拉電阻），因此通常比 I²C 或 SMBus 的功耗要低，
  
* 沒有仲裁或相關的失敗模式
  
* 從站與主機使用同一時脈來源，不需要各自組態精密振盪器
  
* 從站不需要唯一的位址 - 不像 I²C 或 GPIB 或 SCSI
  
* 不需要收發器

* IC 封裝只使用四個引腳，而電路板布局或連接器則少於並列埠

* 每個器件至多有一個獨特的匯流排訊號（晶片選擇）; 其他訊號均可以共享

* 訊號是單向的，允許簡單的電氣隔離

* 軟體撰寫簡易

缺點


* 即使是三線式 SPI，也需要比 I²C 更多的 IC 線路

* 沒有帶內定址；共享匯流排上需要帶外片選訊號

* 從機不支援流控制 （但主機可以延遲下一個時鐘邊沿以降低傳輸速率）

* 不支援動態添加節點（熱插拔）。
  
* 沒有從機檢測機制，主機無法檢測是否與從機斷開。

* 通常只支援一個主裝置（取決於裝置的硬體實現）

* 沒有錯誤檢測機制，不像 I²C 在每個位元組後有回覆訊號

* 無法進行資料檢驗，不定義額外的協定時（如 CRC）無法保證數據正確性。

* 與 RS-232 ， RS-485 或 CAN 匯流排相比，它只能處理短距離內的資料傳輸。（距離可以通過使用收發器如 RS-422 進行擴充）

* 有許多現有的變體，使得很難找到支援這些變體的主機配接器等開發工具。
  
* 一些變體，如雙路 SPI ， 四路 SPI 和三線 SPI 是半雙工的。

* 必須通過帶外訊號來實現中斷，或者通過使用類似於 USB 1.1 和 2.0 的定期輪詢來類比中斷



參見


* I²C

* 網路匯流排列表



參考文獻



外部連結


* Introduction to Serial Peripheral Interface article on embedded.com

* Serial buses information page （頁面存檔備份，存於網際網路檔案館）

* SPI Introduction （頁面存檔備份，存於網際網路檔案館） with helpful diagrams

* Serial Flash Lots of good information on SPI part manufacturers and models.

* SPI - PICmicro Serial Peripheral Interface （頁面存檔備份，存於網際網路檔案館） Microchip (company) tutorial on SPI.