SPI (Serial Peripheral Interface) 是一種串列式的 I/O 介面,時脈約 1~ 70MHz,在微控制器和低速裝置之間提供一個低成本、易使用的介面,進行同步串行資料傳輸,包括 FLASH, ADC, PLL, RTC, LIU, CODEC... 都可以用 SPI 介面來控制。
SPI 相當容易實作, 但各家採用的 SPI 又不盡相同, 有正緣、負緣、傳輸的數據為 8-bit、16-bit、四線、三線... 多種變形。要將每一種都實作一遍也不難, 但如何能夠共用模組, 減少重複的驗證及除錯, 避免 re-invent the wheel 才是工程師不得多花一點心思的地方。
一種四線制串列匯流排介面,為主 / 從結構,四條導線分別為
串列時脈 (SCLK/SCK) - 時鐘信號,由主裝置產生
主出從入 (MOSI) - 主裝置資料輸出,從裝置資料輸入 (Master Output Slave Input)
主入從出 (MISO)- 主裝置資料輸入,從裝置資料輸出 (Slave Output Master Input)
從選 (SS) 訊號 - 從裝置 Enable 信號,由主裝置控制 (Slave Single)
主元件為時脈提供者,可發起讀取從元件或寫入從元件作業。這時主元件將與一個從元件進行對話。當匯流排上存在多個從元件時,要發起一次傳輸,主元件將把該從元件選擇線拉低,然後分別透過 MOSI 和 MISO 線路啟動數據發送或接收。
SPI 總線工作方式
SPI 總線有四種工作方式,其中使用的最為廣泛的是 SPI0 和 SPI3 方式(實線表示):
時序詳解:
CPOL:時鐘極性 (Polarity) 選擇
為 0 時 SPI 總線空閒為低電位
為 1 時 SPI 總線空閒為高電位
CPHA:時鐘相位 (Phase) 選擇為 0 時在 SCK 第一個周期 MISO 輸入
為 1 時在 SCK 第二個周期 MISO 輸入
當 CPHA=0、CPOL=0 時
MISO 引腳上的資料在第一個 SPSCK 周期之前已經輸入了,而為了保證正確傳輸,MOSI 引腳的 MSB 位必須與SPSCK 的第一個周期邊緣同步
在 SPI 傳輸過程中,首先將資料輸入,然後在同步時鐘信號的正緣觸發時,SPI 的接收方捕捉位信號,在 clock 信號的一個週期結束時 (負緣觸發),下一筆資料輸入,再重複上述過程,直到一個字元的 8 位信號傳輸結束。
當 CPHA=0、CPOL=1 時
與前者唯一不同之處只是在同步 clock 信號的負緣觸發信號,正緣觸發時,下一筆資料輸入
當 CPHA=1、CPOL=0 時
MISO 引腳和 MOSI 引腳上的資料的 MSB 位必須與 SPSCK 的第一個邊沿同步,在 SPI 傳輸過程中,在同步 clock 信號週期開始時 (正緣觸發) 資料輸入,然後在同步 clock 信號的負緣觸發時,SPI 的接收方捕捉位信號,在 clock 信號的一個週期結束時 (正緣觸發),下一筆資料輸入,再重複上述過程,直到一個字元的 8 位信號傳輸結束。
當 CPHA=1、CPOL=1 時
與前者唯一不同之處只是在同步時鐘信號的正緣觸發,負緣觸發信號時,下一筆資料輸入
參考
kernel/Documentation/spi/spi-summary (Salve Devices)
http://ww2.cs.fsu.edu/~rosentha/linux/2.6.26.5/docs/DocBook/kernel-api/ch25.html
http://www.eettaiwan.com/SEARCH/ART/SPI.HTM
http://tw.myblog.yahoo.com/louis99lin/article?mid=109&prev=117&next=-1
http://avr.eefocus.com/article/10-08/2075521282652436.html
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
No comments:
Post a Comment