STM32學(xué)習(xí)筆記之硬件SPI讀寫(xiě)與極性設(shè)置
【軟件中如何設(shè)置SPI的極性和相位】SPI分主設(shè)備和從設(shè)備,兩者通過(guò)SPI協(xié)議通訊。而設(shè)置SPI的模式,是從設(shè)備的模式,決定了主設(shè)備的模式。所以要先去搞懂從設(shè)備的SPI是何種模式,然后再將主設(shè)備的SPI的模式,設(shè)置和從設(shè)備相同的模式,即可正常通訊。對(duì)于從設(shè)備的SPI是什么模式,有兩種:(1)固定的,有SPI從設(shè)備硬件決定的SPI從設(shè)備,具體是什么模式,相關(guān)的datasheet中會(huì)有描述,需要自己去datasheet中找到相關(guān)的描述,即:關(guān)于SPI從設(shè)備,在空閑的時(shí)候,是高電平還是低電平,即決定了CPOL是0還是1;然后再找到關(guān)于設(shè)備是在上升沿還是下降沿去采樣數(shù)據(jù),這樣就是,在定了CPOL的值的前提下,對(duì)應(yīng)著可以推算出CPHA是0還是1了。舉例1:CC2500-Low-CostLow-Power2.4GHzRFTransceiver的datasheet中SPI的時(shí)序圖是:
從圖中可以看到,最開(kāi)始的SCLK和結(jié)束時(shí)候的SCLK,即空閑時(shí)刻的SCLK,是低電平,推導(dǎo)出CPOL=0,然后可以看到數(shù)據(jù)采樣的時(shí)候,即數(shù)據(jù)最中間的那一點(diǎn),對(duì)應(yīng)的是SCLK的第一個(gè)邊沿,所以CPHA=0(此時(shí)對(duì)應(yīng)的是上升沿)。舉例2:SSD1289-240RGBx320TFTLCDControllerDriver的datasheet中提到:“SDIisshiftedinto8-bitshiftregisteroneveryrisingedgeofSCKintheorderofdatabit7,databit6……databit0.”意思是,數(shù)據(jù)是在上升沿采樣,所以可以斷定是CPOL=0,CPHA=0,或者CPOL=1,CPHA=1的模式,但是至于是哪種模式。按理來(lái)說(shuō),接下來(lái)應(yīng)該再去確定SCLK空閑時(shí)候是高電平還是低電平,用以確定CPOL是0還是1,但是datasheet中沒(méi)有提到這點(diǎn)。所以,此處,目前不太確定,是兩種模式都支持,還是需要額外找證據(jù)卻確定CPOL是0還是1.(2)可配置的,由軟件自己設(shè)定從設(shè)備也是一個(gè)SPI控制器,4種模式都支持,此時(shí)只要自己設(shè)置為某種模式即可。然后知道了從設(shè)備的模式后,再去將SPI主設(shè)備的模式,設(shè)置為和從設(shè)備模式一樣,即可。 對(duì)于如何配置SPI的CPOL和CPHA的話,不多細(xì)說(shuō),多數(shù)都是直接去寫(xiě)對(duì)應(yīng)的SPI控制器中對(duì)應(yīng)寄存器中的CPOL和CPHA那兩位,寫(xiě)0或?qū)?即可。舉例:C8051F347中的SPI就是一個(gè)SPI的controller控制器,即支持軟件配置CPOL和CPHA的值,四種模式都支持,此處C8051F347作為SPI從設(shè)備,設(shè)置了CPOL=1,CPHA=0的模式,因此,此處對(duì)應(yīng)主芯片中的SPI控制器,作為Master主設(shè)備,其SPI的模式也要設(shè)置為CPOL=1,CPHA=0,即可。
【SPI的讀寫(xiě)程序設(shè)計(jì)】文中標(biāo)紅的是特別注意看的地方主要是熟悉flash芯片的指令集,以及存儲(chǔ)芯片扇區(qū)和塊的理解,最重要的是擦除都是以扇區(qū)擦除的方式。
本節(jié)將利用SPI來(lái)實(shí)現(xiàn)對(duì)外部FLASH(W25X16)的讀寫(xiě),并將結(jié)果顯示在TFTLCD模塊上。本節(jié)分為如下幾個(gè)部分:
3.17.1 SPI簡(jiǎn)介
3.17.2硬件設(shè)計(jì)
3.17.3軟件設(shè)計(jì)
3.17.4下載與測(cè)試
1 SPI簡(jiǎn)介
SPI是英語(yǔ)Serial Peripheralinterface的縮寫(xiě),顧名思義就是串行外圍設(shè)備接口。是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應(yīng)用在EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD轉(zhuǎn)換器,還有數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器之間。SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡(jiǎn)單易用的特性,現(xiàn)在越來(lái)越多的芯片集成了這種通信協(xié)議,STM32也有SPI接口。
SPI接口一般使用4條線:
MISO主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出。
MOSI主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入。
SCLK時(shí)鐘信號(hào),由主設(shè)備產(chǎn)生。
CS從設(shè)備片選信號(hào),由主設(shè)備控制。
SPI主要特點(diǎn)有:可以同時(shí)發(fā)出和接收串行數(shù)據(jù);可以當(dāng)作主機(jī)或從機(jī)工作;提供頻率可編程時(shí)鐘;發(fā)送結(jié)束中斷標(biāo)志;寫(xiě)沖突保護(hù);總線競(jìng)爭(zhēng)保護(hù)等。
SPI總線四種工作方式SPI模塊為了和外設(shè)進(jìn)行數(shù)據(jù)交換,根據(jù)外設(shè)工作要求,其輸出串行同步時(shí)鐘極性和相位可以進(jìn)行配置,時(shí)鐘極性(CPOL)對(duì)傳輸協(xié)議沒(méi)有重大的影響。如果CPOL=0,串行同步時(shí)鐘的空閑狀態(tài)為低電平;如果CPOL=1,串行同步時(shí)鐘的空閑狀態(tài)為高電平。時(shí)鐘相位(CPHA)能夠配置用于選擇兩種不同的傳輸協(xié)議之一進(jìn)行數(shù)據(jù)傳輸。如果CPHA=0,在串行同步時(shí)鐘的第一個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣;如果CPHA=1,在串行同步時(shí)鐘的第二個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣。SPI主模塊和與之通信的外設(shè)備時(shí)鐘相位和極性應(yīng)該一致。
不同時(shí)鐘相位下的總線數(shù)據(jù)傳輸時(shí)序見(jiàn)下圖:
圖3.17.1.1不同時(shí)鐘相位下的總線傳輸時(shí)序(CPHA=0/1)
STM32的SPI功能很強(qiáng)大,SPI時(shí)鐘最多可以到18Mhz,支持DMA,可以配置為SPI協(xié)議或者I2S協(xié)議。
本節(jié),我們將利用STM32的SPI來(lái)讀取外部SPIFLASH芯片(W25X16),實(shí)現(xiàn)類(lèi)似上節(jié)的功能。這里對(duì)SPI我們只簡(jiǎn)單介紹一下SPI的使用,STM32的SPI詳細(xì)介紹請(qǐng)參考《STM32參考手冊(cè)》第422頁(yè),22節(jié)。然后我們?cè)俳榻B下SPIFLASH芯片。
這節(jié),我們使用STM32的SPI1的主模式,下面就來(lái)看看SPI1部分的設(shè)置步驟吧,STM32的主模式配置步驟如下:
1)配置相關(guān)引腳的復(fù)用功能,使能SPI1時(shí)鐘。
我們要用SPI1,第一步就要是能SPI1的時(shí)鐘,SPI1的時(shí)鐘通過(guò)APB2ENR的第12位來(lái)設(shè)置。其次要設(shè)置SPI1的相關(guān)引腳為復(fù)用輸出,這樣才會(huì)連接到SPI1上否則這些IO口還是默認(rèn)的狀態(tài),也就是標(biāo)準(zhǔn)輸入輸出口。這里我們使用的是PA5、6、7這3個(gè)(SCK.、MISO、MOSI,CS使用軟件管理方式),所以設(shè)置這三個(gè)為復(fù)用IO。
2)設(shè)置SPI1工作模式。
這一步全部是通過(guò)SPI1_CR1來(lái)設(shè)置,我們?cè)O(shè)置SPI1為主機(jī)模式,設(shè)置數(shù)據(jù)格式為8位,然后通過(guò)CPOL和CPHA位來(lái)設(shè)置SCK時(shí)鐘極性及采樣方式。并設(shè)置SPI1的時(shí)鐘頻率(最大18Mhz),以及數(shù)據(jù)的格式(MSB在前還是LSB在前)。
3)使能SPI1。
這一步通過(guò)SPI1_CR1的bit6來(lái)設(shè)置,以啟動(dòng)SPI1,在啟動(dòng)之后,我們就可以開(kāi)始SPI通訊了。
SPI1的使用就介紹到這里,接下來(lái)介紹一下W25X16。W25X16是華邦公司推出的繼W25X10/20/40/80(從1Mb~8Mb)后容量更大的FLASH產(chǎn)品,W25X16的容量為16Mb,還有容量更大的W25X32/64,ALIENTEK所選擇的W25X16容量為16Mb,也就是2M字節(jié),同AT45DB161是一樣大小的。
W25X16將2M的容量分為32個(gè)塊(Block),每個(gè)塊大小為64K字節(jié),每個(gè)塊又分為16個(gè)扇區(qū)(Sector),每個(gè)扇區(qū)4K個(gè)字節(jié)。W25X16的最少擦除單位為一個(gè)扇區(qū),也就是每次必須擦除4K個(gè)字節(jié)。這樣我們需要給W25X16開(kāi)辟一個(gè)至少4K的緩存區(qū),這樣對(duì)SRAM要求比較高(相對(duì)于AT45DB161來(lái)說(shuō)),但是它有價(jià)格及供貨上的優(yōu)勢(shì)。
W25X16的差些周期為10000次,具有20年的數(shù)據(jù)保存期限,支持電壓為2.7~3.6V,W25X16支持標(biāo)準(zhǔn)的SPI,還支持雙輸出的SPI,最大SPI時(shí)鐘可以到75Mhz(雙輸出時(shí)相當(dāng)于150Mhz),更多的W25X16的介紹,請(qǐng)參考W25X16的DATASHEET。
2硬件設(shè)計(jì)
本節(jié)實(shí)驗(yàn)功能簡(jiǎn)介:開(kāi)機(jī)的時(shí)候先檢測(cè)W25X16是否存在,然后在主循環(huán)里面用1個(gè)按鍵用來(lái)執(zhí)行寫(xiě)入W25X16的操作,另外一個(gè)按鍵用來(lái)執(zhí)行讀出操作,在TFTLCD模塊上顯示相關(guān)信息。同時(shí)用DS0提示程序正在運(yùn)行。
所要用到的硬件資源如下:
1)STM32F103RBT6。
2)DS0(外部LED0)。
3)KEY0和KEY2。
4)TFTLCD液晶模塊。
5)W25X16。
前面4部分的資源,我們前面已經(jīng)介紹了,請(qǐng)大家參考相關(guān)章節(jié)。這里只介紹W25X16與STM32的連接,板上的W25X16是直接連在STM32F103RBT6上的,連接關(guān)系如下圖:
圖3.17.2.1STM32F103RBT6與W25X16連接電路圖
3軟件設(shè)計(jì)
打開(kāi)上一節(jié)的工程,首先在HARDWARE文件夾下新建一個(gè)FLASH的文件夾和SPI的文件夾。然后新建一個(gè)flash.c和flash.h的文件保存在FLASH文件夾下,新建spi.c和spi.h的文件,保存在SPI文件夾下,并將這兩個(gè)文件夾加入頭文件包含路徑。
打開(kāi)spi.c文件,輸入如下代碼:
#include"spi.h"
//SPI口初始化
//這里針是對(duì)SPI1的初始化
voidSPIx_Init(void)
{
RCC->APB2ENR"=1<<2; //PORTA時(shí)鐘使能
RCC->APB2ENR|=1<<12; //SPI1時(shí)鐘使能
//這里只針對(duì)SPI口初始化
GPIOA->CRL&=0X000FFFFF;
GPIOA->CRL|=0XBBB00000;//PA5.6.7復(fù)用
GPIOA->ODR|=0X7<<5; //PA5.6.7上拉
SPI1->CR1|=0<<10;//全雙工模式
SPI1->CR1|=1<<9; //軟件nss管理
SPI1->CR1|=1<<8;