Controller,,泛指SPI設(shè)備里面的控制寄存器,,可以通過(guò)配置它們來(lái)設(shè)置SPI總線的傳輸模式,。
通常情況下,我們只需要對(duì)上圖所描述的四個(gè)管腳(pin)進(jìn)行編程即可控制整個(gè)SPI設(shè)備之間的數(shù)據(jù)通信:
SCK,,SerialClock,,主要的作用是Master設(shè)備往Slave設(shè)備傳輸時(shí)鐘信號(hào),控制數(shù)據(jù)交換的時(shí)機(jī)以及速率,;
SS/CS,,SlaveSelect/ChipSelect,用于Master設(shè)備片選Slave設(shè)備,,使被選中的Slave設(shè)備能夠被Master設(shè)備所訪問(wèn),;
SDO/MOSI,SerialDataOutput/MasterOutSlaveIn,,在Master上面也被稱(chēng)為T(mén)x-Channel,,作為數(shù)據(jù)的出口,主要用于SPI設(shè)備發(fā)送數(shù)據(jù),;
SDI/MISO,,SerialDataInput/MasterInSlaveOut,在Master上面也被稱(chēng)為Rx-Channel,,作為數(shù)據(jù)的入口,,主要用于SPI設(shè)備接收數(shù)據(jù);
SPI設(shè)備在進(jìn)行通信的過(guò)程中,,Master設(shè)備和Slave設(shè)備之間會(huì)產(chǎn)生一個(gè)數(shù)據(jù)鏈路回環(huán)(DataLoop),,就像上圖所畫(huà)的那樣,通過(guò)SDO和SDI管腳,,SSPSR控制數(shù)據(jù)移入移出SSPBUF,,Controller確定SPI總線的通信模式,,SCK傳輸時(shí)鐘信號(hào),。
2,、Timing.
上圖通過(guò)Master設(shè)備與Slave設(shè)備之間交換1Byte數(shù)據(jù)來(lái)說(shuō)明SPI協(xié)議的工作機(jī)制。
首先,,在這里解釋一下兩個(gè)概念:
CPOL:時(shí)鐘極性,,表示SPI在空閑時(shí),時(shí)鐘信號(hào)是高電平還是低電平,。若CPOL被設(shè)為1,,那么該設(shè)備在空閑時(shí)SCK管腳下的時(shí)鐘信號(hào)為高電平。當(dāng)CPOL被設(shè)為0時(shí)則正好相反,。
CPHA:時(shí)鐘相位,,表示SPI設(shè)備是在SCK管腳上的時(shí)鐘信號(hào)變?yōu)樯仙貢r(shí)觸發(fā)數(shù)據(jù)采樣,還是在時(shí)鐘信號(hào)變?yōu)橄陆笛貢r(shí)觸發(fā)數(shù)據(jù)采樣,。若CPHA被設(shè)置為1,,則SPI設(shè)備在時(shí)鐘信號(hào)變?yōu)橄陆笛貢r(shí)觸發(fā)數(shù)據(jù)采樣,在上升沿時(shí)發(fā)送數(shù)據(jù),。當(dāng)CPHA被設(shè)為0時(shí)也正好相反,。
上圖里的'Mode1,1'說(shuō)明了本例所使用的SPI數(shù)據(jù)傳輸模式被設(shè)置成CPOL=1,,CPHA=1.這樣,,在一個(gè)Clock周期內(nèi),每個(gè)單獨(dú)的SPI設(shè)備都能以全雙工(Full-Duplex)的方式,,同時(shí)發(fā)送和接收1bit數(shù)據(jù),,即相當(dāng)于交換了1bit大小的數(shù)據(jù).如果SPI總線的Channel-Width被設(shè)置成Byte,表示SPI總線上每次數(shù)據(jù)傳輸?shù)淖钚挝粸锽yte,,那么掛載在該SPI總線的設(shè)備每次數(shù)據(jù)傳輸?shù)倪^(guò)程至少需要8個(gè)Clock周期(忽略設(shè)備的物理延遲).因此,,SPI總線的頻率越快,Clock周期越短,,則SPI設(shè)備間數(shù)據(jù)交換的速率就越快,。
3、SSPSR.
SSPSR是SPI設(shè)備內(nèi)部的移位寄存器(ShiftRegister),。它的主要作用是根據(jù)SPI時(shí)鐘信號(hào)狀態(tài),,往SSPBUF里移入或者移出數(shù)據(jù),每次移動(dòng)的數(shù)據(jù)大小由Bus-Width以及Channel-Width所決定,。
Bus-Width的作用是指定地址總線到Master設(shè)備之間數(shù)據(jù)傳輸?shù)膯挝弧?/span>
例如,,我們想要往Master設(shè)備里面的SSPBUF寫(xiě)入16Byte大小的數(shù)據(jù):首先,給Master設(shè)備的配置寄存器設(shè)置Bus-Width為Byte,;然后往Master設(shè)備的Tx-Data移位寄存器在地址總線的入口寫(xiě)入數(shù)據(jù),,每次寫(xiě)入1Byte大小的數(shù)據(jù)(使用writeb函數(shù)),;寫(xiě)完1Byte數(shù)據(jù)之后,Master設(shè)備里面的Tx-Data移位寄存器會(huì)自動(dòng)把從地址總線傳來(lái)的1Byte數(shù)據(jù)移入SSPBUF里,;上述動(dòng)作一共需要重復(fù)執(zhí)行16次,。
Channel-Width的作用是指定Master設(shè)備與Slave設(shè)備之間數(shù)據(jù)傳輸?shù)膯挝?與Bus-Width相似,Master設(shè)備內(nèi)部的移位寄存器會(huì)依據(jù)Channel-Width自動(dòng)地把數(shù)據(jù)從Master-SSPBUF里通過(guò)Master-SDO管腳搬運(yùn)到Slave設(shè)備里的Slave-SDI引腳,,Slave-SSPSR再把每次接收的數(shù)據(jù)移入Slave-SSPBUF里,。
通常情況下,Bus-Width總是會(huì)大于或等于Channel-Width,,這樣能保證不會(huì)出現(xiàn)因Master與Slave之間數(shù)據(jù)交換的頻率比地址總線與Master之間的數(shù)據(jù)交換頻率要快,,導(dǎo)致SSPBUF里面存放的數(shù)據(jù)為無(wú)效數(shù)據(jù)這樣的情況。
4,、SSPBUF.
我們知道,,在每個(gè)時(shí)鐘周期內(nèi),Master與Slave之間交換的數(shù)據(jù)其實(shí)都是SPI 內(nèi)部移位寄存器從SSPBUF里面拷貝的,。我們可以通過(guò)往SSPBUF對(duì)應(yīng)的寄存器(Tx-Data/Rx-Dataregister)里讀寫(xiě)數(shù)據(jù),,間接地操控SPI設(shè)備內(nèi)部的SSPBUF。
例如,,在發(fā)送數(shù)據(jù)之前,,我們應(yīng)該先往Master的Tx-Data寄存器寫(xiě)入將要發(fā) 送出去的數(shù)據(jù),這些數(shù)據(jù)會(huì)被Master-SSPSR移位寄存器根據(jù)Bus-Width自動(dòng)移入Master-SSPBUF里,,然后這些數(shù)據(jù)又會(huì)被Master-SSPSR根據(jù)Channel-Width從Master-SSPBUF中移出,,通過(guò)Master-SDO管腳傳給Slave-SDI管腳,Slave-SSPSR則把從Slave-SDI接收到的數(shù)據(jù)移入Slave-SSPBUF里.與此同時(shí),,Slave-SSPBUF里面的數(shù)據(jù)根據(jù)每次接收數(shù)據(jù)的大小(Channel-Width),,通過(guò)Slave-SDO發(fā)往Master-SDI,Master-SSPSR再把從Master-SDI接收的數(shù)據(jù)移入Master-SSPBUF,。在單次數(shù)據(jù)傳輸完成之后,,用戶程序可以通過(guò)從Master設(shè)備的Rx-Data寄存器讀取Master設(shè)備數(shù)據(jù)交換得到的數(shù)據(jù)。
5,、Controller.
Master設(shè)備里面的Controller主要通過(guò)時(shí)鐘信號(hào)(ClockSignal)以及片選信號(hào)(SlaveSelectSignal)來(lái)控制Slave設(shè)備,。Slave設(shè)備會(huì)一直等待,直到接收到Master設(shè)備發(fā)過(guò)來(lái)的片選信號(hào),,然后根據(jù)時(shí)鐘信號(hào)來(lái)工作,。
Master設(shè)備的片選操作必須由程序所實(shí)現(xiàn)。例如:由程序把SS/CS管腳的時(shí)鐘信號(hào)拉低電平,,完成SPI設(shè)備數(shù)據(jù)通信的前期工作,;當(dāng)程序想讓SPI設(shè)備結(jié)束數(shù)據(jù)通信時(shí),再把SS/CS管腳上的時(shí)鐘信號(hào)拉高電平,。
|