SPI (Serial Peripheral Interface)

来源:互联网 发布:党员做优化发展环境 编辑:程序博客网 时间:2024/04/27 14:44

原文链接:http://magicjackting.pixnet.net/blog/post/164725144

隨著科技的演進, 在單晶片微控制器及 SoC 的領域中, SPI 及 I2C 這二種串列 (序列) 介面變得十分常見. 這二者與主機間通訊用的非同步串列通訊埠 RS-232 (UART) 非常不一樣

  • 二個都是同步傳輸介面, 主要是用於 CPU 和週邊晶片之間.
  • SPI 及 I2C 二者設計的主要目的在於減少 CPU 和週邊晶片之間的接腳數.
  • SPI 一般需要 4 條接線 (至少三條), 而 I2C 則只要二條線, 這和早期常用的並列匯流排動輒十數條接線有著明顯的差異.
  • SPI 的硬體結構簡單而且傳輸速度快, 一般是 5M/10M/20Mbps 或是更快 (可以到 200Mbps), I2C 的傳輸速度則只有 100Kbps/400Kbps/1Mbps(/3.4Mbps/單向5Mbps).
  • SPI 是全雙工, I2C 則是半雙工.
  • SPI 使用硬體線路來指定 slave 晶片, I2C 則在傳送的第一個位元組上指定 (7bit位址).
  • SPI 不提供交握機制, 無法確認 slave 晶片是否有跟上. I2C 則有雙向的確認機制.

本篇介紹的是 SPI 介面



SPI 簡介


SPI 是 Serial Preipheral Interface 的縮寫, 中文意思是串列週邊介面, 該介面是由 Motorola 公司設計發展的高速同步串列介面, 原先是應用在其 68xx 系列的 8 位元處理器上 (1985 年首次出現在 M68HC11 處理器上, 並提供了完整之說明文件), 用以連接 ADC, DAC, EEPROM, 通訊傳輸 IC...等週邊晶片. 由於具備有低接腳數, 結構單純, 傳輸速度快, 簡單易用...等特性, 目前已經成為業界慣用標準: 不只是單晶片微控制器上有, 許多新的 SoC 晶片直接就支援多組 SPI 介面, 甚至普及到連模組化的產品 (如: 手機用的 LCD 模組 (SDI 介面), 相機模組) 及 3C 產品 (如: 數位相機用的記憶卡) 也都是使用 SPI 介面.

註:早期數位相機用的 MMC (Multi Media Card) 記憶卡是直接使用 SPI 相容的介面, 新式的 SD 卡為了加快傳輸速度雖然擴充了接腳定義, 但也還保留了舊式 SPI 介面相容的模式. 參看How to Use MMC/SDC

SPI 架構及介面接腳


SPI 為一主從式架構, 通常有一個 Master (主設備) 和一個 (或多個) Slave (從設備). 介接方法及內部硬體結構很簡單, 如下面的示意圖:



介面上總共有 4 支接腳:

SPI 接腳名稱及意義接腳名稱中文說明MOSI主出從入master 數據輸出, slave 數據輸入MISO主入從出master 數據輸入, slave 數據輸出SCLK時脈訊號時脈信號, 由 master 產生並控制/SS晶片致能slave 選擇信號, 由 master 控制. slave 只有在 /SS 信號為低電位時, 才會對 master 的操作指令有反應.

介接時只要把相同名稱接腳接在一起即可

SPI 的接腳有另一套常用的名稱:

  • SDO: Serial Data Out, 資料輸出 (不分主從)
  • SDI: Serial Data In, 資料輸入 (不分主從)
  • SCK: 對應 SCLK
  • /CS: 對應 /SS

由於這種標示方法不分主從, 資料輸出都是 SDO, 資料輸入都是 SDI, 所以介接時必需把二個設備的 SDOSDI 接腳對接: master 的 SDO 接到 slave 的 SDI, master 的SDI 接到 slave 的 SDO.

在實際應用上, 如果不需要由 slave 讀回資料時 (如: Output Port Expander, 或者 DAC 晶片), 則 MISO 接腳可以省略. 有看到一部份資料說: 只有一主一從時,/SS 訊號可以省略, 只要將 slave 的 /SS 直接接地即可. 對某些 slave 晶片來說這是不對的, 因為有些 slave 晶片會拿/SS 訊號的下降緣來識別 master 送來的第一個 bit. 這是非常重要的錯誤回復機制, 遇到這類 slave 晶片只把/SS 接腳直接接地是不會動作的. 另外後述的 Daisy-Chain 接法也需要這個 /SS 訊號的上昇緣才能運作. Daisy-Chain 模式用它 (/SS 訊號的上昇緣) 來栓鎖指令, 如此多個晶片才能同時載入不同的指令.

由上面的結構示意圖, 我們很清楚的看出它其實是利用二組頭尾相連的位移暫存器 (Shift Rigister) 來完成 master 和 slave 之間的資料交換, 而且是接收與發送同時進行 (全雙工). 而SCLK 就是用來控制二者同步位移的時脈信號, 它是由 master 產生送出給雙方的位移暫存器. 這樣子的結構允許資料一位元一位元的傳送, 可快可慢, 甚至允許暫停, 因為SCLK 沒有變動時, 雙方的 shift register 是不會有動作的. 所以如果你的微控制器沒有硬體式的 SPI 可以用, 直接用軟體加一般的 GPIO 接腳, 就可以模擬 SPI master. (用軟體模擬 SPI slave 則不建議, 因為如果我們不知道對方會送多快的SCLK).

在介接方面, 除了簡單的一主一從架構之外, SPI 也可以一個 master 連接多個 slave. 接法上有二種, 一種是利用多條獨立的 /SS 訊號, 另一種則利用 Daisy-Chain 的方式.



使用 Daisy-Chain 的方法, 不需要額外的硬體接腳來擴充/SS 訊號, 但是傳送及接收程式需要大改, 非常的麻煩. 另外還有一個障礙是, slave 晶片必需在同一個模式下工作, 還有也不能有接腳缺省的情形 (有許多 DAC 晶片沒有MISO 接腳), 也因此常見的應用 Daisy-Chain 的例子都是用來串連多個同一型號的晶片, 例如: 需要多組 DAC 或者是 ADC 一起工作的情況.

Daisy-Chain 的運作方法是以倍數擴充每次傳輸的指令/資料長度 (有二個晶片串在一起, 傳輸長度就 x2; 三個晶片串在一起, 傳輸長度就 x3). 由於上一顆晶片的MISO 是連接到下一顆晶片 MOSI, 所以多出來的傳輸訊號很自然把先前的訊號擠出來, 送到下一顆晶片. 等到所有訊號都送出去了, 再來就是利用/SS 訊號的上昇緣來通知每一顆晶片: 要給你的指令/資料已經準備好了, 請把它栓鎖 (latch) 起來了. 同樣的讀回資料也會串在一起. 所以原本的驅動程式必需把要給各個晶片的指令暫存起來然後依晶片串連的次序將指令串起來再送出, 收回來的資料也必需先裁切好再依晶片串連的次序分配給對應的接收單元.

是故比較常用的是多條獨立的 /SS 訊號. 有的 master 晶片是直接提供額外的 /SS1, /SS2,/SS3...等接腳. 有的則需要利用原本的 /SS 再以一組 3to8 解碼器 (或者是 4to16 解碼器) 配合 3~4 條 GPIO 接腳來產生需要的多組/SS. 更有的 SoC 乾脆提供多組 SPI 單元及多條獨立的 /SS 訊號 (當然的, 代價是晶片的接腳數比較多, 單價拉高.).

SPI 工作模式及時序圖


使用 SPI, 最麻煩一件事是確認周邊晶片的工作模式. SPI 一共有 4 種工作模式, 但這 4 種模式的時序圖差異非常小, 常令初學者 '霧剎剎' 抓不到重點. 如下圖:



上圖的上半部是 SCLK 的時序, 有兩種選擇: CPOL=0 或者 CPOL=1. 中間及下半部是MOSI MISO 的時序, 一樣是有兩種選擇: 中間是 MOSI MISO 是在SCLK奇數次變化栓鎖資料, 下半部則是 MOSI MISO 是在SCLK偶數次變化栓鎖資料.

解說:

  • SPI slave 晶片一般只支援一種工作模式, 所以通常 master 必需牽就 slave 把工作模式設成和 slave 一致, 才能正常運作. (因為二者內部均是位移暫存器, 所以MOSIMISO 的時序需求是一樣)
  • 首先, 第一個不同是 SCLK 的極性 (polarity), 所謂極性其實是指 SPI 不工作時, SCLK 是停留在高電位還是低電位.CPOL=0 是 SCLK 在不工作時停留在低電位, CPOL=1 則是停留在高電位.
  • 再來要注意 slave 晶片是在 SCLK下降緣栓鎖資料, 還是在 SCLK 的上升緣. 要讓對方栓鎖資料, 我們就必需把資料 Hold 住, 保持穩定, 所以 Slave 晶片在SCLK下降緣栓鎖資料, 相對的 master 就必需要在上升緣送出資料. 反之, slave 晶片在SCLK 的上升緣栓鎖資料, 相對的 master 就必需要在下降緣送出資料.
  • 但是 CPHA 的定義並不是依上升緣/下降緣. CPHA 設定的是晶片栓鎖資料的時機是在/SS 訊號下降之後, SCLK奇數次變化 (CPHA=0), 還是偶數次變化 (CPHA=1).
  • 所以 CPHA 配合 CPOL (SCLK 的極性) 設定, 組合起來一共有 4 種工作模式. 不過模式的命名順序出現了分歧沒有統一, 現有的晶片出現了二種順序 (參閱 Wiki 網站Serial Peripheral Interface Bus). 所以撰寫程式時不要只是把 Mode 設成相同的數值, 小心 master 晶片和 slave 晶片二者的模式順序不同. 不過仔細對照一下, 差異只有 mode 的數值不同而已,CPOLCPHA 的定義並無不同.SPI ModeMode # of
    Model AMode # of
    Model BCPOLCPHA資料栓鎖時機MISO MOSI
    時序圖10CPOL=0CPHA=0奇數上升緣上半組01CPOL=0CPHA=1偶數次下降緣下半組32CPOL=1CPHA=0奇數次下降緣上半組23CPOL=1CPHA=1偶數次上升緣下半組Model A: For ARM-based and Microchip PIC
    Model B: 其他
  • 一旦正確辨識出 slave 晶片的工作模式, 只要把 master 設定成一樣的工作模式即可正確的傳送指令及接收資料.

結語


總結一下辨識的技巧:

  • 先確認 slave 晶片需求的 SCLK 極性, 不工作時是在低電位還是高電位, 由此確認 CPOL 為 0 或 1.
  • 再由 slave 晶片 datasheet 中的時序圖確認 slave 晶片是在 SCLK下降緣栓鎖資料, 還是在SCLK上升緣.
  • 直接比對上面的模式表, 確認出 CPHA 值為 0 或 1.
  • 確認傳輸時序圖是否正確 (是奇數組 SCLK 變化, 還是偶數組 SCLK 變化)

還有一點在圖中有標示, 但上文沒有提到的是: SPI 的資料是 msb (Most Significant Bit)bit7 (MSB) 先傳, 如果你是用軟體來模擬 SPI master 需注意到這一點.

另外 SPI 只是硬體的傳輸協定, 完全沒有提及定址(選擇晶片/暫存器位址), 指令, 資料長度...等等, 這一部份是完全由 salve 晶片制定, master 想要控制 slave 動作必需完全依據 slave 晶片 datasheet 上的規範.

好了, 實例資料現下沒有時間整理, 以後整理好了再補充.

0 0
原创粉丝点击