串行外设接口总线

**串行外設介面**（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.