序列周邊介面

SPI匯流排：單一主機對複合從機
串行外設接口（Serial Peripheral Interface Bus，SPI），是一種用於晶片通信的同步串行通信接口規範，主要應用於單片機系統中的訊號傳遞。類似的技術還有I²C等。
摩托羅拉公司於20世紀80年代中期首先開發出此傳輸介面，之後逐漸發展為行業規範之一。它的典型應用有快閃記憶體、EEPROM、SD卡與液晶顯示器。
SPI設備之間使用全雙工模式通信，是一個主機和一個或多個從機的主從模式。主機負責初始化幀，這個數據傳輸幀可以用於讀與寫兩種操作，Chip select線路可以從多個從機選擇一個來響應主機的請求。
有時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協議在主設備和從設備之間交換一個字節的數據- Polarity and phase are assumed to be both 0, i.e.:-   - 輸入數據在SCLK的上升沿捕獲。-   - 輸出數據在SCLK的下降沿傳播。- 返回接收到的一字節的數據
*/
uint8_t SPI_transfer_byte(uint8_t byte_out)
{
uint8_t byte_in = 0;
uint8_t bit;
for (bit = 0x80; bit; bit >>= 1) {
/* Shift-out a bit to the MOSI line */
write_MOSI((byte_out & bit) ? HIGH : LOW);
/* Delay for at least the peer's setup time */
delay(SPI_SCLK_LOW_TIME);
/* Pull the clock line high */
write_SCLK(HIGH);
/* Shift-in a bit from the MISO line */
if (read_MISO() == HIGH)
byte_in |= bit;
/* Delay for at least the peer's hold time */
delay(SPI_SCLK_HIGH_TIME);
/* Pull the clock line low */
write_SCLK(LOW);
}
return byte_in;
}

**優點和缺點**

**優點**
 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 date=20080719114000 -  SPI Introduction date=20111209052907  with helpful diagrams-  Serial Flash Lots of good information on SPI part manufacturers and models.-  SPI - PICmicro Serial Peripheral Interface date=20120110124309  Microchip (company) tutorial on SPI.-  How SPI simplify multi-device connections date=20240708204811