一、概述
SPI,串行外圍設備接口,是Motorola公司推出的一種同步串行接口技術.SPI總線在物理上是通過接在外圍設備微控制器(PICmicro)上面的微處理控制單元(MCU)上叫作同步串行端口(SynchronousSerialPort)的模塊(Module)來實現的,它允許MCU以全雙工的同步串行方式,與各種外圍設備進行高速數據通信。
SPI主要應用在EEPROM,Flash,實時時鐘(RTC),數模轉換器(ADC),數字信號處理器(DSP)以及數字信號解碼器之間。它在芯片中只占用四根管腳(Pin)用來控制以及數據傳輸,節約了芯片的pin數目,同時為PCB在布局上節省了空間。正是出于這種簡單易用的特性,現在越來越多的芯片上都集成了SPI技術。
二、特點
1、采用主-從模式(Master-Slave)的控制方式
SPI規定了兩個SPI設備之間通信必須由主設備(Master)來控制次設備(Slave)。一個Master設備可以通過提供Clock以及對Slave設備進行片選(SlaveSelect)來控制多個Slave設備,SPI協議還規定Slave設備的Clock由Master設備通過SCK管腳提供給Slave設備,Slave設備本身不能產生或控制Clock,沒有Clock則Slave設備不能正常工作。
2、采用同步方式(Synchronous)傳輸數據
Master設備會根據將要交換的數據來產生相應的時鐘脈沖(ClockPulse),時鐘脈沖組成了時鐘信號(ClockSignal),時鐘信號通過時鐘極性(CPOL)和時鐘相位(CPHA)控制著兩個SPI設備間何時數據交換以及何時對接收到的數據進行采樣,來保證數據在兩個設備之間是同步傳輸的。
3、數據交換(DataExchanges)
SPI設備間的數據傳輸之所以又被稱為數據交換,是因為SPI協議規定一個SPI設備不能在數據通信過程中僅僅只充當一個“發送者(Transmitter)”或者“接收者(Receiver)”。在每個Clock周期內,SPI設備都會發送并接收一個bit大小的數據,相當于該設備有一個bit大小的數據被交換了。
一個Slave設備要想能夠接收到Master發過來的控制信號,必須在此之前能夠被Master設備進行訪問(Access)。所以,Master設備必須首先通過SS/CSpin對Slave設備進行片選,把想要訪問的Slave設備選上。
在數據傳輸的過程中,每次接收到的數據必須在下一次數據傳輸之前被采樣。如果之前接收到的數據沒有被讀取,那么這些已經接收完成的數據將有可能會被丟棄,導致SPI物理模塊最終失效。因此,在程序中一般都會在SPI傳輸完數據后,去讀取SPI設備里的數據,即使這些數據(DummyData)在我們的程序里是無用的。
三、工作機制
1、概述
上圖只是對SPI設備間通信的一個簡單的描述,下面就來解釋一下圖中所示的幾個組件(Module):
SSPBUF,SynchronousSerialPortBuffer,泛指SPI設備里面的內部緩沖區,一般在物理上是以FIFO的形式,保存傳輸過程中的臨時數據;
SSPSR,SynchronousSerialPortRegister,泛指SPI設備里面的移位寄存器(ShiftRegitser),它的作用是根據設置好的數據位寬(bit-width)把數據移入或者移出SSPBUF;
Controller,泛指SPI設備里面的控制寄存器,可以通過配置它們來設置SPI總線的傳輸模式。
通常情況下,我們只需要對上圖所描述的四個管腳(pin)進行編程即可控制整個SPI設備之間的數據通信:
SCK,SerialClock,主要的作用是Master設備往Slave設備傳輸時鐘信號,控制數據交換的時機以及速率;
SS/CS,SlaveSelect/ChipSelect,用于Master設備片選Slave設備,使被選中的Slave設備能夠被Master設備所訪問;
SDO/MOSI,SerialDataOutput/MasterOutSlaveIn,在Master上面也被稱為Tx-Channel,作為數據的出口,主要用于SPI設備發送數據;
SDI/MISO,SerialDataInput/MasterInSlaveOut,在Master上面也被稱為Rx-Channel,作為數據的入口,主要用于SPI設備接收數據;
SPI設備在進行通信的過程中,Master設備和Slave設備之間會產生一個數據鏈路回環(DataLoop),就像上圖所畫的那樣,通過SDO和SDI管腳,SSPSR控制數據移入移出SSPBUF,Controller確定SPI總線的通信模式,SCK傳輸時鐘信號。
2、Timing.
上圖通過Master設備與Slave設備之間交換1Byte數據來說明SPI協議的工作機制。
首先,在這里解釋一下兩個概念:
CPOL:時鐘極性,表示SPI在空閑時,時鐘信號是高電平還是低電平。若CPOL被設為1,那么該設備在空閑時SCK管腳下的時鐘信號為高電平。當CPOL被設為0時則正好相反。
CPHA:時鐘相位,表示SPI設備是在SCK管腳上的時鐘信號變為上升沿時觸發數據采樣,還是在時鐘信號變為下降沿時觸發數據采樣。若CPHA被設置為1,則SPI設備在時鐘信號變為下降沿時觸發數據采樣,在上升沿時發送數據。當CPHA被設為0時也正好相反。
上圖里的“Mode1,1”說明了本例所使用的SPI數據傳輸模式被設置成CPOL=1,CPHA=1.這樣,在一個Clock周期內,每個單獨的SPI設備都能以全雙工(Full-Duplex)的方式,同時發送和接收1bit數據,即相當于交換了1bit大小的數據。如果SPI總線的Channel-Width被設置成Byte,表示SPI總線上每次數據傳輸的最小單位為Byte,那么掛載在該SPI總線的設備每次數據傳輸的過程至少需要8個Clock周期(忽略設備的物理延遲)。因此,SPI總線的頻率越快,Clock周期越短,則SPI設備間數據交換的速率就越快。
3、SSPSR.
SSPSR是SPI設備內部的移位寄存器(ShiftRegister)。它的主要作用是根據SPI時鐘信號狀態,往SSPBUF里移入或者移出數據,每次移動的數據大小由Bus-Width以及Channel-Width所決定。
Bus-Width的作用是指定地址總線到Master設備之間數據傳輸的單位。
例如,我們想要往Master設備里面的SSPBUF寫入16Byte大小的數據:首先,給Master設備的配置寄存器設置Bus-Width為Byte;然后往Master設備的Tx-Data移位寄存器在地址總線的入口寫入數據,每次寫入1Byte大小的數據(使用writeb函數);寫完1Byte數據之后,Master設備里面的Tx-Data移位寄存器會自動把從地址總線傳來的1Byte數據移入SSPBUF里;上述動作一共需要重復執行16次。
Channel-Width的作用是指定Master設備與Slave設備之間數據傳輸的單位。與Bus-Width相似,Master設備內部的移位寄存器會依據Channel-Width自動地把數據從Master-SSPBUF里通過Master-SDO管腳搬運到Slave設備里的Slave-SDI引腳,Slave-SSPSR再把每次接收的數據移入Slave-SSPBUF里。
通常情況下,Bus-Width總是會大于或等于Channel-Width,這樣能保證不會出現因Master與Slave之間數據交換的頻率比地址總線與Master之間的數據交換頻率要快,導致SSPBUF里面存放的數據為無效數據這樣的情況。
4、SSPBUF.
我們知道,在每個時鐘周期內,Master與Slave之間交換的數據其實都是SPI
內部移位寄存器從SSPBUF里面拷貝的。我們可以通過往SSPBUF對應的寄存器(Tx-Data/Rx-Dataregister)里讀寫數據,間接地操控SPI設備內部的SSPBUF。
例如,在發送數據之前,我們應該先往Master的Tx-Data寄存器寫入將要發
送出去的數據,這些數據會被Master-SSPSR移位寄存器根據Bus-Width自動移入Master-SSPBUF里,然后這些數據又會被Master-SSPSR根據Channel-Width從Master-SSPBUF中移出,通過Master-SDO管腳傳給Slave-SDI管腳,Slave-SSPSR則把從Slave-SDI接收到的數據移入Slave-SSPBUF里。與此同時,Slave-SSPBUF里面的數據根據每次接收數據的大小(Channel-Width),通過Slave-SDO發往Master-SDI,Master-SSPSR再把從Master-SDI接收的數據移入Master-SSPBUF。在單次數據傳輸完成之后,用戶程序可以通過從Master設備的Rx-Data寄存器讀取Master設備數據交換得到的數據。
5、Controller.
Master設備里面的Controller主要通過時鐘信號(ClockSignal)以及片選信號(SlaveSelectSignal)來控制Slave設備。Slave設備會一直等待,直到接收到Master設備發過來的片選信號,然后根據時鐘信號來工作。
Master設備的片選操作必須由程序所實現。例如:由程序把SS/CS管腳的時鐘信號拉低電平,完成SPI設備數據通信的前期工作;當程序想讓SPI設備結束數據通信時,再把SS/CS管腳上的時鐘信號拉高電平。
評論
查看更多