那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32CubeMx之硬件SPI驅(qū)動(dòng)W25Q64

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-05-30 09:23 ? 次閱讀

1.SPI簡(jiǎn)介

SPI是串行外設(shè)接口(Serial Peripheral Interface)的縮寫,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡(jiǎn)單易用的特性,越來越多的芯片集成了這種通信協(xié)議。
SPI:高速同步串行口。是一種標(biāo)準(zhǔn)的四線同步雙向串行總線,是串行外圍設(shè)備接口。是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應(yīng)用在 EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘AD轉(zhuǎn)換器,還有數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器之間。
該接口一般使用4條線:串行時(shí)鐘線(SCLK)、主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線MISO、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI和低電平有效的從機(jī)選擇線SS(有的SPI接口芯片帶有中斷信號(hào)線INT、有的SPI接口芯片沒有主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI)。
SPI根據(jù)時(shí)鐘極性(CPOL)和時(shí)鐘相位(CPHA)的不同,能夠產(chǎn)生4時(shí)鐘時(shí)序。時(shí)鐘極性(CPOL)控制時(shí)鐘線空閑電平狀態(tài),時(shí)鐘相位(CPHA)用來控制數(shù)據(jù)采樣極性。
模式0:CPOL=0,CPHA=0

??時(shí)鐘線空閑電平為低電平,第一個(gè)邊沿采樣數(shù)據(jù),第二個(gè)邊沿發(fā)送數(shù)據(jù);

poYBAGKTe8WAafPkAAEtiNNazwU314.png

模式1:CPOL=0,CPHA=1
??時(shí)鐘線空閑電平為低電平,第一個(gè)邊沿發(fā)送數(shù)據(jù),第二個(gè)邊沿采樣數(shù)據(jù);

poYBAGKTe_-AYcN_AAFaGKTnV3Y039.png

模式2:CPOL=1,CPHA=0
??時(shí)鐘線空閑電平為高電平,第一個(gè)邊沿采樣數(shù)據(jù),第二個(gè)邊沿發(fā)送數(shù)據(jù);

pYYBAGKTfBaARsLDAAFm1Hq5LOk142.png

模式3:CPOL=1,CPHA=1
??時(shí)鐘線空閑電平為高電平,第一個(gè)邊沿發(fā)送數(shù)據(jù),第二個(gè)邊沿采樣數(shù)據(jù);

poYBAGKTfDWADXExAAF4HWrm9dE456.png

2 硬件接口

  • CPUSTM32F103ZE
  • 屏幕:3.5寸TFTLCD屏
  • Flash: W25Q64(SPI方式)
  • 軟件平臺(tái): STM32CubeMx

2.1 W25Q64簡(jiǎn)介

W25Q64(64M-bit),W25Q16(16M-bit)和W25Q32(32M-bit)是為系統(tǒng)提供一個(gè)最小的空間、引腳和功耗的存儲(chǔ)器解決方案的串行Flash存儲(chǔ)器。25Q系列比普通的串行Flash存儲(chǔ)器更靈活,性能更優(yōu)越。基于雙倍/四倍的SPI,它們能夠可以立即完成提供數(shù)據(jù)給RAM,包括存儲(chǔ)聲音、文本和數(shù)據(jù)。芯片支持的工作電壓2.7V到3.6V,正常工作時(shí)電流小于5mA,掉電時(shí)低于1uA。所有芯片提供標(biāo)準(zhǔn)的封裝。
W25Q64/16/32由每頁(yè)256字節(jié)組成。每頁(yè)的256字節(jié)用一次頁(yè)編程指令即可完成。每次可以擦除16頁(yè)(1個(gè)扇區(qū))、128 頁(yè)(32KB塊)、256頁(yè)(64KB塊)和全片擦除。
W25Q64的內(nèi)存空間結(jié)構(gòu):一頁(yè)256字節(jié),4K(4096字節(jié))為一個(gè)扇區(qū),16個(gè)扇區(qū)為1塊,容量為8M字節(jié),共有128個(gè)塊,2048個(gè)扇區(qū)。
W25Q64可擦寫周期至少10萬次,數(shù)據(jù)保存20年。
W25Q64驅(qū)動(dòng)方式為SPI,支持SPI總線的工作模式0(0,0)和3( 1,1)。模式0和模式3。

2.2 硬件接口

pYYBAGKTfJSAYDy3AADB-jTd_-k869.png
引腳 說明
CS 片選(低電平選中) PB12
SPI2_MISO 主機(jī)輸入從機(jī)輸出PB14
SPI2_MOSI 主機(jī)輸出從機(jī)輸入PB15
SPI_SCK 時(shí)鐘線PB13
CS 片選(低電平選中) PB12

2.3 軟件設(shè)置

SPI2配置:

pYYBAGKTfNKAHzCBAAE1vYRf4dw724.png

NSS引腳配置:

pYYBAGKTfN6AU-D6AABxrCCnUVE084.png

3 代碼生成

3.1 SPI初始化

??SPI配置信息可參考STM32中文參考手冊(cè)第23.5.1SPI控制寄存器小結(jié)。

在這里插入圖片描述poYBAGKTfRSAL1HiAAPFTjVUqZc348.png

3.2 SPI讀寫一字節(jié)函數(shù)

uint8_t SPI2_WROneByte(uint8_t data)
{
	uint8_t dat_rx=0;
	HAL_SPI_TransmitReceive(&hspi2,&data,&dat_rx,1,100);
	return dat_rx;
}

3.3 W25Q64 編程

3.3.1 讀取W25Q64制造商/芯片ID

pYYBAGKTfWyAUFjLAAKwLRdV-bs914.png
/*獲取W25Q64設(shè)備ID*/
uint16_t W25Q64_GetDeviceID(void)
{
	uint16_t id;
	W25Q64_CS(0);//選中W25Q64
	SPI2_WROneByte(0x90);//發(fā)送指令0x90
	//發(fā)送24位地址
	SPI2_WROneByte(0);
	SPI2_WROneByte(0);
	SPI2_WROneByte(0);
	id=SPI2_WROneByte(0xff);//制造商ID:0xef
	id<<=8;
	id|=SPI2_WROneByte(0xff);//設(shè)備ID:0x16
	W25Q64_CS(1);//取消選中
	return id;
}

3.3.2 W25Q64頁(yè)編程0x02

poYBAGKTfZeAMV_cAAGfmsDKw0o490.png

頁(yè)編程指令允許從一個(gè)字節(jié)到256字節(jié)的數(shù)據(jù)編程(一頁(yè))(編程之前必須保證內(nèi)存空間是 0XFF)。允許寫入指令之前,必須先發(fā)送設(shè)備寫使能指令。寫使能開啟后,設(shè)備才能接收編程指令。開啟頁(yè)編程先拉底/ CS, 然后發(fā)送指令代碼“02 h”,接著發(fā)送一個(gè) 24 位地址(A23-A0)(發(fā)送3次,每次 8 位) 和至少一個(gè)數(shù)據(jù)字節(jié)(數(shù)據(jù)字節(jié)不能超過256字節(jié))。數(shù)據(jù)字節(jié)發(fā)送完畢,需要拉高片選線 CS/,并判斷狀態(tài)位,等待寫入結(jié)束。
進(jìn)行頁(yè)編程時(shí),如果數(shù)據(jù)字節(jié)數(shù)超過了256字節(jié),地址將自動(dòng)回到頁(yè)的起始地址,覆蓋掉之前的數(shù)據(jù)。在某些情況下,數(shù)據(jù)字節(jié)小于256字節(jié)(同一頁(yè)內(nèi)), 也可以正常對(duì)其他字節(jié)存放,不會(huì)有任何影響。如果存放超過256字節(jié)的數(shù)據(jù),需要分次編程存放。
3.3.3 W25Q64讀數(shù)據(jù)0x03

pYYBAGKTfb2AZEtqAAEDsmbzBOU116.png

讀取數(shù)據(jù)指令允許按順序讀取一個(gè)字節(jié)的內(nèi)存數(shù)據(jù)。當(dāng)片選CS/拉低之后, 緊隨其后是一個(gè)24位的地址(A23-A0)(需要發(fā)送3次,每次8個(gè)字節(jié),先發(fā)高位)。芯片收到地址后,將要讀的數(shù)據(jù)按字節(jié)大小轉(zhuǎn)移出去,數(shù)據(jù)是先轉(zhuǎn)移高位,對(duì)于單片機(jī),時(shí)鐘下降沿發(fā)送數(shù)據(jù),上升沿接收數(shù)據(jù)。讀數(shù)據(jù)時(shí),地址會(huì)自動(dòng)增加,允許連續(xù)的讀取數(shù)據(jù)。這意味著讀取整個(gè)內(nèi)存的數(shù)據(jù),只要用一個(gè)指令就可以讀完。數(shù)據(jù)讀取完成之后,片選信號(hào)/ CS 拉高。讀取數(shù)據(jù)的指令序列,如上圖所示。如果一個(gè)讀數(shù)據(jù)指令而發(fā)出的時(shí)候,設(shè)備正在擦除扇區(qū),或者(忙= 1),該讀指令將被忽略,也不會(huì)對(duì)當(dāng)前周期有什么影響。

3.3.4 扇區(qū)擦除0x20

poYBAGKTfeKAEK5OAACvOjcL-6Q865.png


扇區(qū)擦除指令可以擦除指定一個(gè)扇區(qū)(4 k字節(jié))內(nèi)所有數(shù)據(jù),將內(nèi)存空間恢復(fù)到 0xFF 狀態(tài)。寫入扇區(qū)擦除指令之前必須執(zhí)行設(shè)備寫使能(發(fā)送設(shè)備寫使能指令 0x06),并判斷狀態(tài)寄存器(狀態(tài)寄存器位最低位必須等于0才能操作)。發(fā)送的扇區(qū)擦除指令前,先拉低/ CS, 接著發(fā)送扇區(qū)擦除指令碼”20 h”,和24位地址(A23-A0),地址發(fā)送完畢后,拉高片選線 CS/,并判斷狀態(tài)位,等待擦除結(jié)束。擦除一個(gè)扇區(qū)的最少需要 150ms 時(shí)間。
3.3.5 讀狀態(tài)0x05和0x35

pYYBAGKTfjSAOGxWAAJhn-GvoXU455.png

讀取狀態(tài)寄存器的指令是8位的指令。發(fā)送指令之前,先將/ CS 拉低,再發(fā)送指令碼“05 h”或者“35h”。設(shè)備收到讀取狀態(tài)寄存器的指令后,將狀態(tài)信息(高位)依次移位發(fā)送出去,讀出的狀態(tài)信息,最低位為1代表忙,最低位為0代表可以操作,狀態(tài)信息讀取完畢,將片選線拉高。
讀狀態(tài)寄存器指令可以使用在任何時(shí)候,即使程序在擦除的過程中或者寫狀態(tài)寄存器周期正在進(jìn)行中。這可以檢測(cè)忙碌狀態(tài)來確定周期是否完成,以確定設(shè)備是否可以接受另一個(gè)指令。

3.3.6 W25Q64指令表

pYYBAGKTfmCARbQZAAHgC4ptNvs288.png

4 主函數(shù)

  MX_GPIO_Init();
  MX_FSMC_Init();
  MX_USART1_UART_Init();
  MX_SPI2_Init();
/* USER CODE BEGIN 2 */
char buff[200];
char buff_tx[]="HAL庫(kù)配置SPI硬件時(shí)序驅(qū)動(dòng)W25Q64S數(shù)據(jù)讀寫測(cè)試 -- Ver1.0";
char buf_rx[100];
NT35310_Init();//LCD初始化
LCD_Display_Str(LCD_WIDTH/2-strlen("W25Q64初始化")/2*8,20,16,(u8 *)"W25Q64初始化",BLACK);
LCD_Display_Str(20,40,16,(u8 *)"W25Q64 OK",RED);
uint16_t id=W25Q64_GetDeviceID();
snprintf(buff,sizeof(buff),"ID信息:%#x",id);
LCD_Display_Str(20,60,16,(u8 *)buff,RED);
LCD_Display_Str(LCD_WIDTH/2-strlen("W25Q64讀寫測(cè)試")/2*8,90,16,(u8 *)"W25Q64讀寫測(cè)試",BLACK);
W25Q64_WriteData(100,buf_tx,sizeof(buf_tx));
W25Q64_ReadData(100,buf_rx,sizeof(buf_tx));
LCD_Display_Str(20,120,16,(u8 *)"W25Q64寫數(shù)據(jù):OK",RED);
LCD_Display_Str(20,140,16,(u8 *)"W25Q64讀數(shù)據(jù):OK",RED);
LCD_Display_Str(20,160,16,(u8 *)"數(shù)據(jù)內(nèi)容:",RED);
LCD_Display_Str(20,180,16,(u8 *)buf_rx,BLUE);
while(1)
{
}
pYYBAGKTfoGAM8FRAAf258bgxKI662.png
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2272

    文章

    10923

    瀏覽量

    357534
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1721

    瀏覽量

    92108
  • HAL
    HAL
    +關(guān)注

    關(guān)注

    2

    文章

    71

    瀏覽量

    12673
  • w25Q64
    +關(guān)注

    關(guān)注

    1

    文章

    15

    瀏覽量

    3038
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32CubeMx入門教程(6):SPI讀寫FLAH的應(yīng)用

    導(dǎo)語(yǔ)“本教程將使用CubeMX初始化SPI,使用SPI對(duì)W25Q64 FLASH進(jìn)行讀寫操作,通過HAL庫(kù)的讀寫應(yīng)用來數(shù)據(jù)FLASH的操作細(xì)節(jié)。”
    發(fā)表于 07-12 11:32 ?3143次閱讀
    <b class='flag-5'>STM32CubeMx</b>入門教程(6):<b class='flag-5'>SPI</b>讀寫FLAH的應(yīng)用

    如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外設(shè)與 SPI Flash通信呢

    本篇詳細(xì)的記錄了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外設(shè)與 SPI Flash 通信(W25Q64)。
    發(fā)表于 01-26 08:07

    介紹W25Q64驅(qū)動(dòng)函數(shù)

    可說的。關(guān)于FATFS的移植下一篇文章介紹。本篇文章主要介紹W25Q64驅(qū)動(dòng)函數(shù)。W25Q64容量是64Mbit的flash,64Mbit
    發(fā)表于 01-26 07:53

    w25Q64中文手冊(cè)

    w25Q64中文手冊(cè)
    發(fā)表于 10-16 15:25 ?714次下載
    <b class='flag-5'>w25Q64</b>中文手冊(cè)

    w25Q64的中文手冊(cè)

    w25Q64的中文手冊(cè)
    發(fā)表于 10-19 08:59 ?338次下載
    <b class='flag-5'>w25Q64</b>的中文手冊(cè)

    STM32Cube-18】使用硬件QSPI讀寫SPI Flash(W25Q64

    本篇詳細(xì)的記錄了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外設(shè)與 SPI Flash 通信(W25Q64)。
    發(fā)表于 12-01 21:06 ?14次下載
    【<b class='flag-5'>STM32</b>Cube-18】使用<b class='flag-5'>硬件</b>QSPI讀寫<b class='flag-5'>SPI</b> Flash(<b class='flag-5'>W25Q64</b>)

    STM32入門開發(fā): 介紹SPI總線、讀寫W25Q64(FLASH)(硬件+模擬時(shí)序)

    時(shí)序,本文示例代碼里同時(shí)采用模擬時(shí)序和硬件時(shí)序兩種方式讀寫W25Q64。模擬時(shí)序更加方便移植到其他單片機(jī),更加方便學(xué)習(xí)理解SPI時(shí)序,通用性更高,不分MCU;硬件時(shí)序效率更高,每個(gè)MC
    發(fā)表于 12-02 09:06 ?41次下載
    <b class='flag-5'>STM32</b>入門開發(fā): 介紹<b class='flag-5'>SPI</b>總線、讀寫<b class='flag-5'>W25Q64</b>(FLASH)(<b class='flag-5'>硬件</b>+模擬時(shí)序)

    STM32單片機(jī)基礎(chǔ)18——使用硬件QSPI讀寫SPI Flash(W25Q64

    本篇詳細(xì)的記錄了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外設(shè)與 SPI Flash 通信(W25Q64)。
    發(fā)表于 12-02 10:21 ?20次下載
    <b class='flag-5'>STM32</b>單片機(jī)基礎(chǔ)18——使用<b class='flag-5'>硬件</b>QSPI讀寫<b class='flag-5'>SPI</b> Flash(<b class='flag-5'>W25Q64</b>)

    STM32L4+HAL+QSPI+DMA讀寫W25Q64/128

    STM32CubeMX,實(shí)現(xiàn)QSPI通過DMA四線讀寫W25Q64或128JV。參考資料:STM32L4X2用戶手冊(cè)RM0394W25Q64JV數(shù)據(jù)手冊(cè)安富萊V7開發(fā)板用戶手冊(cè)ST官
    發(fā)表于 12-04 18:36 ?18次下載
    <b class='flag-5'>STM32</b>L4+HAL+QSPI+DMA讀寫<b class='flag-5'>W25Q64</b>/128

    Linux驅(qū)動(dòng)開發(fā)-編寫W25Q64(Flash)驅(qū)動(dòng)

    本篇文章就介紹如何在Linux系統(tǒng)下編寫W25Q64芯片的驅(qū)動(dòng),完成數(shù)據(jù)存儲(chǔ),W25Q64支持標(biāo)準(zhǔn)SPI總線,當(dāng)前驅(qū)動(dòng)程序底層的代碼寫了兩種
    的頭像 發(fā)表于 09-17 15:09 ?3532次閱讀
    Linux<b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)-編寫<b class='flag-5'>W25Q64</b>(Flash)<b class='flag-5'>驅(qū)動(dòng)</b>

    STM32驅(qū)動(dòng)W25Q64讀寫數(shù)據(jù)資料

    STM32驅(qū)動(dòng)W25Q64讀寫數(shù)據(jù)資料
    發(fā)表于 04-12 14:28 ?30次下載

    STM32 SPI讀寫W25Q64(二)

    W25Q64 將 8M 的容量分為 128 個(gè)塊(Block),每個(gè)塊大小為 64K 字節(jié),每個(gè)塊又分為 16個(gè)扇區(qū)(Sector),每個(gè)扇區(qū) 4K 個(gè)字節(jié)。
    發(fā)表于 07-22 11:09 ?7256次閱讀
    <b class='flag-5'>STM32</b> <b class='flag-5'>SPI</b>讀寫<b class='flag-5'>W25Q64</b>(二)

    STM32 SPI讀寫W25Q64(三)

    GPIO口模擬SPI讀寫W25Q64的基本內(nèi)容已經(jīng)跟大家介紹完了,今天跟大家介紹下如何通過串口接收文件并保存到W25Q64中。
    發(fā)表于 07-22 11:11 ?1829次閱讀
    <b class='flag-5'>STM32</b> <b class='flag-5'>SPI</b>讀寫<b class='flag-5'>W25Q64</b>(三)

    Arduino下W25Q64驅(qū)動(dòng)程序源碼

    本上傳資料中包含W25Q64驅(qū)動(dòng)源碼,以及在Arduino下配合SPI設(shè)備的測(cè)試工程。測(cè)試工程使用的是合宙Air001開發(fā)板。你可以改變?yōu)槠渌?b class='flag-5'>SPI設(shè)備的Arduino開發(fā)板,經(jīng)
    發(fā)表于 08-28 16:05 ?5次下載

    STM32驅(qū)動(dòng)FLASH(W25Q64)

    W25Q64 將 **8M** 的容量分為 **128 個(gè)塊(Block)** ,每個(gè)塊大小為 **64K 字節(jié)** ,每個(gè)塊又分為 **16個(gè)扇區(qū)(Sector)** ,每個(gè)扇區(qū) **4K 個(gè)字節(jié)** 。
    的頭像 發(fā)表于 10-24 09:50 ?1529次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>驅(qū)動(dòng)</b>FLASH(<b class='flag-5'>W25Q64</b>)
    缅甸百家乐官网娱乐| bet365里面的21点玩不得| 大佬百家乐官网现金网| 百家乐智能系统| 百家乐官网注册彩金| 大发888下载| 百家乐专家赢钱打法| 百家乐官网看炉子的方法| 大发888娱乐城怎么样| 游戏百家乐官网押金| 大发888提款速度快吗| 雅加达百家乐官网的玩法技巧和规则 | 威尼斯人娱乐城线路lm0| 百家乐官网八卦九| 金龙国际娱乐城| 在线玩百家乐的玩法技巧和规则 | 百家乐官网最好的投注方法| 大发888城官方下载| 百家乐游戏技巧| 合乐8百家乐官网娱乐城| 优博代理| 网上百家乐公司| 百家乐官网手论坛48491| 棋牌赚钱| 百家乐解析| 百家乐官网平注法到| 百家乐官网视频游戏世界| 白山在线棋牌游戏| 网上百家乐真实度| 菲律宾百家乐官网游戏| 大发888奖金| 安阳百家乐赌博| 奥斯卡百家乐官网的玩法技巧和规则 | 什么百家乐官网九宫三路| 明光市| 大发888官方6222.com| 百家乐双龙出海注码法| 百家乐官网反缆公式| 澳门百家乐官网死局| 上海博彩生物科技有限公司| 怎样打百家乐的玩法技巧和规则|