SPI協(xié)議簡(jiǎn)介
上次局哥給大家介紹了UART協(xié)議,這次給大家詳細(xì)介紹一下SPI協(xié)議的相關(guān)知識(shí)(PS:本文介紹十分詳細(xì),篇幅較長(zhǎng),建議收藏閱讀)。
SPI(serial peripheral interface)是一種同步串行通信協(xié)議,由一個(gè)主設(shè)備和一個(gè)或多個(gè)從設(shè)備組成,主設(shè)備啟動(dòng)與從設(shè)備的同步通信,從而完成數(shù)據(jù)的交換。SPI是一種高速全雙工同步通信總線(xiàn),標(biāo)準(zhǔn)的SPI僅僅使用4個(gè)引腳,主要應(yīng)用在 EEPROM, Flash, 實(shí)時(shí)時(shí)鐘(RTC), 數(shù)模轉(zhuǎn)換器(ADC), 數(shù)字信號(hào)處理器(DSP) 以及數(shù)字信號(hào)解碼器之間。
如下圖所示,在物理層次上,SPI協(xié)議只需要用四根管腳 (Pin) 用來(lái)控制以及數(shù)據(jù)傳輸, 節(jié)約了芯片的 pin 數(shù)目, 同時(shí)為 PCB 在布局上節(jié)省了空間。正是出于這種簡(jiǎn)單易用的特性, 現(xiàn)在越來(lái)越多的芯片上都集成了 SPI協(xié)議。
SPI協(xié)議分類(lèi)
4線(xiàn)制SPI
當(dāng)我們談到SPI時(shí),默認(rèn)情況下都是指標(biāo)準(zhǔn)的4線(xiàn)制Motorola SPI協(xié)議,即SCLK,MOSI,MISO和CS共4根數(shù)據(jù)線(xiàn),標(biāo)準(zhǔn)4線(xiàn)制的好處是可以實(shí)現(xiàn)數(shù)據(jù)的全雙工傳輸。當(dāng)只有一個(gè)主機(jī)和一個(gè)從機(jī)設(shè)備時(shí),只需要一個(gè)CS,多個(gè)從機(jī)需要多個(gè)CS,各數(shù)據(jù)線(xiàn)的介紹:
SCLK: 時(shí)鐘信號(hào),時(shí)鐘頻率即SPI速率,和SPI模式有關(guān)。
MOSI:主機(jī)輸出,從機(jī)輸入,主機(jī)數(shù)據(jù)。
MISO:主機(jī)輸入,從機(jī)輸出。
CS/SS:從機(jī)設(shè)備選擇,低電平有效。
3線(xiàn)制SPI
對(duì)于3線(xiàn)制SPI,根據(jù)不同的應(yīng)用場(chǎng)景,主要有以下2種類(lèi)型:
只有3根線(xiàn):SCLK,MOSI和CS,沒(méi)有MISO數(shù)據(jù)線(xiàn),適用于單工通訊。
只有3根線(xiàn):SCLK,SDIO和CS,SDIO作為雙向端口,適用于半雙工通訊。
SPI特點(diǎn)
1. 主從模式
與IIC類(lèi)似,SPI也是采用主從方式工作,主機(jī)通常為FPGA、MCU或DSP等可編程控制器,從機(jī)通常為EPROM、Flash,AD/DA,音視頻處理芯片等設(shè)備。一般由SCLK、CS、MOSI,MISO四根線(xiàn)組成,有的地方可能是:SCK、SS、SDI、SDO等名稱(chēng),都是一樣的含義,當(dāng)有多個(gè)從機(jī)存在時(shí),通過(guò)CS來(lái)選擇要控制的從機(jī)設(shè)備。
2. 同步模式
在這里介紹兩個(gè)概念:CPOL和CPHA。CPOL:clock polarity 時(shí)鐘的極性;表示 SPI 在空閑時(shí), 時(shí)鐘信號(hào)是高電平還是低電平。CPHA:clock phase 時(shí)鐘的相位;表示 SPI 設(shè)備是在 SCK 管腳上的時(shí)鐘信號(hào)變?yōu)樯仙貢r(shí)觸發(fā)數(shù)據(jù)采樣, 還是在時(shí)鐘信號(hào)變?yōu)橄陆笛貢r(shí)觸發(fā)數(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è)備之間是同步傳輸的。
3. 數(shù)據(jù)交換
SPI 設(shè)備間的數(shù)據(jù)傳輸之所以又被稱(chēng)為數(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ù), 相當(dāng)于該設(shè)備有一個(gè) bit 大小的數(shù)據(jù)被交換了。
SPI總線(xiàn)上的主機(jī)必須在通信開(kāi)始時(shí)候配置并生成相應(yīng)的時(shí)鐘信號(hào)。在每個(gè)SPI時(shí)鐘周期內(nèi),都會(huì)發(fā)生全雙工數(shù)據(jù)傳輸。主機(jī)在MOSI線(xiàn)上發(fā)送一位數(shù)據(jù),從機(jī)讀取它,而從機(jī)在MISO線(xiàn)上發(fā)送一位數(shù)據(jù),主機(jī)讀取它。就算只進(jìn)行單向的數(shù)據(jù)傳輸,也要保持這樣的順序。這就意味著無(wú)論接收任何數(shù)據(jù),必須實(shí)際發(fā)送一些東西!在這種情況下,我們稱(chēng)其為虛擬數(shù)據(jù)。
SPI工作模式
既然是進(jìn)行數(shù)據(jù)傳輸,雙方就要明確從機(jī)在什么時(shí)刻去采樣主機(jī)發(fā)出的數(shù)據(jù),主機(jī)在什么時(shí)刻去讀取從機(jī)發(fā)來(lái)的數(shù)據(jù)。對(duì)于STM32等MCU自帶的硬件SPI外設(shè)來(lái)說(shuō),可能沒(méi)有那么重要,只需要配置一下模式就行了,但是對(duì)于使用使用GPIO模擬或者FPGA來(lái)實(shí)現(xiàn)SPI的時(shí)序,這一點(diǎn)是非常非常重要的,這就涉及到SPI標(biāo)準(zhǔn)協(xié)議的工作模式了,通過(guò)CPOL(Clock Polarity)時(shí)鐘極性和CPHA(Clock Phase)時(shí)鐘相位的不同組合,可以分為4種模式。
四種模式的描述如下:
更進(jìn)一步的具體描述如下:
CPHA=0:
CPHA=1:
多slave模式
在實(shí)際應(yīng)用中,往往存在需要一個(gè)master控制多個(gè)slave的情況,這時(shí)候就需要發(fā)揮廣大程序員同志們的聰明才智了。
方法一:用SS/CS端控制多slave選通
通常,每個(gè)從機(jī)都需要一條單獨(dú)的SS線(xiàn)。如果要和特定的從機(jī)進(jìn)行通訊,可以將相應(yīng)的NSS信號(hào)線(xiàn)拉低,并保持其他NSS信號(hào)線(xiàn)的狀態(tài)為高電平;如果同時(shí)將兩個(gè)NSS信號(hào)線(xiàn)拉低,則可能會(huì)出現(xiàn)亂碼,因?yàn)閺臋C(jī)可能都試圖在同一條MISO線(xiàn)上傳輸數(shù)據(jù),最終導(dǎo)致接收數(shù)據(jù)亂碼。
方法二:采用菊花鏈的形式
菊花鏈作為SPI通信中較為“高端”的應(yīng)用方式,在設(shè)備信號(hào)(總線(xiàn)信號(hào)或中斷信號(hào))以串行的方式從一 個(gè)設(shè)備依次傳到下一個(gè)設(shè)備,不斷循環(huán)直到數(shù)據(jù)到達(dá)目標(biāo)設(shè)備。
菊花鏈的最大缺點(diǎn)是因?yàn)槭切盘?hào)串行傳輸,所以一旦數(shù)據(jù)鏈路中的某設(shè)備發(fā)生故障的時(shí)候,它下面優(yōu)先級(jí)較低的設(shè)備就不可能得到服務(wù)了;另一方面,距離主機(jī)越遠(yuǎn)的從機(jī),獲得服務(wù)的優(yōu)先級(jí)越低,所以需要安排好從機(jī)的優(yōu)先級(jí),并且設(shè)置總線(xiàn)檢測(cè)器。
所以最終的數(shù)據(jù)流向圖可以表示為:
總結(jié)
又到了例行的總結(jié)時(shí)間。SPI作為應(yīng)用最為廣泛的通信協(xié)議之一,其有著眾多的優(yōu)點(diǎn),當(dāng)然也不乏缺點(diǎn)。
優(yōu)點(diǎn)
全雙工串行通信;
高速數(shù)據(jù)傳輸速率;
簡(jiǎn)單的軟件配置;
極其靈活的數(shù)據(jù)傳輸,不限于8位,它可以是任意大小的字;
非常簡(jiǎn)單的硬件結(jié)構(gòu)。從站不需要唯一地址(與I2C不同)。從機(jī)使用主機(jī)時(shí)鐘,不需要精密時(shí)鐘振蕩器/晶振(與UART不同)。不需要收發(fā)器(與CAN不同)。
缺點(diǎn)
沒(méi)有硬件從機(jī)應(yīng)答信號(hào)(主機(jī)可能在不知情的情況下無(wú)處發(fā)送);
通常僅支持一個(gè)主設(shè)備;
需要更多的引腳(與I2C不同);
沒(méi)有定義硬件級(jí)別的錯(cuò)誤檢查協(xié)議;
與RS-232和CAN總線(xiàn)相比,只能支持非常短的距離。
參考文獻(xiàn):
https://blog.csdn.net/u010632165/SPI協(xié)議詳解(圖文并茂+超詳細(xì))
https://blog.csdn.net/whik1194/article/一文看懂SPI協(xié)議