Hempl/SPI
另一個常用的匯流排,用於連線同一電路板上的晶片或在同一機箱內具有多個電路板的模組化設計中連線晶片,是 SPI 匯流排,它代表序列外設介面,有時也稱為“四線”介面。
SPI 是一種同步序列資料鏈路,它可以同時傳輸和接收資料,並且可以實現比 I2C 高得多的資料速率。它非常適合流式資料應用,例如讀取/寫入 SD 卡或傳送/接收音訊。正常頻率約為數十兆赫茲,例如,連線到 SPI 匯流排的常見 8 引腳 32 兆位 Atmel 資料快閃記憶體可以以 66 兆赫茲的頻率執行。
沒有正式的 SPI 標準。該匯流排首次由摩托羅拉於 1985 年推出,並在 M68HC11 微控制器中首次得到充分的文件記錄。此後,它已被許多其他矽製造商採用,並廣泛應用於嵌入式行業中的許多不同應用。例如,所有 SD 記憶體卡都可以使用 SPI 介面。
SPI 匯流排在現實世界中的其他應用示例包括連線模擬到數字轉換器、數字到模擬轉換器、數字感測器、EEPROM、快閃記憶體、觸控式螢幕控制器、數字電位器、即時時鐘、開關、序列埠控制器和 USB 控制器,或者只是在同一電路板中的不同微控制器之間建立點對點通訊。
SPI 是一種非常簡單的通訊協議,幾乎沒有高階協議,這意味著開銷非常小,資料可以以高速度雙向同時傳輸。
與 I2C 一樣,SPI 裝置也使用主從關係進行通訊,但它不是透過在資料中傳送從裝置地址來選擇從裝置,而是使用一條連線到每個從裝置的額外導線來選擇它,這條導線稱為片選訊號。
與 I2C 不同的是,每個 SPI 總線上只能有一個主裝置。
與 I2C 一樣,主裝置是傳送時鐘脈衝的裝置,但在每個脈衝期間,從主裝置到從裝置傳送 1 位資料,從從裝置到主裝置傳送 1 位資料。
為了詳細說明,SPI 使用 4 根導線在主裝置和從裝置之間進行通訊
- 時鐘 (SCLK)
- 主輸出從輸入 (MOSI)
- 主輸入從輸出 (MISO)
- 片選 (CS)
前三根導線對總線上所有裝置都是通用的,並且總線上每個從裝置都有一個單獨的片選導線。
例如,具有單個從裝置的主裝置需要 4 根導線:3 根用於 SCLK、MOSI、MISO 和 1 根用於片選。
在獨立從配置中,每個額外的從裝置需要另一個 GPIO 引腳作為片選,以從主裝置中選擇另一個從裝置。
除了以兆赫茲為單位的時鐘頻率(對應於位元率)之外,您還必須相對於資料定義時鐘極性 (CPOL) 和時鐘相位 (CPHA)。
SPI 通訊有 4 種模式,所選模式必須在任何時刻進行通訊的主裝置和從裝置之間對應。
- 模式 0,CPOL=0,CPHA=0
- 模式 1,CPOL=0,CPHA=1
- 模式 2,CPOL=1,CPHA=0
- 模式 3,CPOL=1,CPHA=1
通訊由主裝置啟動。它將自己的時鐘頻率配置為等於或小於它要與之通訊的從裝置支援的最大頻率。然後,透過將片選線拉低到低電平來選擇所需的從裝置,然後主裝置開始發出時鐘脈衝。
在每個時鐘週期內,兩個移位暫存器上都會進行全雙工資料傳輸。這意味著主裝置在 MOSI 線上傳送一位;從裝置從該同一線路讀取它,並且從裝置在 MISO 線上傳送一位,主裝置從該同一線路讀取它。
如果需要交換更多資料,則移位暫存器將載入新資料,並重復該過程。然後,當不再需要傳輸資料時,主裝置停止時鐘。
這基本上是 SPI 協議中定義的所有內容。SPI 未定義任何最大資料速率,也未定義任何特定的定址方案;它沒有確認機制來確認資料的接收,並且不提供任何流量控制。
主機板上的 AT32UC3A 片上系統包含兩個 SPI 介面,SPI0 和 SPI1,其中 SPI0 在左側總線上,SPI1 在右側總線上。每個介面都有四個片選線,最多允許使用八個 SPI 裝置;其中一個 (SPI1 CS0) 用於與 SD/MMC 卡通訊,其中三個 (SPI0 CS0 和 SPI1 CS1 和 CS2) 可在匯流排聯結器上使用。
| 訊號 | GPIO | 匯流排引腳 | PicoLisp |
|---|---|---|---|
| SPI0_CS0 | PA10 | BUS1&3 引腳 12 | 'PA_10
|
| SPI0_MISO | PA11 | BUS1&3 引腳 13 | 'PA_11
|
| SPI0_MOSI | PA12 | BUS1&3 引腳 14 | 'PA_12
|
| SPI0_SCK | PA13 | BUS1&3 引腳 15 | 'PA_13
|
| SPI1_CS1 | PA18 | BUS3 引腳 11 | 'PA_18
|
| SPI1_CS2 | PA19 | BUS4 引腳 12 | 'PA_19
|
| SPI1_MISO | PA17 | BUS4 引腳 11 | 'PA_17
|
| SPI1_MOSI | PA16 | BUS4 引腳 10 | 'PA_16
|
| SPI1_SCK | PA15 | BUS4 引腳 9 | 'PA_15
|
Hempl 透過 SPI 讀取和寫入 SD 卡,並提供對卡上檔案的訪問。在 PicoLisp 中,load 函式可用於從 SD 卡載入 Lisp 程式碼並在讀取-評估迴圈中執行它。請注意,檔名以 "/mmc/" 開頭。例如:(load "/mmc/lib.l" "/mmc/pilog.l")
Alcor6L 中包含一個 SPI 模組,用於進行低階 SPI 協議通訊,並假定它可以工作,但尚未經過測試。
可用函式列表
| 函式 | 返回值 | 描述 |
|---|---|---|
(spi-setup id type clock cpol cpha databits) |
時鐘 |
設定 SPI 介面 |
(spi-sson id) |
Nil |
選擇 SPI 介面的 SS 線(從裝置選擇) |
(spi-ssoff id) |
Nil |
取消選擇 SPI 介面的 SS 線(從裝置選擇) |
(spi-write id 'any) |
最後一個寫入的值 | 向 SPI 介面寫入一個或多個字串/數字 |
(spi-readwrite id 'any) |
不適用 | 尚未實現:請參見 問題 #13 |
- 序列外設介面簡介,David Kalinsky 和 Roee Kalinsky,發表在 Embedded 的電子部落格中,2002 年 2 月 1 日。
- EEHerald 的嵌入式系統線上課程,模組 12:SPI 匯流排介面
- Atmel AT32UC3A 資料手冊,第 23 節:“序列外設介面”
- 維基百科 - 序列外設介面