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