序列外設介面（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 協議在主裝置和從裝置之間交換一個位元組的資料 Polarity and phase are assumed to be both 0 ie 輸入資料在 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 Shiftout a bit to the MOSI line write_MOSI byte_out bit HIGH LOW Delay for at least the peers setup time delay SPI_SCLK_LOW_TIME Pull the clock line high write_SCLK HIGH Shiftin a bit from the MISO line if read_MISO HIGH byte_in bit Delay for at least the peers 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）無法保證資料正確性。 與 RS232 ， RS485 或 CAN 匯流排相比，它只能處理短距離內的資料傳輸。（距離可以透過使用收發器如 RS422 進行擴充套件） 有許多現有的變體，使得很難找到支援這些變體的主機介面卡等開發工具。 一些變體，如雙路 SPI ， 四路 SPI 和三線 SPI 是半雙工的。 必須透過帶外訊號來實現中斷，或者透過使用類似於 USB 11 和 20 的定期輪詢來模擬中斷 參見 I²C 網路匯流排列表 參考文獻 外部連結 Introduction to Serial Peripheral Interface article on embeddedcom 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 How SPI simplify multidevice connections Category 序列匯流排