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