-
序列周邊接口
鎖定
- 中文名
- 序列周邊接口
- 外文名
- Serial Peripheral Interface Bus,SPI
- 別 名
- 序列周邊接口
序列周邊接口簡介
這種接口首先被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²C或GPIB或SCSI
- 不需要收發器
- IC封裝只使用四個引腳,而電路板佈局或連接器則少於並行接口
- 每個器件至多有一個獨特的總線信號(芯片選擇);其他信號均可以共享
- 信號是單向的,允許簡單的電偶分離
- 簡單的軟件實現
序列周邊接口缺點
- 即使是三線式SPI,也需要比I²C更多的IC封裝引腳
- 沒有帶內尋址; 共享總線上需要帶外片選信號
- 從機沒有硬件流量控制 (但主機可以延遲下一個時鐘邊沿以降低傳輸速率)
- 沒有硬件從設備確認(主機可能無法傳輸並且不知道這一點)
- 通常只支持一個主設備(取決於設備的硬件實現)
- 沒有定義錯誤檢查協議
- 沒有正式的標準,驗證一致性是不可能的
- 有許多現有的變體,使得很難找到支持這些變體的主機適配器等開發工具
- SPI不支持熱交換(動態添加節點)。
- 中斷必須通過帶外信號來實現,或者通過使用類似於USB 1.1和2.0的定期輪詢來偽造
- 一些變體,如雙路SPI , 四路SPI和三線SPI是半雙工的。
- 參考資料
-
- 1. Introduction to SerialPeripheral Interface .百度學術[引用日期2018-07-30]