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