標(biāo)題: 基于51的SPI通訊原理及協(xié)議詳解 [打印本頁]

作者: 51黑er    時(shí)間: 2015-11-10 02:11
標(biāo)題: 基于51的SPI通訊原理及協(xié)議詳解
在51系列的MCU中,STC12C5410AD系列提供了一種高速串行通訊接口,其全雙工,高速,同步,兩種操作模式:主模式和從模式。主模式支持高達(dá)3Mbps的速率。

SPI接口寄存器如下:


SPI控制寄存器SPCTL

SSIG:引腳忽略控制位
SSIG=1;MSTR(第四位)確定硬件作為主機(jī)還是從機(jī)
SSIG=0;SS~用于確定其間作為主機(jī)還是從機(jī)


SPEN;SPI使能位
SPEN=1;SPI使能,SPEN=0;
SPI禁止,此時(shí)可作為通用IO使用
。

DORD:設(shè)定SPI數(shù)據(jù)發(fā)送和接收的位順序
DPRD=1;數(shù)據(jù)最低位LSB最先發(fā)送
DPRD=0;數(shù)據(jù)最高位MSB最先發(fā)送

MSTR;主從位選擇

CPOL;SPI時(shí)鐘極性
CPOL=1;SPICLK空閑時(shí)為高電平,SPICLK的前時(shí)鐘沿為下降沿而后沿為上升沿。
CPOL=0;SPICLK空閑時(shí)為低電平,SPICLK的前時(shí)鐘沿為上升沿而后沿為下降沿。

CPHA;SPI時(shí)鐘相位選擇
CPHA=1;數(shù)據(jù)在SPICLK的前時(shí)鐘沿驅(qū)動(dòng),并在后時(shí)鐘沿采樣。
CPHA=0;數(shù)據(jù)在(SS~)為低(SSIG=00)時(shí)被驅(qū)動(dòng),在SPICLK的后時(shí)鐘沿被改變,并在前時(shí)鐘沿被采樣。(SSIG為1時(shí)的動(dòng)作未定義);

SPR1,SPR0;SPI時(shí)鐘速率選擇控制位,時(shí)鐘選擇如下:

其中,CPU_CLK為CPU的時(shí)鐘。

SPI狀態(tài)寄存器SPSTAT

SPIF;SPI傳輸完成標(biāo)志
當(dāng)一次傳輸完成,SPIF置位,此時(shí),如果SPi中斷被打開(即ESPI(IE2.1)和EA(IE.7)都置位),則產(chǎn)生中斷。當(dāng)SPI處于主模式且SSIG=0時(shí),如果SSIG~為輸入并被驅(qū)動(dòng)為低電平,SPIF也將置位,,表示模式改變,SPIF通過軟件向其寫入“1”,清零。

WCOL;SPI寫沖突標(biāo)志
在數(shù)據(jù)傳輸?shù)倪^程中,如果對(duì)SPi數(shù)據(jù)寄存器SPDAT執(zhí)行寫操作,WCOL將置位,WCOL標(biāo)志通過軟件向其寫入“1”清零。

SPI數(shù)據(jù)寄存器SPIDAT

SPDAT.7-SPDAT.0: 數(shù)據(jù)的傳輸位Bit7-Bit0

SPI的核心是一個(gè)8位的移位寄存器和數(shù)據(jù)緩沖器,數(shù)據(jù)可以同時(shí)接受或者發(fā)送,在SPI數(shù)據(jù)的傳輸過程中,發(fā)送和接受的數(shù)據(jù)都存儲(chǔ)在數(shù)據(jù)緩沖寄存器中

對(duì)于主模式,若想發(fā)送一字節(jié)數(shù)據(jù),只需將這個(gè)數(shù)據(jù)寫道SPIDAT寄存器中,
主模式下SS~不是必須的,
從模式下,必須在SS~信號(hào)變?yōu)橛行Р⒔邮艿胶线m的時(shí)鐘信號(hào)后,方可進(jìn)行數(shù)據(jù)傳輸。此模式下,如果一個(gè)字節(jié)傳輸完成后,SS~信號(hào)變?yōu)楦唠娖,這個(gè)字節(jié)立即被硬件邏輯標(biāo)志為接收完成,SPI接口準(zhǔn)備接受下一個(gè)數(shù)據(jù)。


SPI接口的數(shù)據(jù)通信
SPI接口對(duì)應(yīng)管腳SCLK/P1.7,MOSI/P1.5,MISO/P1.6mSS~/P1.4
MOSI(Master Out Sleavein--主出從入);多個(gè)從機(jī)共享一根MOSI信號(hào)線,在時(shí)鐘邊沿的前半周期,主機(jī)將數(shù)據(jù)放在MOSI信號(hào)線上,叢機(jī)在該邊界處獲取數(shù)據(jù)。
MISO(Master in Sleaver out--主入從出;一個(gè)主機(jī)可以連接多個(gè)從機(jī),,因此MISO的信號(hào)線會(huì)連接到多個(gè)從機(jī)上,當(dāng)主機(jī)與一個(gè)從機(jī)通訊時(shí),其他從機(jī)應(yīng)將其MISO引腳驅(qū)動(dòng)置位高阻狀態(tài)。

SCLK(SPIClock);從主機(jī)到從機(jī),用于同步不MOSI或者M(jìn)ISO的數(shù)據(jù)傳輸,當(dāng)主器件啟動(dòng)一次數(shù)據(jù)傳輸時(shí),自動(dòng)產(chǎn)生8個(gè)SCLK時(shí)鐘周期信號(hào)給從機(jī),在SCLK的每個(gè)跳變處(上升沿或者下降沿)移出一位數(shù)據(jù),所以一次數(shù)據(jù)的傳輸可以穿出一個(gè)字節(jié)。
SS~(Sleave Select從機(jī)信號(hào)選擇);主從模式下的SS~使用不同。
主模式下,SPI接口只能有一個(gè)主機(jī),不存在主機(jī)選擇問題,該模式下,SS~不是必須的,主模式下,通常將主機(jī)的SS~管腳通過10K電阻上啦至高電平。每一個(gè)從機(jī)的SS~接主機(jī)的IO口,由主機(jī)控制電平高低,以便主機(jī)選擇從機(jī)。
從模式下;不管發(fā)送還是接收,SS~信號(hào)必須有效,因此在一次數(shù)據(jù)開始傳輸之前,必須將SS~置為低電平。在典型配置中,SPI主機(jī)使用IO口選擇一個(gè)SPI器件作為當(dāng)前的從機(jī)。

SPI從期間通過SS~管腳以確定是否被選擇,如果滿足下面的條件之一,SS~就被忽略:
如果SPI系統(tǒng)被禁止,即SPEN(SPCTL.6)=0。
如果SPI配置為主機(jī),即MSTR(SPCTL.4)=1,并且P1.4配置為輸出(通過P1M0.4和P1M1.4)
如果SS~管腳被忽略,即SSIG1(SPCTL.7)=1;該腳配置用于IO口功能。
注意:及時(shí)SPI被配置為主機(jī)(MSTR=1),他仍然可以通過拉低SS~配置為從機(jī)(如果P1.4配置為輸入且SSIG=0),要是能改特性,應(yīng)當(dāng)置位SPIF(SPSTAT.7)。


SPI接口的數(shù)據(jù)通信方式
三種分別是:
單主機(jī)-----從機(jī)方式
雙器件方式(器件可互為主機(jī)和從機(jī))
單主機(jī)----多主機(jī)方式

單主機(jī)----=單從機(jī)連接方式:



雙器件方式(器件可互為主機(jī)和從機(jī))

當(dāng)沒有發(fā)聲SPI操作時(shí),兩個(gè)期間度可以配置為主機(jī)(MSTR=1),將SSIG清零并將P1.4(SS~)配置為準(zhǔn)雙向模式,當(dāng)其中一個(gè)期間啟動(dòng)傳輸時(shí),它可將P1.4配置為輸出并驅(qū)動(dòng)為低電平,這樣就強(qiáng)制另一個(gè)器件變?yōu)閺臋C(jī)。
雙方初始化時(shí),將自己設(shè)置成忽略SS~腳的SPI從模式,當(dāng)一方要主動(dòng)發(fā)送數(shù)據(jù)時(shí),先檢測SS~腳的電平,如果SS~是高電平,及將自己設(shè)置成忽略SS~的SPI主模式。

通訊雙方平時(shí)將SPi設(shè)置成沒有被選中的從模式,在該模式下,MISO,MOSI,SCLK均為輸入,當(dāng)多個(gè)MCU的SPI接口以此模式并聯(lián)時(shí),不會(huì)分發(fā)生總線沖突,這種特性在互為主/從,一主多從等應(yīng)用中很有用。
注意:互為主從時(shí),雙方的SPI速率必須相同,如果使用外部晶體振蕩器,雙方的晶體頻率也要相同。

單主機(jī)----多主機(jī)方式:

在上圖中,從機(jī)的SSIG(SPCTL.7)為0,從機(jī)通過對(duì)應(yīng)的SS~信號(hào)被選中,SPI主機(jī)可使用任何端口(包括P1.4/SS~)來驅(qū)動(dòng)SS~引腳。

SPI主從模式配置:


作為主機(jī)或者從機(jī)時(shí)的額外注意事項(xiàng):
作為從機(jī)時(shí),額外注意事項(xiàng):
當(dāng)CPHA=0時(shí),SSIG必須為0(也就是i不能忽略SS~),SS~引腳必須置低并且在每個(gè)連續(xù)的串行字節(jié)發(fā)送完成后,需重新設(shè)置為高電平。如果SPDAT寄存器在SS~有效(低電平)時(shí)執(zhí)行寫操作,那么將導(dǎo)致一個(gè)寫沖突錯(cuò)誤。
當(dāng)CPHA=1時(shí),SSIG可以置1(即可以忽略SS~引腳),入伏哦SSIG=0,SS~引腳可在連續(xù)傳輸之間保持低有效。這種方式有時(shí)適用于具有單固定主機(jī)和單從機(jī)驅(qū)動(dòng)MISO的數(shù)據(jù)線的系統(tǒng)。

作為主機(jī)時(shí)的額外注意事項(xiàng):
在SPI中,傳輸總是由主機(jī)啟動(dòng).如果SPI使能(SPEN=1)并選擇作為主機(jī),主機(jī)對(duì)SPI數(shù)據(jù)寄存器的寫操作將啟動(dòng)SPI時(shí)鐘發(fā)聲器和數(shù)據(jù)的傳輸,在數(shù)據(jù)寫入SPDAT之后的半個(gè)到一個(gè)SPI位時(shí)間后,數(shù)據(jù)將出現(xiàn)在MOSI腳。
需要注意的是:主機(jī)可以通過將對(duì)應(yīng)器件SS~驅(qū)動(dòng)為低電平與之通信,寫入主機(jī)SPDAT寄存器的數(shù)據(jù)從MOSI移出發(fā)送到從機(jī)的MOSI。同時(shí)主機(jī)SPDAT寄存器的數(shù)據(jù)從MISO移出發(fā)送到主機(jī)的MISO。
傳送玩一個(gè)字節(jié)后,SPI時(shí)鐘發(fā)聲器停止,傳輸完成標(biāo)志SPIF置位,并產(chǎn)生一個(gè)中斷。主機(jī)和從機(jī)CPU的兩個(gè)移位寄存器可以看做是一個(gè)16位循環(huán)移位寄存器,當(dāng)數(shù)據(jù)從主機(jī)移到從機(jī)時(shí),數(shù)據(jù)也可以以相反的方向移入,這意味著一個(gè)移位周期中,主機(jī)和從機(jī)的數(shù)據(jù)相互交換。

通過SS~改變模式
如果SPEN=1,SSIG=0且MSTR=1,SPI使能位主機(jī)模式。SS~可配置為輸入或者準(zhǔn)雙向模式。這種情況下,另外一個(gè)主機(jī)可將該腳驅(qū)動(dòng)為低電平,從而將該器件選擇為SPI從機(jī)并向其發(fā)送數(shù)據(jù)。

為了避免爭奪總線,SPI系統(tǒng)執(zhí)行以下操作:
1.MSTR清零并且CPU變成從機(jī)。這樣SPi就變成從機(jī)。MOSI和SCLK強(qiáng)制變?yōu)檩斎肽J剑鳰ISO則變?yōu)檩敵瞿J?br /> 2.SPATAT的SPIF的標(biāo)志位置位,如果SPI中斷已被使能,則產(chǎn)生SPI中斷。
用戶軟件必須一直對(duì)MSTR位進(jìn)行檢測,如果改為被一個(gè)從機(jī)選擇所清零而用戶想繼續(xù)講SPI作為主機(jī),這是就必須重新職位MSTR,否則就進(jìn)入從機(jī)模式。


寫沖突:
SPi在發(fā)送時(shí)為單緩沖,在接受時(shí)為雙緩沖,這樣在前一次發(fā)送行為完成之前,不能將新的數(shù)據(jù)寫入移位寄存器。當(dāng)發(fā)送過程中,對(duì)數(shù)據(jù)寄存器進(jìn)行寫操作時(shí),WCOL(SPSTAT.6)將置位以指示數(shù)據(jù)沖突,在這種情況下,當(dāng)前發(fā)送的數(shù)據(jù)繼續(xù)發(fā)送,而新寫入的數(shù)據(jù)則丟失。

當(dāng)對(duì)主機(jī)或者從機(jī)進(jìn)行寫沖突檢測時(shí),主機(jī)發(fā)生寫沖突的情況是很罕見的,因?yàn)橹鳈C(jī)擁有數(shù)據(jù)傳輸?shù)耐耆刂茩?quán),但從機(jī)有可能發(fā)生寫沖突。因?yàn)楫?dāng)主機(jī)啟動(dòng)傳輸時(shí),從機(jī)無法盡心控制。
接收數(shù)據(jù)時(shí),接收到的數(shù)據(jù)傳送到一個(gè)并行讀數(shù)據(jù)緩沖區(qū),這樣將釋放移位寄存器以繼續(xù)下一個(gè)數(shù)據(jù)的接收。但必須在下個(gè)字符完全移入之前,從數(shù)據(jù)寄存器中讀出接收到的數(shù)據(jù),否則前一個(gè)接收數(shù)據(jù)將丟失。
WCOl可通過軟件向其寫入“1”清零。

數(shù)據(jù)模式
時(shí)鐘相位位(CPHA)允許用戶設(shè)置采樣和改變數(shù)據(jù)的時(shí)鐘邊沿;時(shí)鐘極性位(CPOL)允許用戶攝者始終極性,
SPI從機(jī)傳輸格式(CPHA=0),如下:

SPI從機(jī)傳輸格式(CPHA=1),如下:

SPI主機(jī)傳輸格式(CPHA=0),如下:

SPI主機(jī)傳輸格式(CPHA=1),如下:




SPI的相關(guān)縮寫:
SPI的極性Polarity和相位Phase,最常見的寫法是CPOLCPHA
CKPOL (Clock Polarity) = CPOL = POL = Polarity = (時(shí)鐘)極性
CKPHA (Clock Phase)   = CPHA =PHA = Phase = (時(shí)鐘)相位
SCK=SCLK=SPI的時(shí)鐘
Edge=邊沿,即時(shí)鐘電平變化的時(shí)刻,即上升沿(rising edge)或者下降沿(falling edge)

在一個(gè)周期內(nèi),關(guān)于邊沿的問題:
Leadingedge=前一個(gè)邊沿=第一個(gè)邊沿,對(duì)于開始電壓是1,那么就是1變成0的時(shí)候,對(duì)于開始電壓是0,那么就是0變成1的時(shí)候;
Trailingedge=后一個(gè)邊沿=第二個(gè)邊沿,對(duì)于開始電壓是1,那么就是0變成1的時(shí)候(即在第一次1變成0之后,才可能有后面的0變成1),對(duì)于開始電壓是0,那么就是1變成0的時(shí)候

關(guān)于極性和相位的解釋:

CPOL極性:
先說什么是SCLK時(shí)鐘的空閑時(shí)刻,其就是當(dāng)SCLK在數(shù)發(fā)送8個(gè)bit比特?cái)?shù)據(jù)之前和之后的狀態(tài),
于此對(duì)應(yīng)的,SCLK在發(fā)送數(shù)據(jù)的時(shí)候,就是正常的工作的時(shí)候,有效active的時(shí)刻了。

先說英文,其精簡解釋為:Clock Polarity = IDLE state of SCK。

再用中文詳解:
SPI的CPOL,表示當(dāng)SCLK空閑idle的時(shí)候,其電平的值是低電平0還是高電平1:
CPOL=0,時(shí)鐘空閑idle時(shí)候的電平是低電平,所以當(dāng)SCLK有效的時(shí)候,就是高電平,就是所謂的active-high;
CPOL=1,時(shí)鐘空閑idle時(shí)候的電平是高電平,所以當(dāng)SCLK有效的時(shí)候,就是低電平,就是所謂的active-low;

CPHA相位:
首先說明一點(diǎn),capture strobe = latch = read =sample,都是表示數(shù)據(jù)采樣,數(shù)據(jù)有效的時(shí)刻。
相位,對(duì)應(yīng)著數(shù)據(jù)采樣是在第幾個(gè)邊沿(edge),是第一個(gè)邊沿還是第二個(gè)邊沿,0對(duì)應(yīng)著第一個(gè)邊沿,1對(duì)應(yīng)著第二個(gè)邊沿。

對(duì)于:
CPHA=0,表示第一個(gè)邊沿:
對(duì)于CPOL=0,idle時(shí)候的是低電平,第一個(gè)邊沿就是從低變到高,所以是上升沿;
對(duì)于CPOL=1,idle時(shí)候的是高電平,第一個(gè)邊沿就是從高變到低,所以是下降沿;

CPHA=1,表示第二個(gè)邊沿:
對(duì)于CPOL=0,idle時(shí)候的是低電平,第二個(gè)邊沿就是從高變到低,所以是下降沿;
對(duì)于CPOL=1,idle時(shí)候的是高電平,第一個(gè)邊沿就是從低變到高,所以是上升沿;

或者圖文可以解釋的更加的清晰:


判斷SPI的CPOL和CPHA的方法:
CPOL是用來決定SCK時(shí)鐘信號(hào)空閑時(shí)的電平,CPOL=0,空閑電平為低電平,CPOL=1時(shí),空閑電平為高電平。
CPHA是用來決定采樣時(shí)刻的,CPHA=0,在每個(gè)周期的第一個(gè)時(shí)鐘沿采樣,CPHA=1,在每個(gè)周期的第二個(gè)時(shí)鐘沿采樣

圖形可能會(huì)來得更加的直觀:











作者: lemon0210    時(shí)間: 2015-11-10 16:51
不錯(cuò),值得好好看看
作者: 迷戀520冬天    時(shí)間: 2017-2-3 13:11
詳細(xì)。謝謝樓主




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1