Linux SPI匯流排和裝置驅動架構之一:系統概述
阿新 • • 發佈:2018-12-31
SPI是"Serial Peripheral Interface" 的縮寫,是一種四線制的同步序列通訊介面,用來連線微控制器、感測器、儲存裝置,SPI裝置分為主裝置和從裝置兩種,用於通訊和控制的四根線分別是:
- CS 片選訊號
- SCK 時鐘訊號
- MISO 主裝置的資料輸入、從裝置的資料輸出腳
- MOSI 主裝置的資料輸出、從裝置的資料輸入腳
/*****************************************************************************************************/
宣告:本博內容均由 http://blog.csdn.net/droidphone原創,轉載請註明出處,謝謝!
/*****************************************************************************************************/
硬體結構
通常,負責發出時鐘訊號的裝置我們稱之為主裝置,另一方則作為從裝置,下圖是一個SPI系統的硬體連線示例:圖1.1 SPI硬體結構圖 如上圖所示,主裝置對應SOC晶片中的SPI控制器,通常,一個SOC中可能存在多個SPI控制器,像上面的例子所示,SOC晶片中有3個SPI控制器。每個控制器下可以連線多個SPI從裝置,每個從裝置有各自獨立的CS引腳。每個從裝置共享另外3個訊號引腳:SCK、MISO、MOSI。任何時刻,只有一個CS引腳處於有效狀態,與該有效CS引腳連線的裝置此時可以與主裝置(SPI控制器)通訊,其它的從裝置處於等待狀態,並且它們的3個引腳必須處於高阻狀態。
工作時序
我們用CPOL表示時鐘訊號的初始電平的狀態,CPOL為0表示時鐘訊號初始狀態為低電平,為1表示時鐘訊號的初始電平是高電平。另外,我們用CPHA來表示在那個時鐘沿取樣資料,CPHA為0表示在首個時鐘變化沿取樣資料,而CPHA為1則表示要在第二個時鐘變化沿來取樣資料。核心用CPOL和CPHA的組合來表示當前SPI需要的工作模式:
- CPOL=0,CPHA=1 模式0
- CPOL=0,CPHA=1 模式1
- CPOL=1,CPHA=0 模式2
- CPOL=1,CPHA=1 模式3
軟體架構
在核心的SPI驅動的軟體架構中,進行了合理的分層和抽象,如下圖所示:圖2.1 SPI驅動的軟體架構
SPI控制器驅動程式
SPI控制器不用關心裝置的具體功能,它只負責把上層協議驅動準備好的資料按SPI匯流排的時序要求傳送給SPI裝置,同時把從裝置收到的資料返回給上層的協議驅動,因此,核心把SPI控制器的驅動程式獨立出來。SPI控制器驅動負責控制具體的控制器硬體,諸如DMA和中斷操作等等,因為多個上層的協議驅動可能會通過控制器請求資料傳輸操作,所以,SPI控制器驅動同時也要負責對這些請求進行佇列管理,保證先進先出的原則。SPI通用介面封裝層
為了簡化SPI驅動程式的程式設計工作,同時也為了降低協議驅動程式和控制器驅動程式的耦合程度,核心把控制器驅動和協議驅動的一些通用操作封裝成標準的介面,加上一些通用的邏輯處理操作,組成了SPI通用介面封裝層。這樣的好處是,對於控制器驅動程式,只要實現標準的介面回撥API,並把它註冊到通用介面層即可,無需直接和協議層驅動程式進行互動。而對於協議層驅動來說,只需通過通用介面層提供的API即可完成裝置和驅動的註冊,並通過通用介面層的API完成資料的傳輸,無需關注SPI控制器驅動的實現細節。