1、SPI協(xié)議簡(jiǎn)介
1.1 SPI協(xié)議概括
SPI,是英語(yǔ)Serial Peripheral interface的縮寫(xiě),顧名思義就是串行外圍設(shè)備接口。是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應(yīng)用在 EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD轉(zhuǎn)換器,還有數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器之間。SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡(jiǎn)單易用的特性,現(xiàn)在越來(lái)越多的芯片集成了這種通信協(xié)議,比如MSP430單片機(jī)系列處理器。
1.2 SPI優(yōu)點(diǎn)
1):支持全雙工通信
2):通信簡(jiǎn)單
3):數(shù)據(jù)傳輸速率快
1.3 缺點(diǎn)
沒(méi)有指定的流控制,沒(méi)有應(yīng)答機(jī)制確認(rèn)是否接收到數(shù)據(jù),所以跟IIC總線協(xié)議比較在數(shù)據(jù)
可靠性上有一定的缺陷。
2、 特點(diǎn)
2.1 采用主-從模式(Master-Slave) 的控制方式
SPI 規(guī)定了兩個(gè) SPI 設(shè)備之間通信必須由主設(shè)備 (Master) 來(lái)控制次設(shè)備 (Slave)。 一個(gè) Master 設(shè)備可以通過(guò)提供 Clock 以及對(duì) Slave 設(shè)備進(jìn)行片選 (Slave Select) 來(lái)控制多個(gè) Slave 設(shè)備,SPI 協(xié)議還規(guī)定 Slave 設(shè)備的 Clock 由 Master 設(shè)備通過(guò) SCK 管腳提供給 Slave 設(shè)備, Slave 設(shè)備本身不能產(chǎn)生或控制 Clock,沒(méi)有 Clock 則 Slave 設(shè)備不能正常工作。
2.2 采用同步方式(Synchronous)傳輸數(shù)據(jù)
Master 設(shè)備會(huì)根據(jù)將要交換的數(shù)據(jù)來(lái)產(chǎn)生相應(yīng)的時(shí)鐘脈沖(Clock Pulse),時(shí)鐘脈沖組成了時(shí)鐘信號(hào)(Clock Signal) ,時(shí)鐘信號(hào)通過(guò)時(shí)鐘極性 (CPOL) 和 時(shí)鐘相位 (CPHA) 控制著兩個(gè) SPI 設(shè)備間何時(shí)數(shù)據(jù)交換以及何時(shí)對(duì)接收到的數(shù)據(jù)進(jìn)行采樣,來(lái)保證數(shù)據(jù)在兩個(gè)設(shè)備之間是同步傳輸?shù)?/strong>。
2.3 數(shù)據(jù)交換(Data Exchanges)
SPI 設(shè)備間的數(shù)據(jù)傳輸之所以又被稱為數(shù)據(jù)交換,是因?yàn)?SPI 協(xié)議規(guī)定一個(gè) SPI 設(shè)備不能在數(shù)據(jù)通信過(guò)程中僅僅只充當(dāng)一個(gè) "發(fā)送者(Transmitter)" 或者 "接收者(Receiver)"。在每個(gè) Clock 周期內(nèi),SPI 設(shè)備都會(huì)發(fā)送并接收一個(gè) bit 大小的數(shù)據(jù)(不管主設(shè)備好還是從設(shè)備),相當(dāng)于該設(shè)備有一個(gè) bit 大小的數(shù)據(jù)被交換了。一個(gè) Slave 設(shè)備要想能夠接收到 Master 發(fā)過(guò)來(lái)的控制信號(hào),必須在此之前能夠被 Master 設(shè)備進(jìn)行訪問(wèn) (Access)。所以,Master 設(shè)備必須首先通過(guò) SS/CS pin 對(duì) Slave 設(shè)備進(jìn)行片選, 把想要訪問(wèn)的 Slave 設(shè)備選上。 在數(shù)據(jù)傳輸?shù)倪^(guò)程中,每次接收到的數(shù)據(jù)必須在下一次數(shù)據(jù)傳輸之前被采樣。如果之前接收到的數(shù)據(jù)沒(méi)有被讀取,那么這些已經(jīng)接收完成的數(shù)據(jù)將有可能會(huì)被丟棄,導(dǎo)致 SPI 物理模塊最終失效。因此,在程序中一般都會(huì)在 SPI 傳輸完數(shù)據(jù)后,去讀取 SPI 設(shè)備里的數(shù)據(jù), 即使這些數(shù)據(jù)(Dummy Data)在我們的程序里是無(wú)用的(雖然發(fā)送后緊接著的讀取是無(wú)意義的,但仍然需要從寄存器中讀出來(lái))。
2.5 SPI只有主模式和從模式之分
SPI沒(méi)有讀和寫(xiě)的說(shuō)法,因?yàn)閷?shí)質(zhì)上每次SPI是主從設(shè)備在交換數(shù)據(jù)。也就是說(shuō),你發(fā)一個(gè)數(shù)據(jù)必然會(huì)收到一個(gè)數(shù)據(jù);你要收一個(gè)數(shù)據(jù)必須也要先發(fā)一個(gè)數(shù)據(jù)。
3、 工作機(jī)制
3.1 概述
上圖只是對(duì) SPI 設(shè)備間通信的一個(gè)簡(jiǎn)單的描述, 下面就來(lái)解釋一下圖中所示的幾個(gè)組件:
- SSPBUF:泛指 SPI 設(shè)備里面的內(nèi)部緩沖區(qū),一般在物理上是以 FIFO 的形式,保存?zhèn)鬏斶^(guò)程中的臨時(shí)數(shù)據(jù);
- SSPSR:泛指 SPI 設(shè)備里面的移位寄存器,它的作用是根據(jù)設(shè)置好的數(shù)據(jù)位寬(bit-width) 把數(shù)據(jù)移入或者移出 SSPBUF;
- Controller:泛指 SPI 設(shè)備里面的控制寄存器,可以通過(guò)配置它們來(lái)設(shè)置 SPI 總線的傳輸模式。
通常情況下,我們只需要對(duì)上圖所描述的四個(gè)管腳(pin) 進(jìn)行編程即可控制整個(gè) SPI 設(shè)備之間的數(shù)據(jù)通信:
- SCK:主要的作用是 Master(主)設(shè)備往 Slave(從)設(shè)備傳輸時(shí)鐘信號(hào), 控制數(shù)據(jù)交換的時(shí)機(jī)以及速率;
- SS/CS:用于 Master(主)設(shè)備片選 Slave (從)設(shè)備,使被選中的 Slave(從)設(shè)備能夠被 Master(主)設(shè)備所訪問(wèn);
- SDO/MOSI:在 Master(主)上面也被稱為 Tx-Channel,作為數(shù)據(jù)的出口,主要用于 SPI 設(shè)備發(fā)送數(shù)據(jù);
- SDI/MISO:在 Master(主)上面也被稱為 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)(Data Loop),就像上圖所畫(huà)的那樣, 通過(guò) SDO 和 SDI 管腳, SSPSR 控制數(shù)據(jù)移入移出 SSPBUF,Controller 確定 SPI 總線的通信模式,SCK 傳輸時(shí)鐘信號(hào)。
SDI(數(shù)據(jù)輸入)、SDO(數(shù)據(jù)輸出)、SCK(時(shí)鐘)、CS(片選)
(1)、SDO/MOSI – 主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入;
(2)、SDI/MISO – 主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出;
(3)、SCK – 時(shí)鐘信號(hào),由主設(shè)備產(chǎn)生;
(4)、CS/SS – 從設(shè)備使能信號(hào),由主設(shè)備控制。當(dāng)有多個(gè)從設(shè)備的時(shí)候,因?yàn)槊總€(gè)從設(shè)備上都有一個(gè)片選引腳接入到主設(shè)備機(jī)中,當(dāng)我們的主設(shè)備和某個(gè)從設(shè)備通信時(shí)將需要將從設(shè)備對(duì)應(yīng)的片選引腳電平拉低或者是拉高。
3.2 SPI相關(guān)的縮寫(xiě)或說(shuō)法
SPI的極性Polarity和相位Phase,最常見(jiàn)的寫(xiě)法是CPOL和CPHA,不過(guò)也有一些其他寫(xiě)法,簡(jiǎn)單總結(jié)如下:
- 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)對(duì)于一個(gè)時(shí)鐘周期內(nèi),有兩個(gè)edge,分別稱為:
- Leading edge=前一個(gè)邊沿=第一個(gè)邊沿,對(duì)于開(kāi)始電壓是1,那么就是1變成0的時(shí)候,對(duì)于開(kāi)始電壓是0,那么就是0變成1的時(shí)候;
- Trailing edge=后一個(gè)邊沿=第二個(gè)邊沿,對(duì)于開(kāi)始電壓是1,那么就是0變成1的時(shí)候(即在第一次1變成0之后,才可能有后面的0變成1),對(duì)于開(kāi)始電壓是0,那么就是1變成0的時(shí)候;
3.3 SPI總線的極性和相位
CPOL配置SPI總線的極性,CPHA配置SPI總線的相位。
3.3.1 SPI總線的極性
極性,會(huì)直接影響SPI總線空閑時(shí)的時(shí)鐘信號(hào)是高電平還是低電平。
CPOL = 1:表示空閑時(shí)是高電平;
CPOL = 0:表示空閑時(shí)是低電平。
由于數(shù)據(jù)傳輸往往是從跳變沿開(kāi)始的,也就表示開(kāi)始傳輸數(shù)據(jù)的時(shí)候,是下降沿還是上升沿。如下圖:
3.3.2 SPI總線的相位
一個(gè)時(shí)鐘周期會(huì)有2個(gè)跳變沿。而相位,直接決定SPI總線從那個(gè)跳變沿開(kāi)始采樣數(shù)據(jù)。
CPHA = 0:表示從第一個(gè)跳變沿開(kāi)始采樣;
CPHA = 1:表示從第二個(gè)跳變沿開(kāi)始采樣。
至于跳變沿究竟是上升沿還是下降沿,這取決于 CPOL。記住, CPHA 只決定是哪個(gè)跳變沿采樣。
3.4 SPI總線傳輸?shù)乃姆N模式
CPOL 和 CPHA 的不同組合,形成了SPI總線的不同模式。
時(shí)鐘極性CPOL是用來(lái)配置SCLK的電平出于哪種狀態(tài)時(shí)是空閑態(tài)或者有效態(tài),時(shí)鐘相位CPHA
是用來(lái)配置數(shù)據(jù)采樣是在第幾個(gè)邊沿:
CPOL=0,表示當(dāng)SCLK=0時(shí)處于空閑態(tài),所以有效狀態(tài)就是SCLK處于高電平時(shí)。
CPOL=1,表示當(dāng)SCLK=1時(shí)處于空閑態(tài),所以有效狀態(tài)就是SCLK處于低電平時(shí)。
CPHA=0,表示數(shù)據(jù)采樣是在第1個(gè)邊沿,數(shù)據(jù)發(fā)送在第2個(gè)邊沿。
CPHA=1,表示數(shù)據(jù)采樣是在第2個(gè)邊沿,數(shù)據(jù)發(fā)送在第1個(gè)邊沿。
例如:
CPOL=0,CPHA=0:此時(shí)空閑態(tài)時(shí),SCLK處于低電平,數(shù)據(jù)采樣是在第1個(gè)邊沿,也就是
SCLK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。
CPOL=0,CPHA=1:此時(shí)空閑態(tài)時(shí),SCLK處于低電平,數(shù)據(jù)發(fā)送是在第1個(gè)邊沿,也就是
SCLK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。
CPOL=1,CPHA=0:此時(shí)空閑態(tài)時(shí),SCLK處于高電平,數(shù)據(jù)采集是在第1個(gè)邊沿,也就是
SCLK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。
CPOL=1,CPHA=1:此時(shí)空閑態(tài)時(shí),SCLK處于高電平,數(shù)據(jù)發(fā)送是在第1個(gè)邊沿,也就是
SCLK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。
需要注意的是:我們的主設(shè)備能夠控制時(shí)鐘,因?yàn)镾PI通信并不像UART或者IIC通信那樣有專門(mén)的通信周期,有專門(mén)的通信起始信號(hào),有專門(mén)的通信結(jié)束信號(hào);所以SPI協(xié)議能夠通過(guò)控制時(shí)鐘信號(hào)線,當(dāng)沒(méi)有數(shù)據(jù)交流的時(shí)候我們的時(shí)鐘線要么是保持高電平要么是保持低電平。
-
SPI
+關(guān)注
關(guān)注
17文章
1684瀏覽量
91068 -
SPI協(xié)議
+關(guān)注
關(guān)注
0文章
18瀏覽量
8349
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論