SPI是"Serial Peripheral Interface" 的縮寫,是一種四線制的同步串行通信接口,用來連接微控制器、傳感器、存儲設備,SPI設備分為主設備和從設備兩種,用于通信和控制的四根線分別是:
·CS 片選信號
·SCK 時鐘信號
·MISO 主設備的數(shù)據(jù)輸入、從設備的數(shù)據(jù)輸出腳
·MOSI 主設備的數(shù)據(jù)輸出、從設備的數(shù)據(jù)輸入腳
硬件結(jié)構
通常,負責發(fā)出時鐘信號的設備我們稱之為主設備,另一方則作為從設備,下圖是一個SPI系統(tǒng)的硬件連接示例:

圖1.1 SPI硬件結(jié)構圖
如上圖所示,主設備對應SOC芯片中的SPI控制器,通常,一個SOC中可能存在多個SPI控制器,像上面的例子所示,SOC芯片中有3個SPI控制器。每個控制器下可以連接多個SPI從設備,每個從設備有各自獨立的CS引腳。每個從設備共享另外3個信號引腳:SCK、MISO、MOSI。任何時刻,只有一個CS引腳處于有效狀態(tài),與該有效CS引腳連接的設備此時可以與主設備(SPI控制器)通信,其它的從設備處于等待狀態(tài),并且它們的3個引腳必須處于高阻狀態(tài)。
工作時序
按照時鐘信號和數(shù)據(jù)信號之間的相位關系,SPI有4種工作時序模式:

我們用CPOL表示時鐘信號的初始電平的狀態(tài),CPOL為0表示時鐘信號初始狀態(tài)為低電平,為1表示時鐘信號的初始電平是高電平。另外,我們用CPHA來表示在那個時鐘沿采樣數(shù)據(jù),CPHA為0表示在首個時鐘變化沿采樣數(shù)據(jù),而CPHA為1則表示要在第二個時鐘變化沿來采樣數(shù)據(jù)。內(nèi)核用CPOL和CPHA的組合來表示當前SPI需要的工作模式:
·CPOL=0,CPHA=1 模式0
·CPOL=0,CPHA=1 模式1
·CPOL=1,CPHA=0 模式2
·CPOL=1,CPHA=1 模式3
軟件架構
在內(nèi)核的SPI驅(qū)動的軟件架構中,進行了合理的分層和抽象,如下圖所示:

圖2.1 SPI驅(qū)動的軟件架構
SPI控制器驅(qū)動程序
SPI控制器不用關心設備的具體功能,它只負責把上層協(xié)議驅(qū)動準備好的數(shù)據(jù)按SPI總線的時序要求發(fā)送給SPI設備,同時把從設備收到的數(shù)據(jù)返回給上層的協(xié)議驅(qū)動,因此,內(nèi)核把SPI控制器的驅(qū)動程序獨立出來。SPI控制器驅(qū)動負責控制具體的控制器硬件,諸如DMA和中斷操作等等,因為多個上層的協(xié)議驅(qū)動可能會通過控制器請求數(shù)據(jù)傳輸操作,所以,SPI控制器驅(qū)動同時也要負責對這些請求進行隊列管理,保證先進先出的原則。
SPI通用接口封裝層
為了簡化SPI驅(qū)動程序的編程工作,同時也為了降低協(xié)議驅(qū)動程序和控制器驅(qū)動程序的耦合程度,內(nèi)核把控制器驅(qū)動和協(xié)議驅(qū)動的一些通用操作封裝成標準的接口,加上一些通用的邏輯處理操作,組成了SPI通用接口封裝層。這樣的好處是,對于控制器驅(qū)動程序,只要實現(xiàn)標準的接口回調(diào)API,并把它注冊到通用接口層即可,無需直接和協(xié)議層驅(qū)動程序進行交互。而對于協(xié)議層驅(qū)動來說,只需通過通用接口層提供的API即可完成設備和驅(qū)動的注冊,并通過通用接口層的API完成數(shù)據(jù)的傳輸,無需關注SPI控制器驅(qū)動的實現(xiàn)細節(jié)。
SPI協(xié)議驅(qū)動程序
上面我們提到,控制器驅(qū)動程序并不清楚和關注設備的具體功能,SPI設備的具體功能是由SPI協(xié)議驅(qū)動程序完成的,SPI協(xié)議驅(qū)動程序了解設備的功能和通信數(shù)據(jù)的協(xié)議格式。向下,協(xié)議驅(qū)動通過通用接口層和控制器交換數(shù)據(jù),向上,協(xié)議驅(qū)動通常會根據(jù)設備具體的功能和內(nèi)核的其它子系統(tǒng)進行交互,例如,和MTD層交互以便把SPI接口的存儲設備實現(xiàn)為某個文件系統(tǒng),和TTY子系統(tǒng)交互把SPI設備實現(xiàn)為一個TTY設備,和網(wǎng)絡子系統(tǒng)交互以便把一個SPI設備實現(xiàn)為一個網(wǎng)絡設備,等等。當然,如果是一個專有的SPI設備,我們也可以按設備的協(xié)議要求,實現(xiàn)自己的專有協(xié)議驅(qū)動。
SPI通用設備驅(qū)動程序
有時候,考慮到連接在SPI控制器上的設備的可變性,在內(nèi)核沒有配備相應的協(xié)議驅(qū)動程序,對于這種情況,內(nèi)核為我們準備了通用的SPI設備驅(qū)動程序,該通用設備驅(qū)動程序向用戶空間提供了控制SPI控制的控制接口,具體的協(xié)議控制和數(shù)據(jù)傳輸工作交由用戶空間根據(jù)具體的設備來完成,在這種方式中,只能采用同步的方式和SPI設備進行通信,所以通常用于一些數(shù)據(jù)量較少的簡單SPI設備。
-
Linux
+關注
關注
88文章
11758瀏覽量
219009 -
SPI總線
+關注
關注
4文章
109瀏覽量
28469 -
設備驅(qū)動
+關注
關注
0文章
71瀏覽量
11341
原文標題:Linux SPI總線和設備驅(qū)動架構你都懂了嗎?
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
TPS61042:高性能LED驅(qū)動芯片的深度解析
Rockchip CIF驅(qū)動深度解析:從架構設計到電源計數(shù)補丁修復
深入解析Rockchip SFC驅(qū)動:SPI Flash傳輸流程與問題排查指南
深度解析ES8389/ES8390/音頻芯片Linux驅(qū)動(Linux6.1內(nèi)核)
深度解析?ARM?架構:從劍橋車庫到未來計算
瑞芯微(EASY EAI)RV1126B SPI使用
PCA9958:24通道SPI串行總線63 mA/5.5 V恒流LED驅(qū)動器的深度解析
【免費送書】成為硬核Linux開發(fā)者:《Linux 設備驅(qū)動開發(fā)(第 2 版)》
【書籍評測活動NO.67】成為硬核Linux開發(fā)者:《Linux 設備驅(qū)動開發(fā)(第 2 版)》
GPU架構深度解析
能否提供Linux下USB轉(zhuǎn)SPI模式的測試程序?
基于RK3576開發(fā)板的SPI使用說明
深度解析Linux SPI總線和設備驅(qū)動架構
評論