Mizar32/SPI
另一個常用的匯流排,用於連線同一電路板上的晶片或在同一箱體中有多個電路板的模組化設計中的晶片,是 SPI 匯流排,它代表序列外設介面,有時也稱為“四線”介面。
SPI 是一種同步序列資料鏈路,可以同時傳輸和接收資料,並且可以實現比 I2C 高得多的資料速率。它非常適合流資料應用程式,例如讀寫 SD 卡或傳送/接收音訊。正常頻率為數十兆赫茲,例如,一個常見的 8 引腳 32Mbit Atmel 資料快閃記憶體連線到 SPI 匯流排,可以在 66MHz 下工作。
沒有正式的 SPI 標準。該匯流排由摩托羅拉於 1985 年首次推出,並首次使用 M68HC11 微控制器進行了詳細說明。從那時起,它已被許多其他矽製造商採用,並且廣泛應用於嵌入式行業中許多不同的應用。例如,所有 SD 儲存卡都可以使用 SPI 介面。
SPI 匯流排實際應用的其他示例包括與模數轉換器、數模轉換器、數字感測器、EEPROM、快閃記憶體、觸控式螢幕控制器、數字電位器、即時時鐘、開關、序列埠控制器和 USB 控制器連線,或者簡單地在同一電路板中的不同微控制器之間建立點對點通訊。
SPI 是一種非常簡單的通訊協議,幾乎沒有高階協議,這意味著開銷非常小,並且資料可以以高速率雙向傳輸。
與 I2C 一樣,SPI 裝置也使用主從關係進行通訊,但不是透過在資料中傳送從裝置地址來選擇從裝置,而是使用一條額外線來選擇從裝置,這條線連線到每個從裝置,稱為晶片選擇訊號。
與 I2C 不同,每個 SPI 總線上只能有一個主裝置。
與 I2C 一樣,主裝置是傳送時鐘脈衝的裝置,但在每個脈衝期間,從主裝置到從裝置傳送 1 位資料,並且從從裝置到主裝置傳送 1 位資料。
SPI 使用 4 根線在主裝置和從裝置之間進行通訊。
- 時鐘 (SCLK)
- 主輸出從輸入 (MOSI)
- 主輸入從輸出 (MISO)
- 晶片選擇 (CS)
前三根線對總線上的所有裝置都是通用的,並且總線上的每個從裝置都有單獨的晶片選擇線。
例如,一個帶有單個從裝置的主裝置需要四根線:三根用於 SCLK、MOSI、MISO 和一根用於晶片選擇。
在獨立從裝置配置中,每個額外的從裝置都需要另一個 GPIO 引腳作為晶片選擇,以從主裝置選擇另一個從裝置。
除了以 MHz 為單位的時鐘頻率(對應於位元率)之外,您還必須相對於資料定義時鐘極性 (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 | 匯流排引腳 | eLua 名稱 | PicoLisp |
|---|---|---|---|---|
| SPI0_CS0 | PA10 | BUS1&3 引腳 12 | pio.PA_10 |
'PA_10
|
| SPI0_MISO | PA11 | BUS1&3 引腳 13 | pio.PA_11 |
'PA_11
|
| SPI0_MOSI | PA12 | BUS1&3 引腳 14 | pio.PA_12 |
'PA_12
|
| SPI0_SCK | PA13 | BUS1&3 引腳 15 | pio.PA_13 |
'PA_13
|
| SPI1_CS1 | PA18 | BUS3 引腳 11 | pio.PA_18 |
'PA_18
|
| SPI1_CS2 | PA19 | BUS4 引腳 12 | pio.PA_19 |
'PA_19
|
| SPI1_MISO | PA17 | BUS4 引腳 11 | pio.PA_17 |
'PA_17
|
| SPI1_MOSI | PA16 | BUS4 引腳 10 | pio.PA_16 |
'PA_16
|
| SPI1_SCK | PA15 | BUS4 引腳 9 | pio.PA_15 |
'PA_15
|
eLua 透過 SPI 讀取和寫入 SD 卡,並使用以 "/mmc/" 開頭的檔名,透過 Lua 的 io 模組訪問卡上的檔案。
在 PicoLisp 中,load 函式可用於從 SD 卡載入 Lisp 程式碼並在讀取評估迴圈中執行它。示例:(load "/mmc/lib.l" "/mmc/pilog.l")
Alcor6L 中包含一個 SPI 模組,用於進行低階 SPI 協議通訊,並假定它可以工作,但尚未測試。
可用函式列表
| 函式 | 返回值 | 描述 |
|---|---|---|
spi.setup(id, type, clock, cpol, cpha, databits) |
clock |
設定 SPI 介面 |
spi.sson(id) |
nil |
選擇 SPI 介面的 SS 線 (從機選擇) |
spi.ssoff(id) |
nil |
取消選擇 SPI 介面的 SS 線 (從機選擇) |
spi.write(id, data1, [data2], ..., [datan]) |
nil |
向 SPI 介面寫入一個或多個字串/數字 |
spi.readwrite(id, data1, [data2], ..., [datan]) |
一個數組 | 執行 spi.write 並返回從同一介面讀取的資料 |
可用函式列表
| 函式 | 返回值 | 描述 |
|---|---|---|
(spi-setup id type clock cpol cpha databits) |
clock |
設定 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 匯流排介面
- 第 23 節中 Atmel AT32UC3A 資料手冊:“序列外設介面”
- 維基百科 - 序列外設介面
- 第 eLua SPI 模組參考手冊;