本頁使用了標題或全文手工轉換

序列周邊介面

維基百科,自由的百科全書
跳到: 導覽搜尋
SPI總線:單一主機對單一從機
SPI總線:單一主機對複合從機

串行外設介面(Serial Peripheral Interface Bus,SPI),是一種用於短程通訊的同步串行通訊介面規範,主要應用於單晶片系統中。類似I²C。 這種介面首先被Motorola(摩托羅拉)公司開發,然後發展成了一種行業規範。典型應用包含SD卡和液晶顯示器。 SPI裝置之間使用全雙工模式通訊,包含一個主機和一個或多個從機。主機產生待讀或待寫的幀數據,多個從機通過一個片選線路 決定哪個來響應主機的請求。 有時SPI介面被稱作四線程介面,SPI準確來講稱為同步串列埠,但是與同步串列埠協定(SSI)不同,SSI是一個四線程 同步通訊協定,但是使用差分訊號輸入同時僅提供一個單工通訊信道。

介面[編輯]

SPI總線規定了4個保留邏輯訊號介面:

  • SCLK(Serial Clock):串行時鐘,由主機發出
  • MOSI(Master Output,Slave Input):主機輸出從機輸入訊號,由主機發出
  • MISO(Master Input,Slave Output):主機輸入從機輸出訊號,由從機發出
  • SS(Slave Selected):選擇訊號,由主機發出,一般是低電位有效

儘管上面的引腳名稱是最常用的,但在過去,有時會使用其他引腳命名約定,因此舊IC產品的SPI埠引腳名稱可能有所不同。

操作[編輯]

SPI總線可以在有單個主裝置與一個或多個從裝置的情況下執行。

如果使用單個從裝置,則如果從裝置允許,SS引腳可以固定為邏輯低電平。 一些從裝置需要片選訊號的下降沿來啟動一個動作。 Maxim MAX1242 ADC就是一個例子,它在高→低轉換時開始轉換。 對於多個從裝置,每個從裝置都需要一個獨立的SS訊號。

大多數從屬裝置​​具有三態輸出的特性,所以當器件未被選中時,它們的MISO訊號變為高阻抗 ( 邏輯斷開 )。 沒有三態輸出的器件不能與其他器件共享SPI總線段; 只有一個這樣的從裝置可以與主裝置交換資訊。

數據傳輸[編輯]

為了開始通訊,總線上的主裝置需要使用從裝置支援的頻率來配置時鐘,通常是幾個MHz。 然後主裝置將某根連線到從裝置SS的線上的訊號置為0來選中這個從裝置。 如果需要等待一段時間(例如進行模數轉換),主器件在發出時鐘周期之前必須至少等待這段時間。

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

傳輸通常會使用到給定字長的兩個移位暫存器,一個在主裝置中,一個在從裝置中; 它們以虛擬環形拓撲連線。 數據通常先移出最大的位。 在時鐘邊沿,主機和從機均移出一位,然後在傳輸線上輸出給對方。 在下一個時鐘沿,每個接收器都從傳輸線接受該位,並設定為移位暫存器的新的最低有效位。 在完成這樣一個移出-移入的周期後,主機和從機就交換暫存器中的一位。 如果需要更多的數據交換,則需要重新載入移位暫存器並重複該過程。 傳輸可能會持續任意數量的時鐘周期。 完成後,主裝置會停止切換時鐘訊號,並通常會取消選擇從裝置。

傳輸暫存器通常包含8位元。 但是,其他字長也很常見,例如,用於輕觸式熒幕控制器或音訊編解碼器的16位元(如德州儀器的TSC2101),或者用於許多數字-模擬或模擬-數字轉換的12位元。

未使用片選線啟用的總線上的每個從裝置必須忽略輸入時鐘和MOSI訊號,並且不得驅動MISO。

獨立的從裝置配置[編輯]

在獨立的從裝置配置中,每個從裝置都有獨立的晶片選擇線。 強烈建議在每個獨立器件上使用電源和片選線之間使用上拉電阻,以減少器件之間的串擾。 這是SPI通常被使用的方式。 由於從機的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協定預設是全雙工通訊。
  • 推挽式驅動器 (與開路漏極相反)可提供良好的訊號完整性和高速度
  • 比I²C或SMBus更高的吞吐量 。 不限於任何最大時鐘速度,可實現高速執行
  • 完整的傳輸位協定靈活性
    • 不限於8位元字
    • 訊息大小,內容和目的的任意選擇
  • 非常簡單的硬件介面
  • 由於電路較少(包括上拉電阻),因此通常比I²C或SMBus的功耗要低,
  • 沒有仲裁或相關的失敗模式
  • 從裝置直接使用主時鐘,不需要精密振盪器
  • 從站不需要唯一的地址 - 不像I²CGPIBSCSI
  • 不需要收發器
  • IC封裝只使用四個引腳,而電路板佈局或連結器則少於並列埠
  • 每個器件至多有一個獨特的總線訊號(晶片選擇);其他訊號均可以共享
  • 訊號是單向的,允許簡單的電偶分離
  • 簡單的軟件實現

缺點[編輯]

  • 即使是三線式SPI,也需要比I²C更多的IC封裝引腳
  • 沒有帶內尋址; 共享總線上需要帶外片選訊號
  • 從機沒有硬件流量控制 (但主機可以延遲下一個時鐘邊沿以降低傳輸速率)
  • 沒有硬件從裝置確認(主機可能無法傳輸並且不知道這一點)
  • 通常只支援一個主裝置(取決於裝置的硬件實現)
  • 沒有定義錯誤檢查協定
  • 沒有正式的標準,驗證一致性是不可能的
  • RS-232RS-485或CAN總線相比,它只能處理短距離內的數據傳輸。 (距離可以通過使用收發器如RS-422進行擴充功能)
  • 有許多現有的變體,使得很難找到支援這些變體的主機介面卡等開發工具
  • SPI不支援熱交換 (動態添加節點)。
  • 中斷必須通過帶外訊號來實現,或者通過使用類似於USB 1.1和2.0的定期輪詢來偽造
  • 一些變體,如雙路SPI四路SPI三線SPI是半雙工的。

參見[編輯]

外部連結[編輯]

注意事項[編輯]

本文由SPI的英文版面翻譯而來以便語言不通的讀者參考,詳細內容請參閱英文版面。 原作者享有著作權,翻譯者享有翻譯版權。 該翻譯僅包含綱要,歡迎完善補充。