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