一、概述
SPI,串行外圍設(shè)備接口,是Motorola公司推出的一種同步串行接口技術(shù).SPI總線在物理上是通過接在外圍設(shè)備微控制器(PICmicro)上面的微處理控制單元(MCU)上叫作同步串行端口(SynchronousSerialPort)的模塊(Module)來實(shí)現(xiàn)的,它允許MCU以全雙工的同步串行方式,與各種外圍設(shè)備進(jìn)行高速數(shù)據(jù)通信。
SPI主要應(yīng)用在EEPROM,F(xiàn)lash,實(shí)時(shí)時(shí)鐘(RTC),數(shù)模轉(zhuǎn)換器(ADC),數(shù)字信號(hào)處理器(DSP)以及數(shù)字信號(hào)解碼器之間。它在芯片中只占用四根管腳(Pin)用來控制以及數(shù)據(jù)傳輸,節(jié)約了芯片的pin數(shù)目,同時(shí)為PCB在布局上節(jié)省了空間。正是出于這種簡單易用的特性,現(xiàn)在越來越多的芯片上都集成了SPI技術(shù)。
二、特點(diǎn)
1、采用主-從模式(Master-Slave)的控制方式
SPI規(guī)定了兩個(gè)SPI設(shè)備之間通信必須由主設(shè)備(Master)來控制次設(shè)備(Slave)。一個(gè)Master設(shè)備可以通過提供Clock以及對Slave設(shè)備進(jìn)行片選(SlaveSelect)來控制多個(gè)Slave設(shè)備,SPI協(xié)議還規(guī)定Slave設(shè)備的Clock由Master設(shè)備通過SCK管腳提供給Slave設(shè)備,Slave設(shè)備本身不能產(chǎn)生或控制Clock,沒有Clock則Slave設(shè)備不能正常工作。
2、采用同步方式(Synchronous)傳輸數(shù)據(jù)
Master設(shè)備會(huì)根據(jù)將要交換的數(shù)據(jù)來產(chǎn)生相應(yīng)的時(shí)鐘脈沖(ClockPulse),時(shí)鐘脈沖組成了時(shí)鐘信號(hào)(ClockSignal),時(shí)鐘信號(hào)通過時(shí)鐘極性(CPOL)和時(shí)鐘相位(CPHA)控制著兩個(gè)SPI設(shè)備間何時(shí)數(shù)據(jù)交換以及何時(shí)對接收到的數(shù)據(jù)進(jìn)行采樣,來保證數(shù)據(jù)在兩個(gè)設(shè)備之間是同步傳輸?shù)摹?/p>
3、數(shù)據(jù)交換(DataExchanges)
SPI設(shè)備間的數(shù)據(jù)傳輸之所以又被稱為數(shù)據(jù)交換,是因?yàn)镾PI協(xié)議規(guī)定一個(gè)SPI設(shè)備不能在數(shù)據(jù)通信過程中僅僅只充當(dāng)一個(gè)“發(fā)送者(Transmitter)”或者“接收者(Receiver)”。在每個(gè)Clock周期內(nèi),SPI設(shè)備都會(huì)發(fā)送并接收一個(gè)bit大小的數(shù)據(jù),相當(dāng)于該設(shè)備有一個(gè)bit大小的數(shù)據(jù)被交換了。
一個(gè)Slave設(shè)備要想能夠接收到Master發(fā)過來的控制信號(hào),必須在此之前能夠被Master設(shè)備進(jìn)行訪問(Access)。所以,Master設(shè)備必須首先通過SS/CSpin對Slave設(shè)備進(jìn)行片選,把想要訪問的Slave設(shè)備選上。
在數(shù)據(jù)傳輸?shù)倪^程中,每次接收到的數(shù)據(jù)必須在下一次數(shù)據(jù)傳輸之前被采樣。如果之前接收到的數(shù)據(jù)沒有被讀取,那么這些已經(jīng)接收完成的數(shù)據(jù)將有可能會(huì)被丟棄,導(dǎo)致SPI物理模塊最終失效。因此,在程序中一般都會(huì)在SPI傳輸完數(shù)據(jù)后,去讀取SPI設(shè)備里的數(shù)據(jù),即使這些數(shù)據(jù)(DummyData)在我們的程序里是無用的。
三、工作機(jī)制
1、概述
上圖只是對SPI設(shè)備間通信的一個(gè)簡單的描述,下面就來解釋一下圖中所示的幾個(gè)組件(Module):
SSPBUF,SynchronousSerialPortBuffer,泛指SPI設(shè)備里面的內(nèi)部緩沖區(qū),一般在物理上是以FIFO的形式,保存?zhèn)鬏斶^程中的臨時(shí)數(shù)據(jù);
SSPSR,SynchronousSerialPortRegister,泛指SPI設(shè)備里面的移位寄存器(ShiftRegitser),它的作用是根據(jù)設(shè)置好的數(shù)據(jù)位寬(bit-width)把數(shù)據(jù)移入或者移出SSPBUF;
Controller,泛指SPI設(shè)備里面的控制寄存器,可以通過配置它們來設(shè)置SPI總線的傳輸模式。
通常情況下,我們只需要對上圖所描述的四個(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è)備所訪問;
SDO/MOSI,SerialDataOutput/MasterOutSlaveIn,在Master上面也被稱為Tx-Channel,作為數(shù)據(jù)的出口,主要用于SPI設(shè)備發(fā)送數(shù)據(jù);
SDI/MISO,SerialDataInput/MasterInSlaveOut,在Master上面也被稱為Rx-Channel,作為數(shù)據(jù)的入口,主要用于SPI設(shè)備接收數(shù)據(jù);
SPI設(shè)備在進(jìn)行通信的過程中,Master設(shè)備和Slave設(shè)備之間會(huì)產(chǎn)生一個(gè)數(shù)據(jù)鏈路回環(huán)(DataLoop),就像上圖所畫的那樣,通過SDO和SDI管腳,SSPSR控制數(shù)據(jù)移入移出SSPBUF,Controller確定SPI總線的通信模式,SCK傳輸時(shí)鐘信號(hào)。
2、Timing.
上圖通過Master設(shè)備與Slave設(shè)備之間交換1Byte數(shù)據(jù)來說明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”說明了本例所使用的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ù)倪^程至少需要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ù)膯挝弧?/p>
例如,我們想要往Master設(shè)備里面的SSPBUF寫入16Byte大小的數(shù)據(jù):首先,給Master設(shè)備的配置寄存器設(shè)置Bus-Width為Byte;然后往Master設(shè)備的Tx-Data移位寄存器在地址總線的入口寫入數(shù)據(jù),每次寫入1Byte大小的數(shù)據(jù)(使用writeb函數(shù));寫完1Byte數(shù)據(jù)之后,Master設(shè)備里面的Tx-Data移位寄存器會(huì)自動(dòng)把從地址總線傳來的1Byte數(shù)據(jù)移入SSPBUF里;上述動(dòng)作一共需要重復(fù)執(zhí)行16次。
Channel-Width的作用是指定Master設(shè)備與Slave設(shè)備之間數(shù)據(jù)傳輸?shù)膯挝弧EcBus-Width相似,Master設(shè)備內(nèi)部的移位寄存器會(huì)依據(jù)Channel-Width自動(dòng)地把數(shù)據(jù)從Master-SSPBUF里通過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ù)為無效數(shù)據(jù)這樣的情況。
4、SSPBUF.
我們知道,在每個(gè)時(shí)鐘周期內(nèi),Master與Slave之間交換的數(shù)據(jù)其實(shí)都是SPI
內(nèi)部移位寄存器從SSPBUF里面拷貝的。我們可以通過往SSPBUF對應(yīng)的寄存器(Tx-Data/Rx-Dataregister)里讀寫數(shù)據(jù),間接地操控SPI設(shè)備內(nèi)部的SSPBUF。
例如,在發(fā)送數(shù)據(jù)之前,我們應(yīng)該先往Master的Tx-Data寄存器寫入將要發(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中移出,通過Master-SDO管腳傳給Slave-SDI管腳,Slave-SSPSR則把從Slave-SDI接收到的數(shù)據(jù)移入Slave-SSPBUF里。與此同時(shí),Slave-SSPBUF里面的數(shù)據(jù)根據(jù)每次接收數(shù)據(jù)的大小(Channel-Width),通過Slave-SDO發(fā)往Master-SDI,Master-SSPSR再把從Master-SDI接收的數(shù)據(jù)移入Master-SSPBUF。在單次數(shù)據(jù)傳輸完成之后,用戶程序可以通過從Master設(shè)備的Rx-Data寄存器讀取Master設(shè)備數(shù)據(jù)交換得到的數(shù)據(jù)。
5、Controller.
Master設(shè)備里面的Controller主要通過時(shí)鐘信號(hào)(ClockSignal)以及片選信號(hào)(SlaveSelectSignal)來控制Slave設(shè)備。Slave設(shè)備會(huì)一直等待,直到接收到Master設(shè)備發(fā)過來的片選信號(hào),然后根據(jù)時(shí)鐘信號(hào)來工作。
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)拉高電平。
評(píng)論
查看更多