序列周邊介面
串行外設介面(Serial Peripheral Interface Bus,SPI),是一種用於晶片通訊的同步串行通訊介面規範,主要應用於單晶片系統中的訊號傳遞。類似的技術還有I²C等。 摩托羅拉公司於20世紀80年代中期首先開發出此傳輸介面,之後逐漸發展為行業規範之一。它的典型應用有快閃記憶體[1][2]、EEPROM、SD卡與液晶顯示器。
![]() |
![](http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/SPI_three_slaves.svg/300px-SPI_three_slaves.svg.png)
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線)與電源連接起來,以減少器件之間的串擾[3]。 由於從機的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位元字
- 任意選擇訊息大小,內容和目的地
- 簡單的線路連接
- IC封裝只使用四個引腳,而電路板佈局或連接器則少於並列埠
- 每個器件至多有一個獨特的匯流排訊號(晶片選擇);其他訊號均可以共用
- 訊號是單向的,允許簡單的電氣隔離
- 軟件撰寫簡易
缺點
編輯- 即使是三線式SPI,也需要比I²C更多的IC線路
- 沒有帶內定址; 共用匯流排上需要帶外片選訊號
- 從機不支援流控制 (但主機可以延遲下一個時鐘邊沿以降低傳輸速率)
- 不支援動態添加節點(熱插拔)。
- 沒有從機檢測機制,主機無法檢測是否與從機斷開。
- 通常只支援一個主裝置(取決於裝置的硬件實現)
- 沒有錯誤檢測機制,不像I²C在每個位元組後有回覆訊號
- 無法進行數據檢驗,不定義額外的協定時(如CRC)無法保證數據正確性。
- 與RS-232 , RS-485或CAN匯流排相比,它只能處理短距離內的數據傳輸。(距離可以通過使用收發器如RS-422進行擴充)
- 有許多現有的變體,使得很難找到支援這些變體的主機配接器等開發工具。
- 必須通過帶外訊號來實現中斷,或者通過使用類似於USB 1.1和2.0的定期輪詢來模擬中斷
參見
編輯參考文獻
編輯外部連結
編輯- 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.
- How SPI simplify multi-device connections (頁面存檔備份,存於互聯網檔案館)