序列周邊介面

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
SPI匯流排:單一主機對單一從機
SPI匯流排:單一主機對複合從機

串行外設接口(Serial Peripheral Interface Bus,SPI),是一種用於晶片通信的同步串行通信接口規範,主要應用於單片機系統中。類似I²C。 這種接口首先由摩托羅拉公司於20世紀80年代中期開發,後發展成了行業規範。它的典型應用有快閃記憶體[1][2]EEPROMSD卡液晶顯示器

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線)與電源連接起來,以減少器件之間的串擾[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²CSMBus更高的傳輸頻寬 。 不限於任何最大時脈頻率,可實現高速運行
  • 完整的傳輸位協議靈活性
    • 不限於8位字
    • 任意選擇消息大小,內容和目的地
  • 簡單的線路連接
    • 由於電路較少(包括上拉電阻),因此通常比I²C或SMBus的功耗要低,
    • 沒有仲裁或相關的失敗模式
    • 從站與主機使用同一時脈來源,不需要各自配置精密振盪器
    • 從站不需要唯一的地址 - 不像I²CGPIBSCSI
    • 不需要收發器
  • IC封裝只使用四個引腳,而電路板布局或連接器則少於並行接口
  • 每個器件至多有一個獨特的總線信號(芯片選擇);其他信號均可以共享
  • 信號是單向的,允許簡單的電氣隔離
  • 軟體撰寫簡易

缺點[編輯]

  • 即使是三線式SPI,也需要比I²C更多的IC線路
  • 沒有帶內尋址; 共享總線上需要帶外片選信號
  • 從機不支持流控制 (但主機可以延遲下一個時鐘邊沿以降低傳輸速率)
  • 不支持動態添加節點(熱插拔)。
    • 沒有從機檢測機制,主機無法檢測是否與從機斷開。
  • 通常只支持一個主設備(取決於設備的硬體實現)
  • 沒有錯誤檢測機制,不像I²C在每個位元組後有回覆訊號
  • 無法進行數據檢驗,不定義額外的協議時(如CRC)無法保證數據正確性。
  • RS-232RS-485或CAN總線相比,它只能處理短距離內的數據傳輸。(距離可以通過使用收發器如RS-422進行擴展)
  • 有許多現有的變體,使得很難找到支持這些變體的主機適配器等開發工具。
  • 必須通過帶外信號來實現中斷,或者通過使用類似於USB 1.1和2.0的定期輪詢來模擬中斷

參見[編輯]

參考文獻[編輯]

  1. ^ 存档副本. [2020-09-10]. (原始內容存檔於2019-11-09). 
  2. ^ 存档副本. [2020-09-10]. (原始內容存檔於2019-04-30). 
  3. ^ Better SPI Bus Design in 3 Steps. [2021-01-01]. (原始內容存檔於2021-12-15) (英語). 

外部連結[編輯]