基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 課件 第9章 STM32 SPI控制器_第1頁
基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 課件 第9章 STM32 SPI控制器_第2頁
基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 課件 第9章 STM32 SPI控制器_第3頁
基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 課件 第9章 STM32 SPI控制器_第4頁
基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 課件 第9章 STM32 SPI控制器_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第9章STM32SPI控制器本章講述了STM32SPI控制器,包括STM32的SPI通信原理、STM32F407SPI串行總線的工作原理、SPI的HAL驅(qū)動程序、采用STM32Cube和HAL庫的SPI應(yīng)用實(shí)例。9.1STM32的SPI通信原理實(shí)際生產(chǎn)生活當(dāng)中,有些系統(tǒng)的功能無法完全通過STM32的片上外設(shè)來實(shí)現(xiàn)。例如,16位及以上的A/D轉(zhuǎn)換器、溫/濕度傳感器、大容量EEPROM或Flash、大功率電機(jī)驅(qū)動芯片、無線通信控制芯片等。此時(shí),只能通過擴(kuò)展特定功能的芯片來實(shí)現(xiàn)這些功能。另外,有的系統(tǒng)需要兩個或者兩個以上的主控器(STM32或FPGA),而這些主控器之間也需要通過適當(dāng)?shù)男酒g通信方式來實(shí)現(xiàn)通信。常見的系統(tǒng)內(nèi)通信方式有并行和串行兩種。并行方式指同一個時(shí)刻,在嵌入式處理器和外圍芯片之間傳遞數(shù)據(jù)有多位;串行方式則是指每個時(shí)刻傳遞的數(shù)據(jù)只有一位,需要通過多次傳遞才能完成一字節(jié)的傳輸。9.1.1SPI串行總線概述串行外設(shè)接口(SerialPeripheralInterface,SPI)是由美國摩托羅拉(Motorola)公司提出的一種高速全雙工串行同步通信接口,首先出現(xiàn)在M68HC系列處理器中,由于其簡單方便,成本低廉,傳輸速度快,因此被其他半導(dǎo)體廠商廣泛使用,從而成為事實(shí)上的標(biāo)準(zhǔn)。SPI與USART相比,其數(shù)據(jù)傳輸速度要快得多,因此它被廣泛地應(yīng)用于微控制器與ADC、LCD等設(shè)備的通信,尤其是高速通信的場合。微控制器還可以通過SPI組成一個小型同步網(wǎng)絡(luò)進(jìn)行高速數(shù)據(jù)交換,完成較復(fù)雜的工作。作為全雙工同步串行通信接口,SPI采用主/從模式(master/slave),支持一個或多個從設(shè)備,能夠?qū)崿F(xiàn)主設(shè)備和從設(shè)備之間的高速數(shù)據(jù)通信。SPI具有硬件簡單、成本低廉、易于使用、傳輸數(shù)據(jù)速度快等優(yōu)點(diǎn),使用于成本敏感或者高速通信的場合。SPI也存在無法檢查糾錯、不具備尋址能力和接收方?jīng)]有應(yīng)答信號等缺點(diǎn),不適合復(fù)雜或者可靠性要求較高的場合。SPI是同步全雙工串行通信接口。SPI在物理層體現(xiàn)為4條信號線,分別是SCK、MOSI、MISO和SS。(1)SCK(SerialClock),即時(shí)鐘線,由主設(shè)備產(chǎn)生。不同的設(shè)備支持的時(shí)鐘頻率不同。(2)MOSI(MasterOutputSlaveInput),即主設(shè)備數(shù)據(jù)輸出/從設(shè)備數(shù)據(jù)輸入線。(3)MISO(MasterInputSlaveOutput),即主設(shè)備數(shù)據(jù)輸入/從設(shè)備數(shù)據(jù)輸出線。。(4)SS(SlaveSelect),有時(shí)候也叫CS(ChipSelect),SPI從設(shè)備選擇信號線,當(dāng)有多個SPI從設(shè)備與SPI主設(shè)備相連(即一主多從)時(shí),SS用來選擇激活指定的從設(shè)備,由SPI主設(shè)備(通常是微控制器)驅(qū)動,低電平有效。當(dāng)只有一個SPI從設(shè)備與SPI主設(shè)備相連(即一主一從)時(shí),SS并不是必需的。因此,SPI也被稱為三線同步通信接口。除了SCK、MOSI、MISO和SS這4條信號線外,SPI接口還包含一個串行移位寄存器,如圖9-1所示。圖9-1SPI接口組成9.1.2SPI串行總線互連方式SPI互連主要有一主一從和一主多從兩種互連方式。1. 一主一從在一主一從的SPI互連方式下,只有一個SPI主設(shè)備和一個SPI從設(shè)備進(jìn)行通信。這種情況下,只需要分別將主設(shè)備的SCK、MOSI、MISO和從設(shè)備的SCK、MOSI、MISO直接相連,并將主設(shè)備的SS置為高電平,從設(shè)備的SS接地(置為低電平,片選有效,選中該從設(shè)備)即可,如圖9-2所示。圖9-2一主一從的SPI互連2. 一主多從在一主多從的SPI互連方式下,一個SPI主設(shè)備可以和多個SPI從設(shè)備相互通信。這種情況下,所有的SPI設(shè)備(包括主設(shè)備和從設(shè)備)共享時(shí)鐘線和數(shù)據(jù)線,即SCK、MOSI、MISO這3條線,并在主設(shè)備端使用多個GPIO引腳來選擇不同的SPI從設(shè)備,如圖9-3所示。圖9-3一主多從的SPI互連串行外設(shè)接口(SPI)允許芯片與外部設(shè)備以半/全雙工、同步、串行方式通信。此接口可以被配置成主模式,并為外部從設(shè)備提供通信時(shí)鐘(SCK),接口還能以多主的配置方式工作。它可用于多種用途,包括使用一條雙向數(shù)據(jù)線的雙線單工同步傳輸,還可使用CRC校驗(yàn)的可靠通信。9.2STM32F4SPI串行總線的工作原理9.2.1SPI串行總線的特征STM32F407微控制器的小容量產(chǎn)品有1個SPI接口,中等容量產(chǎn)品有2個SPI,大容量產(chǎn)品則有3個SPI。STM32F407微控制器SPI主要具有以下特征:(1)3線全雙工同步傳輸。(2)帶或不帶第三根雙向數(shù)據(jù)線的雙線單工同步傳輸。(3)8或16位傳輸幀格式選擇。(4)主或從操作。(5)支持多主模式。(6)8個主模式波特率預(yù)分頻系數(shù)(最大為fPCLK/2)。(7)從模式頻率(最大為fPCLK/2)。(8)主模式和從模式的快速通信。(9)主模式和從模式下均可以由軟件或硬件進(jìn)行NSS管理:主/從操作模式的動態(tài)改變。(10)可編程的時(shí)鐘極性和相位。(11)可編程的數(shù)據(jù)順序,MSB在前或LSB在前。(12)可觸發(fā)中斷的專用發(fā)送和接收標(biāo)志。(13)SPI總線忙狀態(tài)標(biāo)志。(14)支持可靠通信的硬件CRC。在發(fā)送模式下,CRC值可以被作為最后一個字節(jié)發(fā)送;在全雙工模式下,對接收到的最后一個字節(jié)自動進(jìn)行CRC校驗(yàn)。(15)可觸發(fā)中斷的主模式故障、過載以及CRC錯誤標(biāo)志。(16)支持DMA功能的1字節(jié)發(fā)送和接收緩沖器,產(chǎn)生發(fā)送和接受請求。9.2.2SPI串行總線的內(nèi)部結(jié)構(gòu)STM32F407微控制器SPI主要由波特率發(fā)生器、收發(fā)控制和數(shù)據(jù)存儲轉(zhuǎn)移三部分組成,內(nèi)部結(jié)構(gòu)如圖9-4所示。波特率發(fā)生器用來產(chǎn)生SPI的SCK時(shí)鐘信號,收發(fā)控制主要由控制寄存器組成,數(shù)據(jù)存儲轉(zhuǎn)移主要由移位寄存器、接收緩沖區(qū)和發(fā)送緩沖區(qū)等構(gòu)成。圖9-4STM32F407微控制器SPI內(nèi)部結(jié)構(gòu)圖STM32系列微控制器SPI的功能主要由波特率控制、收發(fā)控制和數(shù)據(jù)存儲轉(zhuǎn)移3部分構(gòu)成。1. 波特率控制波特率發(fā)生器可產(chǎn)生SPI的SCK時(shí)鐘信號。波特率預(yù)分頻系數(shù)為2、4、8、16、32、64、128或256。通過設(shè)置波特率控制位(BR)可以控制SCK的輸出頻率,從而控制SPI的傳輸速率。2. 收發(fā)控制收發(fā)控制由若干個控制寄存器組成,如SPI控制寄存器SPI_CR1、SPI_CR2和SPI狀態(tài)寄存器SPI_SR等。3. 數(shù)據(jù)存儲轉(zhuǎn)移數(shù)據(jù)存儲轉(zhuǎn)移如圖9-4的左上部分所示,主要由移位寄存器、接收緩沖區(qū)和發(fā)送緩沖區(qū)等構(gòu)成。9.2.3SPI串行總線時(shí)鐘信號的相位和極性SPI_CR寄存器的CPOL和CPHA位,能夠組合成四種可能的時(shí)序關(guān)系。CPOL(時(shí)鐘極性)位控制在沒有數(shù)據(jù)傳輸時(shí)時(shí)鐘的空閑狀態(tài)電平,此位對主模式和從模式下的設(shè)備都有效。如果CPOL被清0,SCK引腳在空閑狀態(tài)保持低電平;如果CPOL被置1,SCK引腳在空閑狀態(tài)保持高電平。如圖9-5所示,如果CPHA(時(shí)鐘相位)位被清0,數(shù)據(jù)在SCK時(shí)鐘的奇數(shù)(第1、3、5個···)跳變沿(CPOL位為0時(shí)就是上升沿,CPOL位為1時(shí)就是下降沿)進(jìn)行數(shù)據(jù)位的存取,數(shù)據(jù)在SCK時(shí)鐘偶數(shù)(第2、4、6個···)跳變沿(CPOL位為0時(shí)就是下降沿,CPOL位為1時(shí)就是上升沿)準(zhǔn)備就緒。圖9-5CPHA=0時(shí)SPI時(shí)序圖如圖9-6所示,如果CPHA(時(shí)鐘相位)位被置1,數(shù)據(jù)在SCK時(shí)鐘的偶數(shù)(第2、4、6個···)跳變沿(CPOL位為0時(shí)就是下降沿,CPOL位為1時(shí)就是上升沿)進(jìn)行數(shù)據(jù)位的存取,數(shù)據(jù)在SCK時(shí)鐘奇數(shù)(第1、3、5個···)跳變沿(CPOL位為0時(shí)就是上升沿,CPOL位為1時(shí)就是下降沿)準(zhǔn)備就緒。圖9-6CPHA=1時(shí)SPI時(shí)序圖9.2.4STM32的SPI接口配置1.配置SPI為從模式在從模式下,SCK引腳用于接收從主設(shè)備來的串行時(shí)鐘。SPI_CR1寄存器中BR[2:0]的設(shè)置不影響數(shù)據(jù)傳輸速率。SPI從模式的配置步驟如下,(1)設(shè)置DFF位以定義數(shù)據(jù)幀格式為8位或16位。(2)選擇CPOL和CPHA位來定義數(shù)據(jù)傳輸和串行時(shí)鐘之間的相位關(guān)系。為保證正確的數(shù)據(jù)傳輸,從設(shè)備和主設(shè)備的CPOL和CPHA位必須配置成相同的方式。(3)幀格式(SPI_CR1寄存器中的LSBFIRST位定義的“最高位在前”還是“最低位在前”)必須與主設(shè)備相同。(4)在NSS引腳管理硬件模式下,在數(shù)據(jù)幀傳輸過程中,NSS引腳必須為低電平。在NSS軟件模式下,設(shè)置SPI_CR1寄存器中的SSM位并清除SSI位。(5)在SPI_CR1寄存器中,清除MSTR位,設(shè)置SPE位,使相應(yīng)引腳工作于SPI模式下。2. 配置SPI為主模式在主模式時(shí),MOSI引腳是數(shù)據(jù)輸出,而MISO引腳是數(shù)據(jù)輸入,在SCK引腳產(chǎn)生串行時(shí)鐘。SPI主模式的配置步驟如下:(1)通過SPI_CR1寄存器的BR[2:0]位定義串行時(shí)鐘波特率。(2)選擇CPOL和CPHA位,定義數(shù)據(jù)傳輸和串行時(shí)鐘間的相位關(guān)系。(3)設(shè)置DFF位來定義8位或16位數(shù)據(jù)幀格式。(4)配置SPI_CR1寄存器的LSBFIRST位定義幀格式。(5)如果需要NSS引腳工作在輸入模式,在硬件模式下,在整個數(shù)據(jù)幀傳輸期間應(yīng)把NSS引腳連接到高電平;在軟件模式下,需設(shè)置SPI_CR1寄存器的SSM位和SSI位。如果NSS引腳工作在輸出模式,則只需設(shè)置SSOE位。(6)必須設(shè)置MSTR位和SPE位(只當(dāng)NSS引腳被連到高電平,這些位才能保持置位)。3. 配置SPI為單工通信SPI模塊能夠以兩種配置工作于單工方式:1條時(shí)鐘線和1條雙向數(shù)據(jù)線;1條時(shí)鐘線和1條數(shù)據(jù)線(只接收或只發(fā)送)。(1)1條時(shí)鐘線和1條雙向單向數(shù)據(jù)線(BIDIMODE=1)通過設(shè)置SPI_CR1寄存器中的BIDIMODE位啟用此模式。在這個模式下,SCK引腳作為時(shí)鐘,主設(shè)備使用MOSI引腳而從設(shè)備使用MISO引腳作為數(shù)據(jù)通信。傳輸?shù)姆较蛴蒘PI_CR1寄存器里的BIDIOE控制,當(dāng)這個位是1的時(shí)候,數(shù)據(jù)線是輸出,否則是輸入。(2)1條時(shí)鐘和1條單向數(shù)據(jù)線(BIDIDIMODE=0)在這個模式下,SPI模塊可以或者作為只發(fā)送,或者作為只接收。9.2.5STM32的SPI接口數(shù)據(jù)發(fā)送與接收過程1.接收與發(fā)送緩沖器接收時(shí),接收到的數(shù)據(jù)被存放在接收緩沖器中;發(fā)送時(shí),在數(shù)據(jù)被發(fā)送之前,首先被存放在發(fā)送緩沖器中。讀SPIDR寄存器將返回接收緩沖器的內(nèi)容;寫入SPI_DR寄存器的數(shù)據(jù)將被寫入發(fā)送緩沖器中。2.主模式下的數(shù)據(jù)傳輸(1)全雙工模式(BIDIMODEE=0并且RXONLY=0)(2)單向的只接收模式(BIDIMODE并且RRXONLY=1)(3)雙向模式,發(fā)送時(shí)(BIDIMODE并且BIIDIOE=1)(4)雙向模式,接收時(shí)(BIDIMODE=1并且BIDIOE=0)3.從模式下的數(shù)據(jù)傳輸(1)全雙工模式(BIDIMODE并且RXONLY=0)(2)單向的只接收模式(BIDIMODE=0并且RXONLY=1)(3)雙向模式發(fā)送時(shí)(BIDIMODE=1并且BIDIOE=1)(4)雙向模式接收時(shí)(BIDIMODE=并且BIDIOE=0)4.處理數(shù)據(jù)的發(fā)送與接收當(dāng)數(shù)據(jù)從發(fā)送緩沖器傳送到移位寄存器時(shí),TXE標(biāo)志置位(發(fā)送緩沖器空),表示發(fā)送緩沖器可以接收下一個數(shù)據(jù);如果在SPI_CR2寄存器中設(shè)置了TXEIE位,則此時(shí)會產(chǎn)生中斷;寫入數(shù)據(jù)到SPI_DR寄存器即可清除TXE位。9.3.1SPI寄存器操作的宏函數(shù)SPI的驅(qū)動程序頭文件是stm32f4xx_hal_spi.h。SPI寄存器操作的宏函數(shù)如表9-1所示。宏函數(shù)中的參數(shù)_HANDLE是具體某個SPI接口的對象指針,參數(shù)_INTERRUPT是SPI的中斷事件類型,參數(shù)_FLAG_是事件中斷標(biāo)志。9.3SPI的HAL驅(qū)動程序宏函數(shù)功能描述HAL_SPI_DISABLE(_HANDLE_)禁用某個SPI接口HAL_SPI_ENABLE(_HANDLE_)啟用某個SPI接口_HAL_SPI_DISABLE_IT(_HANDLE_,_INTERRUPT_)禁止某個中斷事件源,不允許事件產(chǎn)生硬件中斷_HAL_SPI_ENABLE_IT(HANDLE_,_INTERRUPT_)開啟某個中斷事件源,允許事件產(chǎn)生硬件中斷_HAL_SPI_GET_IT_SOURCE(_HANDLE_,INTERRUPT_)檢查某個中斷事件源是否被允許產(chǎn)生硬件中斷_HAL_SPI_GET_FLAG(_HANDLE_,_FLAG_)獲取某個事件的中斷標(biāo)志,檢查事件是否發(fā)生_HAL_SPI_CLEAR_CRCERRFLAG(_HANDLE_)清除CRC校驗(yàn)錯誤中斷標(biāo)志_HAL_SPI_CLEAR_FREFLAG(_HANDLE_)清除TI幀格式錯誤中斷標(biāo)志_HAL_SPI_CLEAR_MODFFLAG(_HANDLE_)清除主模式故障中斷標(biāo)志_HAL_SPI_CLEAR_OVRFLAG(_HANDLE_)清除溢出錯誤中斷標(biāo)志表9-1SPI寄存器操作的宏函數(shù)STM32CubeMX自動生成的文件spi.c會定義表示具體SPI接口的外設(shè)對象變量。例如,使用SPI1時(shí),會定義如下的外設(shè)對象變量hspil,宏函數(shù)中的參數(shù)_HANDLE_就可以使用&hspil。SPI_HandleTypeDefhspil;//表示SPI1的外設(shè)對象變量在SPI的HAL驅(qū)動程序中,定義了6個表示事件中斷標(biāo)志位的宏,可作為宏函數(shù)中參數(shù)FLAG_的取值;定義了3個表示中斷事件類型的宏,可作為宏函數(shù)中參數(shù)_INTERRUPT的取值。這些宏定義符號如表9-2所示。中斷事件SPI狀態(tài)寄存器SPI_SR中的斷標(biāo)志位表示事件中斷標(biāo)志位的宏SPI控制寄存器SPI_CR2中的中斷事件使能控制位表示中斷事件使能位的宏(用于表示中斷事件類型)發(fā)送緩沖區(qū)為空TXESPI_FLAG_TXETXEIESPI_IT_TXE接收緩沖區(qū)非空RXNESPI_FLAG_RXNEEXNEIESPI_IT_RXNE主模式故障MODFSPI_FLAG_MODFERRIESPI_IT_ERR溢出錯誤OVRSPI_FLAG_OVRCRC校驗(yàn)錯誤CRCERRSPI_FLAG_CRCERRTI幀格式錯誤FRESPI_FLAG_FRE表9-2SPI的中斷事件和宏定義9.3.2SPI初始化和阻塞式數(shù)據(jù)傳輸SPI接口初始化、狀態(tài)查詢和阻塞式數(shù)據(jù)傳輸?shù)暮瘮?shù)列表如表9-3所示。函數(shù)名功能描述HAL_SPI_Init()SPI初始化,配置SPI接口參數(shù)HAL_SPI_MspInit()SPI的MSP初始化函數(shù),重新實(shí)現(xiàn)時(shí)一般用于SPI接口引腳GPIO初始化和中斷設(shè)置HAL_SPI_GetState()返回SPI接口當(dāng)前狀態(tài),返回值是枚舉類型HAL_SPI_StateTypeDefHAL_SPI_GetError()返回SPI接口最后的錯誤碼,錯誤碼有一組宏定義HAL_SPI_Transmit()阻塞式發(fā)送一個緩沖區(qū)的數(shù)據(jù)HAL_SPI_Receive()阻塞式接收指定長度的數(shù)據(jù)保存到緩沖區(qū)HAL_SPI_TransmitReceive()阻塞式同時(shí)發(fā)送和接收一定長度的數(shù)據(jù)表9-3SPI初始化和阻塞式數(shù)據(jù)傳輸相關(guān)函數(shù)1. SPI接口初始化函數(shù)HAL_SPI_Init()用于具體某個SPI接口的初始化,其原型定義如下:HAL_StatusTypeDefHAL_SPI_Init(SPI_HandleTypeDef*hspi)2. 阻塞式數(shù)據(jù)發(fā)送和接收SPI是一種主/從通信方式,通信完全由SPI主機(jī)控制,因?yàn)镾PI主機(jī)控制了時(shí)鐘信號SCK。函數(shù)HAL_SPI_Transmit()用于發(fā)送數(shù)據(jù),其原型定義如下:HAL_StatusTypeDefHAL_SPI_Transmit(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tsize,uint32_tTimeout);

3. 阻塞式同時(shí)發(fā)送與接收數(shù)據(jù)雖然SPI通信一般采用應(yīng)答式,MISO和MOSI兩根線不同時(shí)傳輸有效數(shù)據(jù)。在原理上,它們是可以在SCK時(shí)鐘信號作用下同時(shí)傳輸有效數(shù)據(jù)的。函數(shù)HAL_SPI_TransmitReceive()就實(shí)現(xiàn)了接收和發(fā)送同時(shí)操作的功能,其原型定義如下:HAL_StatusTypeDefHAL_SPI_TransmitReceive(SPI_HandleTypeDef*hspi,uint8_t*pTxData,uint8_t*pRxData,uint16_tSize,uint32_tTimeout)9.3.3SPI中斷方式數(shù)據(jù)傳輸SPI接口能以中斷方式傳輸數(shù)據(jù),是非阻塞式數(shù)據(jù)傳輸。中斷方式數(shù)據(jù)傳輸?shù)南嚓P(guān)函數(shù)、產(chǎn)生的中斷事件類型、對應(yīng)的回調(diào)函數(shù)等如表9-4所示。中斷事件類型用中斷事件使能控制位的宏定義表示。圖1-3帶操作系統(tǒng)的嵌入式軟件的體系結(jié)構(gòu)構(gòu)函數(shù)名函數(shù)功能產(chǎn)生的中斷事件類型對應(yīng)的回調(diào)函數(shù)HAL_SPI_Transmit_IT()中斷方式發(fā)送一個緩沖區(qū)的數(shù)據(jù)SPI_IT_TXEHAL_SPI_TxCpltCallback()HAL_SPI_Receive_IT()中斷方式接收指定長度的數(shù)據(jù)保存到緩沖區(qū)SPI_IT_RXNEHAL_SPI_RxCpltCallback()HAL_SPI_TransmitReceive_IT()中斷方式發(fā)送和接收一定長度的數(shù)據(jù)SPI_IT_TXE和SPI_IT_RXNEHAL_SPI_TxRxCpltCallback()前3個DMA方式傳輸函數(shù)前3個中斷模式傳輸函數(shù)都可能產(chǎn)生

SPI_IT_ERR中斷事件SPI_IT_ERRHAL_SPI_ErrorCallback()HAL_SPI_IRQHandler()SPI中斷ISR里調(diào)用的通用處理函數(shù)——HAL_SPI_Abort()取消非阻塞式數(shù)據(jù)傳輸,本函數(shù)以阻塞模式運(yùn)行——HAL_SPI_Abort_IT()取消非阻塞式數(shù)據(jù)傳輸,本函數(shù)以中斷模式運(yùn)行—HAL_SPI_AbortCpltCallback()表9-4SPI中斷方式數(shù)據(jù)傳輸相關(guān)函數(shù)函數(shù)HAL_SPI_Transmit_IT()用于發(fā)送一個緩沖區(qū)的數(shù)據(jù),發(fā)送完成后,會產(chǎn)生發(fā)送完成中斷事件(SPI_IT_TXE),對應(yīng)的回調(diào)函數(shù)是HAL_SPI_TxCpltCallback()。函數(shù)HAL_SPI_Receive_IT()用于接收指定長度的數(shù)據(jù)保存到緩沖區(qū),接收完成后,會產(chǎn)生接收完成中斷事件(SPI_IT_RXNE),對應(yīng)的回調(diào)函數(shù)是HAL_SPI_RxCpltCallback()。函數(shù)HAL_SPI_TransmitReceive_IT()是發(fā)送和接收同時(shí)進(jìn)行,由它啟動的數(shù)據(jù)傳輸會產(chǎn)生SPI_IT_TXE和SPI_IT_RXNE中斷事件,但是有專門的回調(diào)函數(shù)HAL_SPI_TxRxCpltCallback()。上述3個函數(shù)的原型定義如下:HAL_StatusTypeDefHAL_SPI_Transmit_IT(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize);HAL_StatusTypeDefHAL_SPI_Receive_IT(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize):HALStatusTypeDefHALSPITransmitReceive_IT(SPI_HandleTypeDef*hapi,uint8_t*pIxData,uint8_t*pRxData,uint16_tSize);9.3.4SPI的DMA方式數(shù)據(jù)傳輸SPI的發(fā)送和接收有各自的DMA請求,能以DMA方式進(jìn)行數(shù)據(jù)發(fā)送和接收。DMA方式傳輸時(shí)觸發(fā)DMA流的中斷事件,主要是DMA傳輸完成中斷事件。SPI的DMA方式數(shù)據(jù)傳輸?shù)南嚓P(guān)函數(shù)如表9-5所示。DMA方式功能函數(shù)函數(shù)功能DMA流中斷事件對應(yīng)的回調(diào)函數(shù)HAL_SPI_Transmit_DMA()DMA方式發(fā)送數(shù)據(jù)DMA傳輸完成HAL_SPI_TxCpltCallback()DMA傳輸半完成HAL_SPI_TxHalfCpltCallback()HAL_SPI_Receive_DMA()DMA方式接收數(shù)據(jù)DMA傳輸完成HAL_SPI_TxCpltCallback()DMA傳輸半完成HAL_SPI_TxHalfCpltCallback()HAL_SPI_TransmitReceive_DMA()DMA方式發(fā)送/接收數(shù)據(jù)DMA傳輸完成HAL_SPI_TxRxCpltCallback()DMA傳輸半完成HAL_SPI_TxRxHalfCpltCallback()前3個DMA方式傳輸函數(shù)DMA傳輸錯誤中斷事件DMA傳輸錯誤HAL_SPI_ErrorCallback()HAL_SPI_DMAPause()暫停DMA傳輸——HAL_SPI_DMAResume()繼續(xù)DMA傳輸——HAL_SPI_DMAStop()停止DMA傳輸——表9-5SPI的DMA方式數(shù)據(jù)傳輸?shù)南嚓P(guān)函數(shù)啟動DMA方式發(fā)送和接收數(shù)據(jù)的兩個函數(shù)的原型分別定義如下:HAL_StatusTypeDefHAL_SPI_Transmit_DMA(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize);HAL_StatusTypeDefHAL_SPI_Receive_DMA(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize);Flash存儲器又稱閃存,它與EEPROM都是掉電后數(shù)據(jù)不丟失的存儲器,但Flash存儲器容量普遍大于EEPROM,現(xiàn)在基本取代了它的地位。我們生活中常用的U盤、SD卡、SSD固態(tài)硬盤以及STM32芯片內(nèi)部用于存儲程序的設(shè)備,都是Flash類型的存儲器。本節(jié)以一種使用SPI通信的串行Flash存儲芯片W25Q128的讀寫為例,講述STM32的SPI使用方法。實(shí)例中STM32的SPI外設(shè)采用主模式,通過查詢事件的方式來確保正常通信。9.4采用STM32Cube和HAL庫的SPI應(yīng)用實(shí)例9.4.1STM32的SPI配置流程使用STM32的SPI2的主模式,下面講述SPI2部分的設(shè)置步驟。SPI相關(guān)的庫函數(shù)和定義分布在文件stm32f4xx_hal_spi.c以及頭文件stm32f4xx_hal_spi.h中。STM32的主模式配置步驟如下:(1)配置相關(guān)引腳的復(fù)用功能,使能SPI2時(shí)鐘。如果要用SPI2,第一步就要使能SPI2的時(shí)鐘,SPI2的時(shí)鐘通過APB1ENR的第14位來設(shè)置。其次要設(shè)置SPI2的相關(guān)引腳為復(fù)用輸出,這樣才會連接到SPI2上否則這些IO口還是默認(rèn)的狀態(tài),也就是標(biāo)準(zhǔn)輸入輸出口。這里使用的是PB13、PB14、PB15這3個(SCK、MISO、MOSI,CS使用軟件管理方式),所以設(shè)置這三個為復(fù)用功能IO。使能SPI2時(shí)鐘的方法為:__HAL_RCC_SPI2_CLK_ENABLE(); //使能SPI2時(shí)鐘復(fù)用PB13、PB14和PB15為SPI2引腳通過HAL_GPIO_Init函數(shù)實(shí)現(xiàn),代碼如下:GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;GPIO_Initure.Mode=GPIO_MODE_AF_PP; //復(fù)用推挽輸出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //快速(2)設(shè)置SPI2工作模式。 這一步全部是通過SPI2_CR1來設(shè)置,設(shè)置SPI2為主機(jī)模式,設(shè)置數(shù)據(jù)格式為8位,然后通過CPOL和CPHA位來設(shè)置SCK時(shí)鐘極性及采樣方式。并設(shè)置SPI2的時(shí)鐘頻率(最大18Mhz),以及數(shù)據(jù)的格式(MSB在前還是LSB在前)。在HAL庫中初始化SPI的函數(shù)為:HAL_StatusTypeDefHAL_SPI_Init(SPI_HandleTypeDef*hspi);(3)使能SPI2。這一步通過SPI2_CR1的bit6來設(shè)置,以啟動SPI2,在啟動之后,就可以開始SPI通信了。庫函數(shù)使能SPI1的方法為:HAL_SPI_ENABLE(&SPI2_Handler);//使能SPI2(4)SPI傳輸數(shù)據(jù)。通信接口當(dāng)然需要有發(fā)送數(shù)據(jù)和接受數(shù)據(jù)的函數(shù),HAL庫提供的發(fā)送數(shù)據(jù)函數(shù)原型為:HAL_StatusTypeDefHAL_SPI_Transmit(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize,uint32_tTimeout);這個函數(shù)很好理解,往SPIx數(shù)據(jù)寄存器寫入數(shù)據(jù)Data,從而實(shí)現(xiàn)發(fā)送。(5)設(shè)置SPI傳輸速度。SPI初始化結(jié)構(gòu)體SPI_InitTypeDef有一個成員變量是BaudRatePrescaler,該成員變量用來設(shè)置SPI的預(yù)分頻系數(shù),從而決定了SPI的傳輸速度。9.4.2SPI與Flash存儲器接口的硬件設(shè)計(jì)W25Q128SPI串行Flash硬件連接圖如圖9-7所示。圖9-7W25Q128SPI串行Flash接口電路圖本開發(fā)板中的Flash芯片(W25Q128)是一種使用SPI通信協(xié)議的NORFlash存儲器,它的CS/CLK/DIO/DO引腳分別連接到STM32對應(yīng)的SPI引腳NSS、SCK、MOSI、MISO上,其中STM32的NSS引腳是一個普通的GPIO,不是SPI的專用NSS引腳,所以程序中要使用軟件控制的方式。本實(shí)例通過KEY1按鍵來控制NORFlash的寫入,通過按鍵KEY0來控制NORFlash的讀取。并在LCD模塊上顯示相關(guān)信息。還可以通過USMART控制讀取NORFlash的ID、擦除某個扇區(qū)或整片擦除。DS0閃爍用于提示程序正在運(yùn)行。在硬件上,LCD模塊與開發(fā)板的IO口對應(yīng)關(guān)系如下:LCD_BL(背光控制)對應(yīng)PB15;LCD_CS對應(yīng)PG12即FSMC_NE4;LCD_RS對應(yīng)PF12即FSMC_A6;LCD_WR對應(yīng)PD5即FSMC_NWE;LCD_RD對應(yīng)PD4即FSMC_NOE;LCD_D[15:0]則直接連接在FSMC_D15~FSMC_D0;9.4.3SPI與Flash存儲器接口的軟件設(shè)計(jì)SPI_InitTypeDef結(jié)構(gòu)體成員用于設(shè)置SPI工作參數(shù),并由外設(shè)初始化配置函數(shù),比如MX_SPI1_Init()調(diào)用,這些設(shè)定參數(shù)將會設(shè)置外設(shè)相應(yīng)的寄存器,達(dá)到配置外設(shè)工作環(huán)境的目的。初始化結(jié)構(gòu)體定義在stm32f4xx_hal_spi.h文件中,初始化庫函數(shù)定義在stm32f4xx_hal_spi.c文件中,編程時(shí)可以結(jié)合這兩個文件內(nèi)注釋使用。SPI_InitTypeDef結(jié)構(gòu)體如下。typedefstruct{uint32_tMode;/*設(shè)置SPI的主/從機(jī)端模式*/uint32_tDirection;/*設(shè)置SPI的單雙向模式*/uint32_tDataSize;/*設(shè)置SPI的數(shù)據(jù)幀長度,可選8/16位*/uint32_tCLKPolarity;/*設(shè)置時(shí)鐘極性CPOL,可選高/低電平*/uint32_tCLKPhase;/*設(shè)置時(shí)鐘相位,可選奇/偶數(shù)邊沿采樣*/uint32_tNSS;/*設(shè)置NSS引腳由SPI硬件控制還是軟件控制*/uint32_tBaudRatePrescaler;/*設(shè)置時(shí)鐘分頻因子,fpclk/分頻數(shù)=fSCK*/uint32_tFirstBit;/*設(shè)置MSB/LSB先行*/uint32_tTIMode;/*指定是否啟用TI模式*/uint32_tCRCCalculation;/*指定是否啟用CRC計(jì)算*/uint32_tCRCPolynomial;/*設(shè)置CRC校驗(yàn)的表達(dá)式*/}SPI_InitTypeDef;1.通過STM32CubeMX新建工程通過STM32CubeMX新建工程的步驟如下:(1)新建文件夾Demo目錄下新建文件夾SPI,這是保存本章新建工程的文件夾。(2)新建STM32CubeMX工程在STM32CubeMX開發(fā)環(huán)境中新建工程。(3)選擇MCU或開發(fā)板CommercialPartNumber和MCUs/MPUsList選擇STM32F407ZGT6,選擇StartProject啟動工程。(4)保存STM32CubeMX工程使用STM32CubeMX菜單File→SaveProject,保存工程。(5)生成報(bào)告使用STM32CubeMX菜單File→GenerateReport生成當(dāng)前工程的報(bào)告文件。(6)配置MCU時(shí)鐘樹STM32CubeMXPinout&Configuration子頁面下,選擇SystemCore→RCC,HighSpeedClock(HSE)根據(jù)開發(fā)板實(shí)際情況,選擇Crystal/CeramicResonator(晶體/陶瓷晶振)。STM32CubeMX切換到ClockConfiguration子頁面下,根據(jù)開發(fā)板外設(shè)情況配置總線時(shí)鐘。此處配置Inputfrequency為8MHz,PLLSourceMux為HSE,分頻系數(shù)/M為8,PLLMul倍頻為336MHz,PLLCLK分頻/2后為168MHz,SystemClockMux為PLLCLK,APB1Prescaler為/4,APB2Prescaler為/2,其余默認(rèn)設(shè)置即可。(7)配置MCU外設(shè)根據(jù)LED、KEY、LCD和SPI1電路,整理出MCU連接的GPIO引腳的輸入/輸出配置。配置完成后的GPIO端口頁面如圖9-8所示。圖9-8配置完成后的GPIO端口頁面在STM32CubeMX中配置完SPI1和USART1后,會自動完成相關(guān)GPIO口的配置,不需用戶配置。配置完成后的SPI1GPIO端口頁面如圖9-9所示。圖9-9配置完成后的SPI1GPIO端口頁面STM32CubeMXPinout&Configuration子頁面下選擇Connectivity→USART1,對USART1進(jìn)行設(shè)置。Mode選擇Asynchronous,HardwareFlowControl(RS232)選擇Disable,ParameterSettings具體配置如圖9-10所示。圖9-10USART1配置頁面STM32CubeMXPinout&Configuration子頁面下選擇Connectivity→SPI1,對SPI1進(jìn)行設(shè)置。Mode為Full-DuplexMaster,具體配置如圖9-11所示。圖9-11SPI1配置頁面STM32CubeMXPinout&Configuration子頁面下選擇Timers→TIM4,對TIM4進(jìn)行設(shè)置。ClockSource選擇InternalClock,具體配置如圖9-12所示。圖9-12TIM4配置頁面STM32CubeMXPinout&Configuration子頁面下選擇Connectivity→FSMC,對FSMC模塊進(jìn)行設(shè)置。ChipSelect選擇NE4,MemoryType選擇LCDInterface,LCDRegisterSelect選擇A6,Data選擇16bits,具體配置如圖9-13所示。圖9-13FSMC配置頁面切換到STM32CubeMXPinout&Configuration子頁面下選擇SystemCore→NVIC,修改PriorityGroup為2bitsforpre-emptionpriority(2位搶占優(yōu)先級),Enabled欄勾選TIM4globalinterrupt和USART1globalinterrupt,修改TIM4globalinterrupt、USART1globalinterrupt的PreemptionPriority(搶占優(yōu)先級)和SubPriority(子優(yōu)先級)如圖9-14所示。圖9-14NVIC配置頁面CodeGeneration頁面Selectforinitsequenceordering欄勾選TIM4globali

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論