6.8.2 SPI****初始化配置
首先看一下SPI外設(shè)的初始化結(jié)構(gòu)體成員及其描述。
1、SPI_Dirention 設(shè)置了SPI是單向通信還是雙向的通信數(shù)據(jù)模式,設(shè)置參數(shù)如表6-3所示。
2、SPI_Mode設(shè)置了SPI 設(shè)備是工作在主機(jī)模式還是從機(jī)模式,設(shè)置參數(shù)如表6-4所示。
3、SPI_DataSize設(shè)置了SPI通信時(shí)數(shù)據(jù)幀是8位還是16位,沒有特殊要求,通常配置為8位模式,設(shè)置參數(shù)如表6-5所示。
4、SPI_CPOL設(shè)置了SPI串行時(shí)鐘SCK的時(shí)鐘極性,選擇該參數(shù)時(shí)需要確保SPI通信雙方保持一致,一般根據(jù)SPI從設(shè)備支持的模式設(shè)定,設(shè)置參數(shù)如表6-6所示
5、SPI_CPHA設(shè)置了SPI采樣時(shí)發(fā)生在SCK的哪個(gè)邊沿,該參數(shù)同樣需要確保通信雙方保持一致,一般也是根據(jù)從設(shè)備支持的模式設(shè)定,設(shè)置參數(shù)如表6-7所示
6、SPI_NSS設(shè)置了NSS片選引腳是由選擇硬件模式,還是由軟件模式。采用硬件管理時(shí),片選信號由SPI硬件自動(dòng)產(chǎn)生,不需要手動(dòng)設(shè)置,而軟件模式需要手動(dòng)設(shè)置片選引腳電平。實(shí)際開發(fā)中通常設(shè)置為軟件模式,即使用普通IO口作為片選引腳。設(shè)置參數(shù)如表6-8所示
7、SPI_BaudRatePrescaler設(shè)置了SPI波特率預(yù)分頻系數(shù),分頻后的時(shí)鐘就是SCK信號線的時(shí)鐘頻率。注意SPI正在通信時(shí)不能更改波特率預(yù)分頻系數(shù),具體設(shè)置參數(shù)如表6-9所示
8、SPI_FirstBit設(shè)置了數(shù)據(jù)傳輸是高位在前(MSB先行)還是低位在前(LSB先行),沒有特殊要求一般設(shè)置為高位在前(MSB先行)設(shè)置參數(shù)如表6-10所示。
9、SPI_CRCPolynomial設(shè)置是否使用CRC校驗(yàn)。使用時(shí)根據(jù)需求設(shè)置CRC多項(xiàng)式,不使用時(shí)設(shè)置其值為7(復(fù)位值為0x0007,默認(rèn)不使用)。無特殊要求通常不設(shè)置CRC校驗(yàn)。
SPI配置流程:
1、使能SPI外設(shè)時(shí)鐘及SPI接口引腳時(shí)鐘
2、初始化SPI引腳——初始化NSS、SCK、MISO、MOSI引腳。
3、初始化SPI外設(shè)——根據(jù)需求設(shè)置SPI初始化結(jié)構(gòu)體成員參數(shù)
4、使能SPI外設(shè)——SPI使能庫函數(shù)為:SPI_Cmd(SPIx, ENABLE);其中SPIx,x為1、
2、3,用來選擇SPI外設(shè)。
5、編寫SPI數(shù)據(jù)發(fā)送和接收函數(shù)
6.8.3 SPI數(shù)據(jù)發(fā)送和接收
SPI數(shù)據(jù)發(fā)送和接收過程與USART類似,由數(shù)據(jù)緩沖區(qū)和一個(gè)8位的雙向移位寄存器構(gòu)成。SPI的數(shù)據(jù)緩沖區(qū)叫做數(shù)據(jù)寄存器(SPI_DR),雖然是一個(gè)寄存器,但是實(shí)質(zhì)上包含兩個(gè)緩沖區(qū):發(fā)送緩沖和接收緩沖,分別用于進(jìn)行寫操作和讀操作。與USART兩個(gè)單獨(dú)的移位寄存器不同,SPI只有一個(gè)移位寄存器且是雙向的,同一時(shí)刻既向MOSI上移出要發(fā)送的數(shù)據(jù),又將MISO上的數(shù)據(jù)向內(nèi)移入,這個(gè)過程是同步的,SPI傳輸結(jié)構(gòu)如圖6-11所示。
圖6-11 SPI數(shù)據(jù)傳輸結(jié)構(gòu)圖
SPI發(fā)送數(shù)據(jù)時(shí)只需要將數(shù)據(jù)寫入到SPI_DR,SPI會(huì)自動(dòng)將其分配到發(fā)送緩沖區(qū),然后再將數(shù)據(jù)從發(fā)送緩沖區(qū)并行傳送到移位寄存器中,同時(shí)設(shè)置一個(gè)發(fā)送緩沖區(qū)為空(TXE)的標(biāo)志位,最后數(shù)據(jù)按照設(shè)定的數(shù)據(jù)格式(MSB或LSB)被串行的從MOSI引腳移出。與此同時(shí)MISO引腳也會(huì)接收到數(shù)據(jù),接收到的數(shù)據(jù)同樣按照相應(yīng)的格式被串行的移入到移位寄存器,當(dāng)接收完一幀數(shù)據(jù)后,移位寄存器將接收到的數(shù)據(jù)傳送到接收緩沖區(qū)中,同時(shí)會(huì)設(shè)置一個(gè)接收緩沖區(qū)非空(RXNE)的標(biāo)志位。使用SPI發(fā)送和接收數(shù)據(jù)時(shí)并不需要關(guān)心數(shù)據(jù)是怎么發(fā)送或者接收到的,只需要檢測相應(yīng)標(biāo)志位后向數(shù)據(jù)寄存器(SPI_DR)寫入要發(fā)送的數(shù)據(jù)或者讀出接收到的數(shù)據(jù)即可。
TXE標(biāo)志位被置位僅表示發(fā)送緩沖區(qū)為空,可以繼續(xù)向SPI_DR寫入數(shù)據(jù),但并不代表數(shù)據(jù)發(fā)送完成,這一點(diǎn)一定要搞清楚。向發(fā)送緩沖區(qū)寫入數(shù)據(jù)會(huì)清除TXE標(biāo)志位,如果TXE=0即發(fā)生緩沖區(qū)非空時(shí),向SPI_DR中寫入數(shù)據(jù)會(huì)覆蓋發(fā)送緩沖區(qū)中的數(shù)據(jù),但不會(huì)影響移位寄存器中的數(shù)據(jù)。RXNE=1表示接收緩沖區(qū)非空,即已經(jīng)接收到一幀數(shù)據(jù)。讀SPI_DR寄存器硬件會(huì)自動(dòng)清除RXNE標(biāo)志位,并返回接收到的數(shù)據(jù)。當(dāng)SPI接收到一幀數(shù)據(jù)時(shí),意味著SPI肯定已經(jīng)發(fā)送完一幀數(shù)據(jù),因此判斷一幀數(shù)據(jù)是否發(fā)送完成,可以通過檢測RXNE標(biāo)志位。如果設(shè)置了SPI_CR1寄存器中的TXEIE位或者SPI_CR2寄存器中的RXNEIE位,將產(chǎn)生對應(yīng)的中斷。本文主要是以查詢方式介紹SPI如何收發(fā)數(shù)據(jù)。
使用查詢方式檢測TXE和RXNE標(biāo)志位時(shí)需要用到SPI標(biāo)志位檢測函數(shù),如下所示:
SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);其中SPIx中x為1、2、3,用來選擇SPI外設(shè);SPI_I2S_FLAG為被檢測的標(biāo)志位,如表6-11所示。
同時(shí)庫函數(shù)中也有對應(yīng)的SPI數(shù)據(jù)發(fā)送和接收函數(shù),分別為:(固件庫手冊中所示的發(fā)送和接收函數(shù)有誤,實(shí)際以本文為準(zhǔn))
SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);//SPI發(fā)送函數(shù)
SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);//SPI接收函數(shù)
SPI使用查詢方式發(fā)送和接收數(shù)據(jù)時(shí),在發(fā)送和接收數(shù)據(jù)之前需要檢測相應(yīng)標(biāo)志位,然后再調(diào)用庫函數(shù)發(fā)送或者接收數(shù)據(jù),這樣操作雖然方便,但是由于函數(shù)相互調(diào)用會(huì)占用時(shí)間,當(dāng)傳輸數(shù)據(jù)量較大時(shí)會(huì)降低SPI整體傳輸效率。為了提高SPI的整體傳輸效率,本文采用寄存器方式操作。另外SPI在接收從機(jī)數(shù)據(jù)時(shí),由于從機(jī)自身不產(chǎn)生時(shí)鐘信號(SCK),通信時(shí)需要主機(jī)提供SCK以啟動(dòng)數(shù)據(jù)傳輸,因此主機(jī)需要通過發(fā)送的數(shù)據(jù)來提供SCK并接收從機(jī)的數(shù)據(jù),發(fā)送的數(shù)據(jù)并不生效。
以下是配置SPI2為主模式,8位數(shù)據(jù)格式,CPOL=1,CPHA=1,波特率2分頻,MSB先行,不使用CRC校驗(yàn),使用時(shí)可根據(jù)具體要求進(jìn)行修改。由于SPI外設(shè)掛載了多個(gè)從機(jī)設(shè)備,為了方便移植,初始化SPI時(shí)并未設(shè)置片選引腳,而是選擇將片選引腳與SPI從設(shè)備放在一起配置,具體代碼如下:
96.9 SPI讀寫W25Q128
6.9.1 W25Q128****簡介
Flash是一種掉電不丟數(shù)據(jù)的非易失存儲(chǔ)設(shè)備,生活中常見的閃存存儲(chǔ)設(shè)備包塊固態(tài)硬盤、U盤、SD卡以及單片機(jī)內(nèi)部的存儲(chǔ)設(shè)備等。Flash具有存儲(chǔ)空間更大,讀取速率快、可靠性高等特點(diǎn)。本節(jié)所要介紹的W25Q128就是Flash的一種,只不過它是以芯片的形式存在。 W25Q128是華邦公司推出的一款SPI接口的NOR Flash芯片,其存儲(chǔ)空間為128Mbit,相當(dāng)于16M字節(jié)。W25Q128可以支持SPI的模式0和模式3,也就是CPOL=0/CPHA=0和CPOL=1/CPHA=1這兩種模式。
往Flash寫入數(shù)據(jù)時(shí),需要注意以下兩個(gè)重要問題:
1、Flash寫入數(shù)據(jù)時(shí)和EEPROM類似,不能跨頁寫入,一次最多寫入一頁,W25Q128的一頁是256字節(jié)。寫入數(shù)據(jù)一旦跨頁,必須在寫滿上一頁的時(shí)候,等待Flash將數(shù)據(jù)從緩存搬移到非易失區(qū),重新再次往里寫。
2、Flash有一個(gè)特點(diǎn),就是可以將1寫成0,但是不能將0寫成1,要想將0寫成1,必須進(jìn)行擦除操作。因此通常要改寫某部分空間的數(shù)據(jù),必須首先進(jìn)行一定物理存儲(chǔ)空間擦除,最小的擦除空間,通常稱之為扇區(qū),扇區(qū)擦除就是將這整個(gè)扇區(qū)每個(gè)字節(jié)全部變成0xFF。每款Flash的扇區(qū)大小不一定相同,W25Q128的一個(gè)扇區(qū)是4096字節(jié)。為了提高擦除效率,使用不同的擦除指令還可以一次性進(jìn)行32K(8個(gè)扇區(qū))、64K(16個(gè)扇區(qū))以及整片擦除。
Kingst-32F1開發(fā)板中W25Q128對應(yīng)的管腳連接關(guān)系如圖6-10所示。
圖6-12 W25Q128電路原理圖及其引腳
6.9.2 W25Q128****讀寫操作
W25Q128內(nèi)部有一個(gè)“SPI Command & Control Logic”,可以通過SPI接口向其發(fā)送指令,從而執(zhí)行相應(yīng)操作。指令的長度是不定的,有單字節(jié)的,也有多字節(jié)的,W25Qxx一共具有34個(gè)操作指令,在此只列舉常用的12個(gè),具體如表6-13所示。
-
單片機(jī)
+關(guān)注
關(guān)注
6050文章
44701瀏覽量
641289 -
SPI
+關(guān)注
關(guān)注
17文章
1731瀏覽量
92898 -
EEPROM
+關(guān)注
關(guān)注
9文章
1048瀏覽量
82387 -
IIC
+關(guān)注
關(guān)注
11文章
304瀏覽量
38732 -
uart通信
+關(guān)注
關(guān)注
0文章
19瀏覽量
7038
發(fā)布評論請先 登錄
相關(guān)推薦
一文詳解IIC總線

一文詳解IIC總線

SPI總線學(xué)習(xí)筆記

IIC總線和SPI總線的比較

IIC總線接口學(xué)習(xí)

一文解讀IIC總線的FPGA實(shí)現(xiàn)原理及過程

一文講透SPI總線和IIC總線通信1

一文講透SPI總線和IIC總線通信2

一文講透SPI總線和IIC總線通信4

評論