SPI接口掃盲為何要寫這篇文檔? 百度上找出來的SPI接口中文描述都說的太過簡(jiǎn)略,,沒有一篇文檔能夠詳盡的將SPI介紹清楚的,。wikipedia英文版[注釋1]中,SPI接口介紹的很好,,但是畢竟是英文版,,讀起來終究不如母語舒服,所以我結(jié)合自己的工作經(jīng)驗(yàn),,對(duì)其進(jìn)行了漢化,、整理,。 個(gè)人SPI接口相關(guān)經(jīng)驗(yàn): 1. 參與過國(guó)產(chǎn)某芯片SPI接口樣品驗(yàn)證、SPI接口服務(wù)DEMO開發(fā)(C語言),。 2. 使用國(guó)產(chǎn)某芯片GPIO接口模擬SPI接口(C語言),。 3. 使用STM32芯片的SPI MASTER/SLAVE(C語言)。 SPI ( Serial Peripheral Interface,,串行外設(shè)接口)是一種同步、串行通訊接口規(guī)格,,常用于短距離通訊,,主要是在嵌入式系統(tǒng)中。此接口由Mototola公司推出,,已成為一種事實(shí)標(biāo)準(zhǔn)(沒有統(tǒng)一的協(xié)議規(guī)范,,但是基于其廣泛的使用,,根據(jù)實(shí)際使用中大家通用的習(xí)慣形成了一個(gè)類似行規(guī)的標(biāo)準(zhǔn)),。 SPI典型的應(yīng)用場(chǎng)景包括SD卡(SD接口中包含SPI接口)和液晶顯示。 SPI是一種高速的,,全雙工,,同步的通信總線。分為主(master),、從(slave)兩種模式,,一個(gè)SPI通訊系統(tǒng)需要包含一個(gè)(且只能是一個(gè))maser(主設(shè)備),一個(gè)或多個(gè)slave(從設(shè)備),。 SPI接口的讀寫操作,,都是由master發(fā)起。當(dāng)存在多個(gè)從設(shè)備時(shí),,通過各自的片選(slave select)信號(hào)進(jìn)行管理,。 硬件開發(fā)人員設(shè)計(jì)、提供的SPI接口,,其實(shí)只是一個(gè)數(shù)據(jù)讀寫通道 ,,具體讀寫數(shù)據(jù)所代表的意義需要在應(yīng)用中定義。不像SD接口那樣,,對(duì)于命令有著明確詳細(xì)的定義,。 SPI接口都包含哪些IO線?除了供電,、接地兩個(gè)模擬連接以外,,SPI總線定義四組數(shù)字信號(hào): - 接口時(shí)鐘SCLK(Serial Clock,也叫SCK,、CLK),,master輸出至slave的通訊時(shí)鐘,。 - MOSI( Master Output Slave Input,也叫SIMO,、MTSR,、DI、DIN,、SI)自master輸出至slave的數(shù)據(jù)線,。 - MISO (Master Input Slave Output,也叫SOMI,、MRST,、DO、DOUT,、SO)自slave輸出至master的數(shù)據(jù)線,。 - SS(Slave select,也叫nSS,、CS,、CSB、CSN,、EN,、nSS、STE,、SYNC)master對(duì)slave的片選信號(hào),,自master輸出至slave,低有效,。 注釋: - 兩條數(shù)據(jù)線與SCLK的時(shí)序關(guān)系詳見下文,。 - SPI接口的片選信號(hào)一般都是低有效的,盡管有的地方命名為SS/CS而有的地方命名為nSS/nCS,。(當(dāng)然了,,對(duì)于一個(gè)合格的硬件開發(fā)者,低電平有效的信號(hào)都應(yīng)該在命名時(shí)加上個(gè)_n) 在master/slave上,,都能找到SCLK/MISO/MOSI/SS四個(gè)接口。 當(dāng)只有一個(gè)maser,、一個(gè)slave時(shí),,將master與slave上名字相同的4對(duì)接口兩兩互聯(lián),即可完成了接口的互聯(lián),。如下圖所示: 注釋: - 某些芯片產(chǎn)品上,,對(duì)SPI兩條數(shù)據(jù)線的命名為SDO/SDI。此時(shí)需要將master的SDO連接到slave的SDI,將master的SDI連接到slave的SDO,。 - 當(dāng)系統(tǒng)中只有一個(gè)SLAVE時(shí),,且SLAVE的SS是低電平有效時(shí),Slave的SS接口直接接地也不影響通訊,。當(dāng)然了,,實(shí)際應(yīng)用中,如果要考慮到功耗等因素,,處理起來或許就不那么簡(jiǎn)單了,,具體問題具體分析。 - 有的芯片SPI接口的SS信號(hào),,對(duì)電平敏感,,通訊前確保SS是低電平就好;而有的SPI芯片的SS信號(hào)是下降沿敏感的,。比如Maxim MAX1242 ADC,,開始通訊前,需要SS信號(hào)有一個(gè)高→低的翻轉(zhuǎn),。 - 多數(shù)SLAVE的MISO接口有三態(tài)輸出(高電平,、低電平、高阻),,當(dāng)SS無效時(shí),,它們的MISO信號(hào)輸出高阻態(tài)(啥都沒接的狀態(tài)),。若SLAVE的MISO接口不支持高阻輸出,,則無法應(yīng)用于多SLAVE的SPI系統(tǒng)。 當(dāng)存在一個(gè)master,、多個(gè)slave時(shí)(注意,,當(dāng)master上有n個(gè)SS時(shí),對(duì)應(yīng)可以連接n個(gè)slave),,連接方式如下圖所示,,注意SCLK/MOSI/MISO三個(gè)接口采取復(fù)用模式連接,不同SS單獨(dú)連接對(duì)應(yīng)的slave,,SS信號(hào)絕不可復(fù)用: SPI接口是一種典型的全雙工接口,通過同步時(shí)鐘SCLK的脈沖將數(shù)據(jù)一位位地傳送,。所以在開始通訊前,,master首先要配置接口時(shí)鐘(確定其通訊頻率是SLAVE可以支持的,通常為數(shù)兆赫茲),。 當(dāng)MASTER片選一個(gè)SLAVE時(shí),,每向SLAVE發(fā)送一個(gè)周期的SCLK信號(hào),都會(huì)有1bit的數(shù)據(jù)從MOSI發(fā)送至slave,,與此同時(shí),,slave每收到一個(gè)周期的SCLK信號(hào),,都會(huì)從MISO向master發(fā)送1bit的數(shù)據(jù)。這種全雙工通訊,,是由硬件保證的(MASTER與HOST中各有一個(gè)移位寄存器作為收發(fā)數(shù)據(jù)的緩存),。 SPI是一個(gè)很開放的接口,指令解析,、幀大小,、LSB/MSB(Least Significant Bit/Most Significant Bit)等規(guī)則并沒有一個(gè)完善的定義,不同的SPI設(shè)備在這些方面的定義會(huì)有不同: 不同于SD等接口的嚴(yán)謹(jǐn)?shù)腸ommand定義,,SPI接口的master與slave之間的命令,、數(shù)據(jù)解析都可以自定義,只要保證master與slave之間采用相同的規(guī)則就好,。 不同SPI芯片,,每次連續(xù)傳輸?shù)臄?shù)據(jù)量的大小(取決于MASTER,、SLAVE中緩存最小的那個(gè))常常不同,。當(dāng)一次連續(xù)通訊的的數(shù)據(jù)量超過幀的大小時(shí),會(huì)出現(xiàn)數(shù)據(jù)丟失的現(xiàn)象,。所以,,每完成1幀的傳輸后,MASTER會(huì)停止接口時(shí)鐘輸出,,master,、slave讀取、處理收到的數(shù)據(jù),,然后進(jìn)行下一幀的傳輸,。 在SPI接口協(xié)議中,并沒有中斷的定義,,但是實(shí)際應(yīng)用中,,我們可以使用接口中斷提高接口通訊速度。比如SLAVE是負(fù)責(zé)數(shù)據(jù)數(shù)據(jù)加解密的,,MASTER下發(fā)一組明文給SLAVE加密,,如果此時(shí)有個(gè)SLAVE輸出到MASTER的中斷信號(hào),那么MASTER可以清楚的知道何時(shí)SLAVE完成了數(shù)據(jù)處理并讀出處理結(jié)果,,不必通過查詢一遍遍的等待結(jié)束,。 SPI接口的變形以上我們講的SPI接口,一個(gè)時(shí)鐘周期可以進(jìn)行全雙工的1bit數(shù)據(jù)通訊,。實(shí)際應(yīng)用中,,如果對(duì)于全雙工的需求不高,而且期望提高通訊速度的話,SPI有兩種常見變形可供選用: 一,、 兩線模式的SPI CLK與SS信號(hào)保持不變,,MOSI與MISO則變形為DATA_0與DATA_1。 DATA_0與DATA_1是輸入輸出狀態(tài)由MASTER配置的數(shù)據(jù)管腳:當(dāng)MASTER打算向SLAVE中寫數(shù)據(jù)時(shí),,處于輸出狀態(tài),;當(dāng)MASTER打算從SLAVE讀數(shù)據(jù)時(shí),處于輸入狀態(tài),。 二,、 四線模式的SPI CLK與SS信號(hào)保持不變,MOSI與MISO刪除,,新增四條數(shù)據(jù)線DATA0~3,。 DATA0_~3是輸入輸出狀態(tài)由MASTER配置的數(shù)據(jù)管腳:當(dāng)MASTER打算向SLAVE中寫數(shù)據(jù)時(shí),處于輸出狀態(tài),;當(dāng)MASTER打算從SLAVE讀數(shù)據(jù)時(shí),,處于輸入狀態(tài)。 這樣一來,,大大提高了單方向上數(shù)據(jù)傳輸?shù)乃俣?,但是增加了接口資源的開銷。 SPI接口時(shí)序配置 此部分參考crifan的博客,。 SPI的接口時(shí)序配置由兩個(gè)參數(shù)決定: 1,、 CPOL,clock polarity,,譯作時(shí)鐘極性,。 2、 CPHA,,clock phase,,譯作時(shí)鐘相位,。 CPOL具體說明: CPOL用于定義時(shí)鐘信號(hào)在空閑狀態(tài)下處于高電平還是低電平,,為1代表高電平,0為低電平,。 知道這些就好,,很簡(jiǎn)單的一個(gè)概念 。如果存在疑問,,結(jié)合下面的時(shí)序圖理解就好,。 CPHA具體說明: 首先,在同步接口中,,肯定存在一個(gè)接口時(shí)鐘,,用來同步采樣接口上數(shù)據(jù)的。 CPHA就是用來定義數(shù)據(jù)采樣在第幾個(gè)邊沿的。為1代表第二個(gè)邊沿采樣,,為0代表第一個(gè)邊沿采樣,。 以上兩個(gè)參數(shù),總共有四種組合: MODE 0: CPOL=0, CPHA=0 ,,CLK限制狀態(tài)為低電平,,第一個(gè)邊沿采樣,所以是上升沿采樣,。 MODE 1: CPOL=0, CPHA=1,,CLK限制狀態(tài)為低電平,第二個(gè)邊沿采樣,,所以是下降沿采樣,。 MODE 2: CPOL=1, CPHA=0 ,CLK限制狀態(tài)為高電平,,第一個(gè)邊沿采樣,,所以是下降沿采樣。 MODE 3: CPOL=1, CPHA=1 ,,CLK限制狀態(tài)為高電平,,第二個(gè)邊沿采樣,所以是上升沿采樣,。 具體見下圖,。 注意,假設(shè)是上升沿采樣,,那么MISO/MOSI就應(yīng)該上升沿翻轉(zhuǎn),,這樣錯(cuò)開半個(gè)時(shí)鐘周期以保證建立時(shí)間保持時(shí)間。 忘了這個(gè)的建議去翻翻數(shù)電,。 由于SPI缺乏一個(gè)統(tǒng)一的規(guī)范,,所以在時(shí)序描述上存在一定的差異性。CPOL與CPHA的定義,,有些芯片DATASHEET中描述與通用的規(guī)則是相反的,,所以選型時(shí)候一定要以DATASHEET中的時(shí)序圖為準(zhǔn)。 另外,,某些芯片上,,關(guān)于SPI接口時(shí)序不使用CPOL/CPHA進(jìn)行定義,而是使用CKP和CKE進(jìn)行定義,,在此不再詳細(xì)解釋這兩個(gè)概念的意義(比較繞,,這些參數(shù)看多了特容易混淆),建議直接參考時(shí)序圖,。 關(guān)于SPI時(shí)序的說明,,之前我參考了crifan的博客,,其中還有個(gè)問題待解決: 對(duì)于CPOL和CPHA這四種模式,不同的模式之間,,相對(duì)來說有何優(yōu)缺點(diǎn),,比如是否哪種模式更穩(wěn)定,數(shù)據(jù)更不容易出錯(cuò)等等,,還是不清楚,。 我這里給出我的思考結(jié)果: 首先是CPOL的選擇,我們從芯片設(shè)計(jì)角度開始談這個(gè)問題,。首先,,如果寄存器賦值時(shí)沒有特殊要求必須是下降沿觸發(fā)賦值時(shí),我們會(huì)選擇上升沿觸發(fā),,且時(shí)鐘關(guān)閉時(shí)固定為低電平,。這樣一來,保證了時(shí)鐘關(guān)閉時(shí)漏電最?。ǖ碗娖较聸]有電壓差,,減小了漏電流IDDQ,同時(shí)上升沿觸發(fā)也保證了來了時(shí)鐘能夠立刻采樣信號(hào),,快速響應(yīng)),。當(dāng)然了,如果要求寄存器下降沿采樣,,那么時(shí)鐘關(guān)閉時(shí)固定為高電平了,。 借用此思想,對(duì)于CPOL的選擇,,如果配置可以選擇的話,,我建議參考MASTER與SLAVE接口IO的配置參數(shù)。如果兩邊都是上拉,,那么建議選擇CPOL為1,,這樣一來,當(dāng)我們配置CPOL時(shí),,不會(huì)在接口上制造出一個(gè)下降沿(單SLAVE的應(yīng)用場(chǎng)景下,,SLAVE的片選有時(shí)會(huì)直接連接GND,而此時(shí)MASTER本不想通訊但是傳入了一個(gè)下降沿,,SLAVE那邊區(qū)分不出來這是不是有效通訊),;而且這樣在IO上的漏電也能有效控制(沒有電勢(shì)差,沒有電流),。如果一邊上拉一邊下拉,如果從功耗的角度考慮,,建議選擇下拉電阻更?。╇娏鞲螅┑腎O的上下拉配置進(jìn)行CPOL賦值,。 關(guān)于CPHA的選擇,我個(gè)人更傾向于使用CPHA配置為1的狀態(tài),。此配置下,,第一個(gè)時(shí)鐘沿驅(qū)動(dòng)數(shù)據(jù)數(shù)據(jù)輸出,第二個(gè)時(shí)鐘沿驅(qū)動(dòng)數(shù)據(jù)采樣,,比較符合硬件上的使用習(xí)慣,。 當(dāng)然了,這都是紙上談兵,,很多時(shí)候時(shí)序類型的選擇還要結(jié)合芯片硬件條件,、功能實(shí)現(xiàn)需求等問題考慮。 注釋1:維基百科上SPI接口的詳細(xì)描述http://en./wiki/Serial_Peripheral_Interface_Bus |
|