SPI,全稱為 Serial Peripheral In
terface(串行外設(shè)
接口),是一種用于短距離
通信的同步串行
通信接口,主要應(yīng)用在
嵌入式系統(tǒng)。
這是第二篇分享,《
STM32學(xué)習(xí)筆記》之SPI通信常見問題分析。
SPI的應(yīng)用場合很廣,顯示模組、
時鐘芯片、存儲芯片、
溫度傳感器等眾多器件都有使用SPI接口通信。這些器件通常作為從設(shè)備,STM32作為主設(shè)備來控制它們。
STM32 SPI基礎(chǔ)內(nèi)容
絕大部分STM32芯片都有多個SPI外設(shè),它可與外部SPI器件進行半雙工/全雙工同步串行通信。
1. SPI特性
三條線全雙工、雙線單工同步傳輸
支持 8 位或 16 位傳輸幀格式選擇
支持主模式或從模式操作
可
編程的時鐘極性和相位
支持 MSB 或 LSB 數(shù)據(jù)順序
支持
DMA收發(fā)數(shù)據(jù)
2. 引腳描述
MISO:主輸入/從輸出數(shù)據(jù);
MOSI:主輸出/從輸入數(shù)據(jù);
SCK:時鐘(主輸出,從輸入時鐘);
NSS:從器件選擇,可理解片選
信號;
3. SPI時序
SPI的時序中有兩個
參數(shù)需要注意,那就是時鐘相位和時鐘極性。在STM32中,SPI時序由CPOL 和 CPHA 這兩位來決定。
通過軟件配置這兩個參數(shù),可分為四種時序關(guān)系,如下圖:
4. 數(shù)據(jù)幀格式
串行同行數(shù)據(jù)傳輸分為 MSB 和 LSB,也就是最高有效位在前,還是最低有效位在前。(注:最左邊的比特位即為最高有效位)。
比如傳輸一個字節(jié):0x95(1001 0101)。
如果按照MSB(高位在前),則發(fā)送順序:1001 0101。
如果按照LSB(低位在前),則發(fā)送順序反過來:1010 1001。
STM32 SPI參數(shù)配置
通常STM32的SPI作為主機連接外部從機,要與從機建立正常通信,就必須與從機的參數(shù)匹配才行。
這里以【STM32作為SPI主機讀寫SPI Flash】為例,主要配置參數(shù):雙向全雙工、主機模式、8位數(shù)據(jù)、MSB等。
1. 標(biāo)準(zhǔn)外設(shè)庫配置
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direc
tion = SPI_Direction_2Lines_FullDuplex; //雙向全雙工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主機模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位數(shù)據(jù)
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //時鐘極性:空閑為高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //時鐘相位:第2個時鐘沿捕獲
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //軟件控制NSS信號
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //波特率預(yù)分頻值為4
SPI_InitStructure.SPI_Fi
rstBit = SPI_FirstBit_MSB; //數(shù)據(jù)傳輸從 MSB 位開始
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
▲ 左右滑動,查看完整代碼
2. STM32CubeMX配置
首先選擇全雙工主機模式,然后再逐步配置下面參數(shù)。這里的波特率時鐘灰色不可配置,由你系統(tǒng)時鐘和分頻時鐘決定。
這些配置參數(shù)比較容易理解(英文清晰明了),若不懂可針對性查閱參考手冊。
STM32 SPI常見問題
雖說SPI相對比較簡單,但在實際應(yīng)用過程中還是會存在一些奇怪的問題,下面通過案例來分析SPI常見的一些問題。
問題一:NSS片選問題
有
工程師使用硬件NSS控制從機,以為NSS信號是自動控制,導(dǎo)致操作從設(shè)備失敗。
分析原因:STM32 SPI的NSS信號為片選信號,可“使能”為硬件控制(參看上面參數(shù)配置)。
但在應(yīng)用中同樣需要軟件操作才能控制NSS信號(高低),比如:
評論