引言
SPI是串行外設(shè)接口的縮寫,是一種高速的,全雙工,同步的通信總線。由于SPI高速和同步的特性,使其成為嵌入式系統(tǒng)和小型設(shè)備中使用最廣泛的幾種通信接口之一。本文將詳細(xì)講解一下SPI,并且最后基于STM32編寫一個例程。
介紹
SPI簡介
SPI(Serial Peripheral Interface)是一種串行外設(shè)接口,用于在微控制器(MCU)或數(shù)字信號處理器(DSP)等主設(shè)備與外部設(shè)備之間進(jìn)行通信。SPI的設(shè)計旨在實(shí)現(xiàn)高速數(shù)據(jù)傳輸和簡單的硬件實(shí)現(xiàn)。
SPI接口通常由一個主設(shè)備(Master)和一個或多個從設(shè)備(Slave)組成。主設(shè)備控制通信的時序和數(shù)據(jù)傳輸,而從設(shè)備根據(jù)主設(shè)備的指令進(jìn)行響應(yīng)。SPI通信基于全雙工傳輸方式,主設(shè)備和從設(shè)備可以同時發(fā)送和接收數(shù)據(jù)。
物理層
SPI通信中的數(shù)據(jù)傳輸通過四根線實(shí)現(xiàn):
- SCLK(Serial Clock):時鐘線,由主設(shè)備產(chǎn)生,并控制數(shù)據(jù)的傳輸速度。不同的設(shè)備支持的最
高時鐘頻率不同,兩個設(shè)備之間通訊時,通訊速率受限于低速設(shè)備。 - MOSI(Master Output Slave Input):主設(shè)備輸出線,負(fù)責(zé)將數(shù)據(jù)從主設(shè)備發(fā)送到從設(shè)備。主機(jī)的數(shù)據(jù)從這條信號線輸出,從機(jī)由這條信號線讀入主機(jī)發(fā)送的數(shù)據(jù),即這條線上數(shù)據(jù)的方向?yàn)橹鳈C(jī)到從機(jī)。
- MISO(Master Input Slave Output):主設(shè)備輸入線,負(fù)責(zé)將數(shù)據(jù)從從設(shè)備發(fā)送到主設(shè)備。
- SS(Slave Select):從設(shè)備選擇線,用于選擇特定的從設(shè)備與主設(shè)備進(jìn)行通信。當(dāng)有多個從設(shè)備時,上面的三條線是共同使用的,而 NSS 則是用來區(qū)分多個不同的設(shè)備,當(dāng)主機(jī)需要選擇某個從設(shè)備時,使用 NSS 信號線來尋址,把該從設(shè)備的 NSS 信號線設(shè)置為低電平,則該從設(shè)備被選擇,片選有效,然后主機(jī)與被選擇的從設(shè)備開始通訊。

SPI通信中的數(shù)據(jù)傳輸是基于幀(Frame)的概念,每個幀由一個傳輸字節(jié)(Byte)組成。主設(shè)備通過時鐘線控制數(shù)據(jù)傳輸?shù)臅r序,并通過主輸出線(MOSI)發(fā)送數(shù)據(jù),從設(shè)備則通過主輸入線(MISO)將數(shù)據(jù)發(fā)送回主設(shè)備。
協(xié)議層
通訊的起始和停止信號
當(dāng) NSS 信號線由高變低,是 SPI 通訊的起始信號。NSS 是每個從機(jī)各自獨(dú)占的信號線,當(dāng)從機(jī)從自己的 NSS 線檢測到起始信號后,就知道自己被主機(jī)選中了 ,準(zhǔn)備與主機(jī)通訊。NSS 由低變高,是 SPI 通訊的停止信號,表示本次通訊結(jié)束,從機(jī)的選中狀態(tài)被取消。

SPI 模式
SPI通信中存在四種常見的模式,用于描述主設(shè)備和從設(shè)備之間數(shù)據(jù)傳輸?shù)臅r序和極性。他們的主要區(qū)別是總線空閑時 SCK 的時鐘狀態(tài)以及數(shù)據(jù)采樣時刻。這是通過 SPI_CR 寄存器的 CPOL 和 CPHA 位來控制。這些模式由兩個參數(shù)定義:時鐘極性(CPOL)和時鐘相位(CPHA)。
時鐘極性 CPOL 是指 SPI 通訊設(shè)備處于空閑狀態(tài)時,SCK 信號線的電平信號(即 SPI 通訊開始前、NSS 線為高電平時 SCK 的狀態(tài))。CPOL=0 時,SCK 在空閑狀態(tài)時為低電平,CPOL=1 時,則相反。
時鐘相位 CPHA 是指數(shù)據(jù)的采樣的時刻,當(dāng) CPHA=0 時,MOSI 或 MISO 數(shù)據(jù)線上的信號將會在 SCK 時鐘線的“奇數(shù)邊沿(串行同步時鐘的第一個跳變沿)”被采樣。當(dāng) CPHA=1 時,數(shù)據(jù)線在 SCK 的“偶數(shù)邊沿(串行時鐘的第二個跳變沿)”。


- 模式0(CPOL = 0,CPHA = 0):
時鐘極性(CPOL)為低電平。
時鐘相位(CPHA)為下降沿采樣。
數(shù)據(jù)在時鐘的下降沿進(jìn)行采樣,數(shù)據(jù)的變化在時鐘的上升沿進(jìn)行傳輸。
數(shù)據(jù)在時鐘的空閑狀態(tài)為低電平。 - 模式1(CPOL = 0,CPHA = 1):
時鐘極性(CPOL)為低電平。
時鐘相位(CPHA)為上升沿采樣。
數(shù)據(jù)在時鐘的上升沿進(jìn)行采樣,數(shù)據(jù)的變化在時鐘的下降沿進(jìn)行傳輸。
數(shù)據(jù)在時鐘的空閑狀態(tài)為低電平。 - 模式2(CPOL = 1,CPHA = 0):
時鐘極性(CPOL)為高電平。
時鐘相位(CPHA)為下降沿采樣。
數(shù)據(jù)在時鐘的下降沿進(jìn)行采樣,數(shù)據(jù)的變化在時鐘的上升沿進(jìn)行傳輸。
數(shù)據(jù)在時鐘的空閑狀態(tài)為高電平。 - 模式3(CPOL = 1,CPHA = 1):
時鐘極性(CPOL)為高電平。
時鐘相位(CPHA)為上升沿采樣。
數(shù)據(jù)在時鐘的上升沿進(jìn)行采樣,數(shù)據(jù)的變化在時鐘的下降沿進(jìn)行傳輸。
數(shù)據(jù)在時鐘的空閑狀態(tài)為高電平。
這四種模式的選擇取決于主設(shè)備和從設(shè)備之間的時鐘和數(shù)據(jù)采樣方式。具體選擇哪種模式取決于所使用的設(shè)備和應(yīng)用的要求,以確保正確的數(shù)據(jù)傳輸和通信。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
SPI接口具有以下幾個優(yōu)點(diǎn):
- 高速數(shù)據(jù)傳輸:SPI接口通常能夠提供較高的數(shù)據(jù)傳輸速率,特別適用于對速度要求較高的應(yīng)用。由于SPI使用全雙工通信方式,數(shù)據(jù)可以同時在主設(shè)備和從設(shè)備之間傳輸,實(shí)現(xiàn)更快的數(shù)據(jù)交換速度。
- 簡單硬件實(shí)現(xiàn):SPI接口的硬件實(shí)現(xiàn)相對簡單,通常只需要少量的引腳和簡單的電路即可。SPI接口沒有復(fù)雜的協(xié)議和通信控制器,因此在嵌入式系統(tǒng)和小型設(shè)備中使用SPI接口可以減少成本和復(fù)雜性。
- 靈活性:SPI接口支持點(diǎn)對點(diǎn)和多點(diǎn)通信。主設(shè)備可以連接多個從設(shè)備,每個從設(shè)備都有一個獨(dú)立的片選信號(Slave Select),可以根據(jù)需要選擇與主設(shè)備進(jìn)行通信的從設(shè)備。這種靈活性使得SPI接口適用于連接多個外部設(shè)備或模塊的應(yīng)用場景。
- 可靠性:SPI接口通常在短距離內(nèi)進(jìn)行通信,信號傳輸?shù)木嚯x相對較短,因此具有較低的傳輸誤差和干擾風(fēng)險。此外,SPI接口通常使用全雙工通信,主設(shè)備和從設(shè)備可以同時發(fā)送和接收數(shù)據(jù),從而提高了通信的可靠性。
- 應(yīng)用廣泛:SPI接口在各種領(lǐng)域都得到廣泛應(yīng)用。它常用于連接各種外部設(shè)備,如傳感器、存儲器(如閃存和EEPROM)、顯示器、數(shù)字轉(zhuǎn)換器(ADC和DAC)等。由于其高速性和靈活性,SPI接口在通信和數(shù)據(jù)傳輸方面提供了一種有效的解決方案。
缺點(diǎn)
盡管SPI接口具有許多優(yōu)點(diǎn),但也存在一些缺點(diǎn)需要考慮:
- 引腳占用:SPI通信通常需要使用多個引腳,包括時鐘線、數(shù)據(jù)輸入線、數(shù)據(jù)輸出線和片選信號線。這可能對系統(tǒng)設(shè)計帶來一定的復(fù)雜性,并且在引腳資源有限的情況下可能會造成問題。
- 距離限制:由于SPI通信通常是基于并行電平傳輸,其傳輸距離受到電信號衰減和干擾的限制。通信距離相對較短,一般在幾米以內(nèi)。對于需要較長距離傳輸?shù)膽?yīng)用,SPI可能不是最佳選擇。
- 缺乏標(biāo)準(zhǔn)化:SPI接口本身沒有嚴(yán)格的標(biāo)準(zhǔn)化規(guī)范,導(dǎo)致不同設(shè)備和廠商可能會有不同的實(shí)現(xiàn)方式和特定的通信協(xié)議。這可能會導(dǎo)致兼容性問題,需要針對不同設(shè)備進(jìn)行適配和定制。
- 無差錯校驗(yàn):SPI協(xié)議本身沒有提供內(nèi)置的差錯檢測和校驗(yàn)機(jī)制。這意味著在數(shù)據(jù)傳輸過程中,如果發(fā)生傳輸錯誤,接收方無法直接檢測到或糾正錯誤。對于對數(shù)據(jù)完整性要求較高的應(yīng)用,需要額外的機(jī)制來確保數(shù)據(jù)的可靠性。
- 僅適用于點(diǎn)對點(diǎn)或簡單拓?fù)洌篠PI接口通常適用于點(diǎn)對點(diǎn)或簡單的拓?fù)浣Y(jié)構(gòu),其中一個主設(shè)備控制一個或多個從設(shè)備。對于復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)或大規(guī)模系統(tǒng),SPI的連接和管理可能變得復(fù)雜,并且不容易擴(kuò)展和維護(hù)。
使用例程
基于STM32的SPI通信
硬件連接

軟件實(shí)現(xiàn)
- 首先是使能引腳,選擇 SPI1 的雙全工模式。選擇 PD3 作為片選腳,也就是 NSS 信號線,產(chǎn)生起始和停止信號。


- 將 PD3 初始化為推挽輸出??梢钥吹?3 個 SPI 引腳都是使用 GPIO 的復(fù)用模式。
- SPI參數(shù)配置

- 生成的程序里,主要的配置信息如下。
void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;//主機(jī)模式
hspi1.Init.Direction = SPI_DIRECTION_2LINES;//全雙工
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;//數(shù)據(jù)位為八位
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_4;//4分頻,84MHz/4=21MHz
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;//默認(rèn)值,無效
if (HAL_SPI_Init(&hspi1) != HAL_OK)////初始化
{
Error_Handler();
}
}
總結(jié)
在現(xiàn)如今數(shù)據(jù)量劇增的時代,SPI這種通信速度快的通信接口以后一定會使用更加頻繁,所以還是要加以學(xué)習(xí)。
-
STM32
+關(guān)注
關(guān)注
2309文章
11162瀏覽量
373475 -
EEPROM
+關(guān)注
關(guān)注
9文章
1137瀏覽量
86040 -
時鐘相位
+關(guān)注
關(guān)注
0文章
2瀏覽量
6044 -
SPI接口
+關(guān)注
關(guān)注
0文章
282瀏覽量
36710 -
數(shù)字信號處理器
+關(guān)注
關(guān)注
5文章
503瀏覽量
28430
發(fā)布評論請先 登錄
STM32 SPI基礎(chǔ)內(nèi)容
SPI協(xié)議接口例程改寫任務(wù)要求
STM32 SPI協(xié)議(7針)接口下的OLED屏顯示 精選資料推薦
SPI FLASH LittleFS文件系統(tǒng)例程資料免費(fèi)下載
STM32F4 SPI-FLASH實(shí)驗(yàn)例程
Proteus編寫STM32F1 LED例程
用HAL庫函數(shù)實(shí)現(xiàn)一片STM32的兩個SPI接口相互通信
STM32CubeMX-HAL庫的SPI接口使用
基于STM32的SPI通信
STM32的SPI控制器實(shí)現(xiàn)SPI
基于STM32編寫一個SPI接口例程
評論