本文主要介紹STM32的SPI接口、cubeMX軟件配置SPI接口和分析SPI相關(guān)代碼。
STM32之SPI簡介:
SPI協(xié)議【Serial Peripheral Interface】
串行外圍設(shè)備接口,是一種高速全雙工的通信總線。主要用在MCU與FLASHADCLCD等模塊之間的通信。
SPI信號線
SPI 共包含 4 條總線。
SS(Slave Select):片選信號線,當(dāng)有多個SPI 設(shè)備與 MCU 相連時,每個設(shè)備的這個片選信號線是與 MCU 單獨(dú)的引腳相連的,而其他的 SCK、MOSI、MISO 線則為多個設(shè)備并聯(lián)到相同的 SPI 總線上,低電平有效。
SCK (Serial Clock):時鐘信號線,由主通信設(shè)備產(chǎn)生,不同的設(shè)備支持的時鐘頻率不一樣,如 STM32 的 SPI 時鐘頻率最大為 f PCLK /2。
MOSI (Master Output Slave Input):主設(shè)備輸出 / 從設(shè)備輸入引腳。主機(jī)的數(shù)據(jù)從這條信號線輸出,從機(jī)由這條信號線讀入數(shù)據(jù),即這條線上數(shù)據(jù)的方向?yàn)橹鳈C(jī)到從機(jī)。
MISO(Master Input Slave Output):主設(shè)備輸入 / 從設(shè)備輸出引腳。主機(jī)從這條信號線讀入數(shù)據(jù),從機(jī)的數(shù)據(jù)則由這條信號線輸出,即在這條線上數(shù)據(jù)的方向?yàn)閺臋C(jī)到主機(jī)。
其中SCK,MOSI,MISO是接在一起的,NSS分別接到不同的IO管腳控制。主器件要和從器件通信就先拉低對應(yīng)從器件的NSS管腳使能。默認(rèn)狀態(tài)IO1,IO2,IO3全為高電平,當(dāng)主器件和從器件1通信時,拉低IO1管腳使能從器件1。而從器件2,3不使能,不作響應(yīng)。下圖是主器件與多個從器件通信圖。
SPI特性
單次傳輸可選擇為 8 或 16 位。波特率預(yù)分頻系數(shù)(最大為 fPCLK/2) 。時鐘極性(CPOL)和相位(CPHA)可編程設(shè)置。數(shù)據(jù)順序的傳輸順序可進(jìn)行編程選擇,MSB 在前或 LSB 在前。
注:MSB(Most Significant Bit)是“最高有效位”,LSB(Least Significant Bit)是“最低有效位”。
可觸發(fā)中斷的專用發(fā)送和接收標(biāo)志。可以使用 DMA 進(jìn)行數(shù)據(jù)傳輸操作。下圖是STM32的SPI框架圖。
如上圖,MISO數(shù)據(jù)線接收到的信號經(jīng)移位寄存器處理后把數(shù)據(jù)轉(zhuǎn)移到接收緩沖區(qū),然后這個數(shù)據(jù)就可以由我們的軟件從接收緩沖區(qū)讀出了。當(dāng)要發(fā)送數(shù)據(jù)時,我們把數(shù)據(jù)寫入發(fā)送緩沖區(qū),硬件將會把它用移位寄存器處理后輸出到 MOSI數(shù)據(jù)線。SCK 的時鐘信號則由波特率發(fā)生器產(chǎn)生,我們可以通過波特率控制位(BR)來控制它輸出的波特率。
控制寄存器 CR1掌管著主控制電路,STM32的 SPI模塊的協(xié)議設(shè)置(時鐘極性、相位等)就是由它來制定的。而控制寄存器 CR2則用于設(shè)置各種中斷使能。
最后為 NSS引腳,這個引腳扮演著 SPI協(xié)議中的SS片選信號線的角色,如果我們把 NSS引腳配置為硬件自動控制,SPI模塊能夠自動判別它能否成為 SPI的主機(jī),或自動進(jìn)入 SPI從機(jī)模式。但實(shí)際上我們用得更多的是由軟件控制某些 GPIO引腳單獨(dú)作為SS信號,這個 GPIO引腳可以隨便選擇。
SPI時鐘時序
根據(jù)時鐘極性(CPOL)及相位(CPHA)不同,SPI有四種工作模式。
時鐘極性(CPOL)定義了時鐘空閑狀態(tài)電平:
CPOL=0為時鐘空閑時為低電平
CPOL=1為時鐘空閑時為高電平
時鐘相位(CPHA)定義數(shù)據(jù)的采集時間。
CPHA=0:在時鐘的第一個跳變沿(上升沿或下降沿)進(jìn)行數(shù)據(jù)采樣。
CPHA=1:在時鐘的第二個跳變沿(上升沿或下降沿)進(jìn)行數(shù)據(jù)采樣。
CubeMX軟件配置SPI:
下面繼續(xù)介紹cubeMX軟件配置STM32L152的SPI接口方法。
(1)打開軟件,選擇對應(yīng)芯片后,配置好時鐘源;
(2)勾選SPI1為全雙工,硬件NSS關(guān)閉,如下圖:
(3)勾選好后,PA5、PA6、PA7如下圖,在配置PA4為普通io口,gpio_output
(4)SPI1的參數(shù)配置選擇默認(rèn),如下圖所示
(5)生成代碼,保存即可。
HAL庫的SPI函數(shù)分析:
下面具體分析下生成的SPI函數(shù)和函數(shù)調(diào)用。
SPI_HandleTypeDef hspi1; //SPI結(jié)構(gòu)體類定義,下面看其結(jié)構(gòu)體內(nèi)部的聲明。
下面分析SPI的初始化函數(shù):
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi){GPIO_InitTypeDef GPIO_InitStruct;if(hspi->Instance==SPI1){/* USER CODE BEGIN SPI1_MspInit 0 *//* USER CODE END SPI1_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_SPI1_CLK_ENABLE();//使能SPI1時鐘/**SPI1 GPIO ConfigurationPA5 ------> SPI1_SCKPA6 ------> SPI1_MISOPA7 ------> SPI1_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);//配置SPI的數(shù)據(jù)線和時鐘線/* USER CODE BEGIN SPI1_MspInit 1 *//* USER CODE END SPI1_MspInit 1 */} 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,lowhspi1.Init.CLKPhase = SPI_PHASE_1EDGE;//CPHA為數(shù)據(jù)線的第一個變化沿hspi1.Init.NSS = SPI_NSS_SOFT;//軟件控制NSShspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分頻,32M/2=16MHzhspi1.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(__FILE__, __LINE__);}}
利用SPI接口發(fā)送和接收數(shù)據(jù)主要調(diào)用以下兩個函數(shù):
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//發(fā)送數(shù)據(jù)HAL_StatusTypeDefHAL_SPI_Receive(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize,uint32_tTimeout);//接收數(shù)據(jù)
原文標(biāo)題:STM32CubeMX-HAL庫的SPI接口使用
文章出處:【微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
STM32
+關(guān)注
關(guān)注
2276文章
10947瀏覽量
359166 -
SPI
+關(guān)注
關(guān)注
17文章
1731瀏覽量
92848
原文標(biāo)題:STM32CubeMX-HAL庫的SPI接口使用
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Java的SPI機(jī)制詳解

如何用ADS1271的SPI接口模式與STM32進(jìn)行通信?
KeyStone架構(gòu)串行外設(shè)接口(SPI)手冊
spi master接口的fpga實(shí)現(xiàn)

TMS320C6000 McBSP:SPI ROM接口

DS1302芯片與FPGA之間SPI通信原理

SPI接口靜電放電防護(hù)方案

單片機(jī)SPI通信實(shí)現(xiàn)
SPI總線的定義和特點(diǎn)
SPI、UART、RGMII、JTAG接口的低電壓轉(zhuǎn)換

使用ESP32C3的SPI2的時候,配置SPI接口后,SPI接口讀取從設(shè)備的數(shù)據(jù)的時候會整體左偏移一bit,為什么?
【GD32F303紅楓派開發(fā)板使用手冊】第十九講 SPI-SPI NOR FLASH讀寫實(shí)驗(yàn)

Vision Board上的SPI設(shè)備驅(qū)動配置和SPI主控的外部loopback功能測試

【GD32F470紫藤派開發(fā)板使用手冊】第十一講 SPI-SPI NOR FLASH讀寫實(shí)驗(yàn)

評論