SPI協(xié)議是什么?有哪些優(yōu)點?
目錄
先說串口
SPI通訊協(xié)議
SPI特性
模式編號
多從機模式
優(yōu)缺點
編程實現(xiàn)
先說串口
之前寫過一篇UART,通用串行異步通訊協(xié)議,感興趣可以參考一下《我打賭!你還不會UART》;因為UART沒有時鐘信號,無法控制何時發(fā)送數(shù)據(jù),也無法保證雙發(fā)按照完全相同的速度接收數(shù)據(jù)。因此,雙方以不同的速度進行數(shù)據(jù)接收和發(fā)送,就會出現(xiàn)問題。
如果要解決這個問題,UART為每個字節(jié)添加額外的起始位和停止位,以幫助接收器在數(shù)據(jù)到達時進行同步;
雙方還必須事先就傳輸速度達成共識(設(shè)置相同的波特率,例如每秒9600位)。
傳輸速率如果有微小差異不是問題,因為接收器會在每個字節(jié)的開頭重新同步。相應(yīng)的協(xié)議如下圖所示;
串口傳輸?shù)倪^程
如果您注意到上圖中的11001010不等于0x53,這是一個細節(jié)。串口協(xié)議通常會首先發(fā)送最低有效位,因此最小位在最左邊LSB。低四位字節(jié)實際上是0011 = 0x3,高四位字節(jié)是0101 = 0x5。
異步串行工作得很好,但是在每個字節(jié)發(fā)送的時候都需要額外的起始位和停止位以及在發(fā)送和接收數(shù)據(jù)所需的復(fù)雜硬件方面都有很多開銷。
不難發(fā)現(xiàn),如果接收端和發(fā)送端設(shè)置的速度都不一致,那么接收到的數(shù)據(jù)將是垃圾(亂碼)。
下面開始講一下SPI協(xié)議,會有哪些優(yōu)點。
SPI通訊協(xié)議
于是我們想有沒有更好一點的串行通訊方式;相比較于UART,SPI的工作方式略有不同。
SPI是一個同步的數(shù)據(jù)總線,也就是說它是用單獨的數(shù)據(jù)線和一個單獨的時鐘信號來保證發(fā)送端和接收端的完美同步。
時鐘是一個振蕩信號,它告訴接收端在確切的時機對數(shù)據(jù)線上的信號進行采樣。
產(chǎn)生時鐘的一側(cè)稱為主機,另一側(cè)稱為從機。總是只有一個主機(一般來說可以是微控制器/MCU),但是可以有多個從機(后面詳細介紹);
數(shù)據(jù)的采集時機可能是時鐘信號的上升沿(從低到高)或下降沿(從高到低)。
具體要看對SPI的配置;
整體的傳輸大概可以分為以下幾個過程:
主機先將NSS信號拉低,這樣保證開始接收數(shù)據(jù);
當接收端檢測到時鐘的邊沿信號時,它將立即讀取數(shù)據(jù)線上的信號,這樣就得到了一位數(shù)據(jù)(1bit);
由于時鐘是隨數(shù)據(jù)一起發(fā)送的,因此指定數(shù)據(jù)的傳輸速度并不重要,盡管設(shè)備將具有可以運行的最高速度(稍后我們將討論選擇合適的時鐘邊沿和速度)。
主機發(fā)送到從機時:主機產(chǎn)生相應(yīng)的時鐘信號,然后數(shù)據(jù)一位一位地將從MOSI信號線上進行發(fā)送到從機;
主機接收從機數(shù)據(jù):如果從機需要將數(shù)據(jù)發(fā)送回主機,則主機將繼續(xù)生成預(yù)定數(shù)量的時鐘信號,并且從機會將數(shù)據(jù)通過MISO信號線發(fā)送;
具體如下圖所示;
SPI的時序
注意,SPI是“全雙工”(具有單獨的發(fā)送和接收線路),因此可以在同一時間發(fā)送和接收數(shù)據(jù),另外SPI的接收硬件可以是一個簡單的移位寄存器。這比異步串行通信所需的完整UART要簡單得多,并且更加便宜;
SPI特性
SPI總線包括4條邏輯線,定義如下:
MISO:Master input slave output 主機輸入,從機輸出(數(shù)據(jù)來自從機);
MOSI:Master output slave input 主機輸出,從機輸入(數(shù)據(jù)來自主機);
SCLK :Serial Clock 串行時鐘信號,由主機產(chǎn)生發(fā)送給從機;
SS:Slave Select 片選信號,由主機發(fā)送,以控制與哪個從機通信,通常是低電平有效信號。
其他制造商可能會遵循其他命名規(guī)則,但是最終他們指的相同的含義。以下是一些常用術(shù)語;
MISO也可以是SIMO,DOUT,DO,SDO或SO(在主機端);
MOSI也可以是SOMI,DIN,DI,SDI或SI(在主機端);
NSS也可以是CE,CS或SSEL;
SCLK也可以是SCK;
本文將按照以下命名進行講解[MISO, MOSI, SCK,NSS]
下圖顯示了單個主機和單個從機之間的典型SPI連接。
主從連接時鐘頻率
SPI總線上的主機必須在通信開始時候配置并生成相應(yīng)的時鐘信號。在每個SPI時鐘周期內(nèi),都會發(fā)生全雙工數(shù)據(jù)傳輸。
主機在MOSI線上發(fā)送一位數(shù)據(jù),從機讀取它,而從機在MISO線上發(fā)送一位數(shù)據(jù),主機讀取它。
就算只進行單向的數(shù)據(jù)傳輸,也要保持這樣的順序。這就意味著無論接收任何數(shù)據(jù),必須實際發(fā)送一些東西!在這種情況下,我們稱其為虛擬數(shù)據(jù);
從理論上講,只要實際可行,時鐘速率就可以是您想要的任何速率,當然這個速率受限于每個系統(tǒng)能提供多大的系統(tǒng)時鐘頻率,以及最大的SPI傳輸速率。
時鐘極性 CKP/Clock Polarity
除了配置串行時鐘速率(頻率)外,SPI主設(shè)備還需要配置時鐘極性。
根據(jù)硬件制造商的命名規(guī)則不同,時鐘極性通常寫為CKP或CPOL。時鐘極性和相位共同決定讀取數(shù)據(jù)的方式,比如信號上升沿讀取數(shù)據(jù)還是信號下降沿讀取數(shù)據(jù);
CKP可以配置為1或0。這意味著您可以根據(jù)需要將時鐘的默認狀態(tài)(IDLE)設(shè)置為高或低。極性反轉(zhuǎn)可以通過簡單的邏輯逆變器實現(xiàn)。您必須參考設(shè)備的數(shù)據(jù)手冊才能正確設(shè)置CKP和CKE。
CKP = 0:時鐘空閑IDLE為低電平 0;CKP = 1:時鐘空閑IDLE為高電平1;時鐘相位 CKE /Clock Phase (Edge)
除配置串行時鐘速率和極性外,SPI主設(shè)備還應(yīng)配置時鐘相位(或邊沿)。根據(jù)硬件制造商的不同,時鐘相位通常寫為CKE或CPHA;
顧名思義,時鐘相位/邊沿,也就是采集數(shù)據(jù)時是在時鐘信號的具體相位或者邊沿;
CKE = 0:在時鐘信號SCK的第一個跳變沿采樣;CKE = 1:在時鐘信號SCK的第二個跳變沿采樣;時鐘配置總結(jié)
綜上幾種情況,下圖總結(jié)了所有時鐘配置組合,并突出顯示了實際采樣數(shù)據(jù)的時刻;
其中黑色線為采樣數(shù)據(jù)的時刻;
藍色線為SCK時鐘信號;
具體如下圖所示;
模式編號
SPI的時鐘極性和相位的配置通常稱為 SPI模式,所有可能的模式都遵循以下約定;具體如下表所示;
SPI ModeCPOLCPHA0 [00]001 [01]012 [10]103 [11]11
除此之外,我們還應(yīng)該仔細檢查微控制器數(shù)據(jù)手冊中包含的模式表,以確保一切正常。
多從機模式
前面說到SPI總線必須有一個主機,可以有多個從機,那么具體連接到SPI總線的方法有以下兩種:
第一種方法:多NSS
通常,每個從機都需要一條單獨的SS線。如果要和特定的從機進行通訊,可以將相應(yīng)的NSS信號線拉低,并保持其他NSS信號線的狀態(tài)為高電平;如果同時將兩個NSS信號線拉低,則可能會出現(xiàn)亂碼,因為從機可能都試圖在同一條MISO線上傳輸數(shù)據(jù),最終導(dǎo)致接收數(shù)據(jù)亂碼。
具體連接方式如下圖所示;
多NSS連接
第二種方法:菊花鏈
在數(shù)字通信世界中,在設(shè)備信號(總線信號或中斷信號)以串行的方式從一 個設(shè)備依次傳到下一個設(shè)備,不斷循環(huán)直到數(shù)據(jù)到達目標設(shè)備的方式被稱為菊花鏈。
菊花鏈的最大缺點是因為是信號串行傳輸,所以一旦數(shù)據(jù)鏈路中的某設(shè)備發(fā)生故障的時候,它下面優(yōu)先級較低的設(shè)備就不可能得到服務(wù)了;另一方面,距離主機越遠的從機,獲得服務(wù)的優(yōu)先級越低,所以需要安排好從機的優(yōu)先級,并且設(shè)置總線檢測器,如果某個從機超時,則對該從機進行短路,防止單個從機損壞造成整個鏈路崩潰的情況;
具體的連接如下圖所示;
菊花鏈連接
其中紅線加粗為數(shù)據(jù)的流向;
所以最終的數(shù)據(jù)流向圖可以表示為:
數(shù)據(jù)流圖
SCK為時鐘信號,8clks表示8個邊沿信號;
其中D為數(shù)據(jù),X為無效數(shù)據(jù);
所以不難發(fā)現(xiàn),菊花鏈模式充分使用了SPI其移位寄存器的功能,整個鏈充當通信移位寄存器,每個從機在下一個時鐘周期將輸入數(shù)據(jù)復(fù)制到輸出。
優(yōu)缺點SPI通訊的優(yōu)勢
使SPI作為串行通信接口脫穎而出的原因很多;
全雙工串行通信;高速數(shù)據(jù)傳輸速率。簡單的軟件配置;極其靈活的數(shù)據(jù)傳輸,不限于8位,它可以是任意大小的字;非常簡單的硬件結(jié)構(gòu)。從站不需要唯一地址(與I2C不同)。從機使用主機時鐘,不需要精密時鐘振蕩器/晶振(與UART不同)。不需要收發(fā)器(與CAN不同)。SPI的缺點沒有硬件從機應(yīng)答信號(主機可能在不知情的情況下無處發(fā)送);通常僅支持一個主設(shè)備;需要更多的引腳(與I2C不同);沒有定義硬件級別的錯誤檢查協(xié)議;與RS-232和CAN總線相比,只能支持非常短的距離;編程實現(xiàn)
下面是通過STM32的cubemx自動生成的HAL庫代碼,比較簡單,截取了其中一部分,具體如下;
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER; //主機模式
hspi1.Init.Direction = SPI_DIRECTION_2LINES; //全雙工
hspi1.Init.DataSize = SPI_DATASIZE_8BIT; //數(shù)據(jù)位為8位
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; //CPOL=0
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; //CPHA為數(shù)據(jù)線的第一個變化沿
hspi1.Init.NSS = SPI_NSS_SOFT; //軟件控制NSS
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分頻,32M/2=16MHz
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; //最高位先發(fā)送
hspi1.Init.TIMode = SPI_TIMODE_DISABLE; //TIMODE模式關(guān)閉
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC關(guān)閉
hspi1.Init.CRCPolynomial = 10; //默認值,無效
if (HAL_SPI_Init(&hspi1) 。 HAL_OK) //初始化
{
_Error_Handler(__FILE__, __LINE__);
}
}
//發(fā)送數(shù)據(jù)
HAL_StatusTypeDef
HAL_SPI_Transmit(SPI_HandleTypeDef *hspi,
uint8_t *pData,
uint16_t Size,
uint32_t Timeout);
//接收數(shù)據(jù)
HAL_StatusTypeDef
HAL_SPI_Receive(SPI_HandleTypeDef *hspi,
uint8_t *pData,
uint16_t Size,
uint32_t Timeout);
-THE END-
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
11月20日火熱報名中>> 2024 智能家居出海論壇
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【在線會議】多物理場仿真助跑新能源汽車
推薦專題
-
10 臺積電7nm停供中國大陸
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市