91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

如何利用AS32系列MCU芯片使用簡潔單線模式操作QSPI FLASH?

安芯 ? 來源:jf_29981791 ? 作者:jf_29981791 ? 2025-12-14 23:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

QSPI(Quad Serial Peripheral Interface) 是一種高速串行通信接口,在標準SPI(Serial Peripheral Interface)的基礎上擴展至4條數(shù)據(jù)線(Quad Mode),顯著提升數(shù)據(jù)傳輸速率。它廣泛應用于Flash存儲器、傳感器微控制器之間的通信。AS32系列MCU芯片開發(fā)板集成了一塊S25FL512SAGMFVG13型號的QSPI FLASH,本文我們將介紹該系列芯片使用簡潔單線模式操作QSPI FLASH。

代碼詳解:

1、扇區(qū)擦除函數(shù)

根據(jù)指導手冊我們知道,在進行扇區(qū)擦除命令之前必須先給一個WREN 命令,該命令會將狀態(tài)寄存器中的寫使能鎖存器(WEL)置位,以允許任何寫入操作。此外,本文用例使用3字節(jié)地址,根據(jù)時序圖可知,應先發(fā)送指令(長度可配置)接著發(fā)送一個24位地址。

我們開始講解扇區(qū)擦除函數(shù),代碼如下:

#define WRITE_ENABLE_INST 0x06

#define WRITE_DISBALE_INST 0x04

#define ERASE_SECTOR_INST 0xD8

#define READ_RIGISTER1_INST 0x05

#define PAGE_PROGRAME_INST 0x02

#define READ_FLASH_INST 0x03

void QSPI_FlashErase(uint32_t block_start, uint32_t sector_num)

{

uint32_t dst;

uint32_t SR_Status;

uint8_t erase_status = 1;

dst = block_start;

uint32_t num = sector_num-1;

if (dst + num * 0x3FFFF> 0xFFFFFF)

{

Printf("error :Exceeds the erase range.rn");

}

QSPI_Reset();

QSPI_Deinit();

QSPI_StructInitenable();

QSPI_WriteEnable();

while ( (QSPI_GetFlagStatus(QSPI_FLAG_BUSY) == 1));

for (uint32_t i = 0; i < num; i++)

{

QSPI_SectorErase();

while ( (QSPI_GetFlagStatus(QSPI_FLAG_BUSY) == 1));

QSPI_SetAddr(dst + num*0x3FFFF);

while ( (QSPI_GetFlagStatus(QSPI_FLAG_BUSY) == 1));

}

while (erase_status)

{

QSPI_SetDataLength(0);

QSPI_ReadStatus_Rigister1();

delay_ms(10);

erase_status = QSPI_ReadData();

}

QSPI_ReadFlash(dst, PROGRAME_SIZE, QSPI_BUFFER );

}

首先看第16行,對QSPI結(jié)構體初始化,分別配置片選高電平時間,QSPI時鐘信號在指令之間的電平,QSPI時鐘分頻。

接著第17行,發(fā)送寫使能命令。該函數(shù)主要配置QSPI->CCR寄存器,主要配置指令寫使能指令和簡介寫模式,其余配置讀者可查閱AS32X601設計手冊的QSPI章節(jié),這里不做過多贅述。

第22行,進行扇區(qū)擦除,和寫使能函數(shù)一致,區(qū)別在于配置不同的指令,第24行設置需要擦除區(qū)域的首地址。

第30行,配置QSPI數(shù)據(jù)長度寄存器(DLR)為0,我們需要讀取1字節(jié),即SR1寄存器8位。第31行,我們發(fā)送讀取QSPI FLASH的SR1寄存器指令。第33行,讀取QSPI FLASH返回的8位數(shù)據(jù),直到erase_status = 0時,我們擦除操作完成。這里是間接讀取模式,還可使用輪詢模式,減少CPU等待時間,完全交給QSPI FLASH來處理數(shù)據(jù)。

以下是讀取SR1寄存器的相關配置,和擦除函數(shù)一致,區(qū)別在于指令,當然讀者可以自行配置QSPI 為2線或4線。

2、讀QSPI FLASH

接上節(jié),我們在最后調(diào)用了QSPI_ReadFlash函數(shù),本章節(jié)詳細講解該函數(shù),先看FLASH手冊,

該指令允許從存儲器陣列的任意字節(jié)地址開始讀取。每輸出一個字節(jié)數(shù)據(jù)后,地址會自動遞增至下一個更高地址(按順序連續(xù)遞增)。因此,只需提供起始地址000000h并發(fā)送一次讀指令,即可連續(xù)讀取整個存儲器的內(nèi)容。當?shù)竭_最高地址后,地址計數(shù)器將自動回繞至000000h,從而支持無限循環(huán)的連續(xù)讀取操作。

函數(shù)如下:

void QSPI_ReadFlash(uint32_t block_start, uint32_t byte_num, uint32_t buffer[])

{

uint32_t FIFO_LEVEL = 0;

QSPI_WriteEnable();

QSPI_SetDataLength(byte_num);

QSPI_Read_Flash();

QSPI_SetAddr(block_start);

delay_ms(10);

FIFO_LEVEL = QSPI_GetFIFOLevel();

while (FIFO_LEVEL != 0)

{

for (uint32_t i=0;i

{

buffer[i] = QSPI_ReadData();

Printf("%xt",buffer[i]);

}

FIFO_LEVEL = QSPI_GetFIFOLevel();

}

QSPI_WriteDisable();

}

同樣在讀數(shù)據(jù)之前需要解鎖QSPI FLASH,并在操作完成后上鎖。第5行,設置讀取需要讀取的字節(jié)數(shù),第6行,調(diào)用QSPI_READ_FLASH(),函數(shù)如下,第9行,獲取FIFO中有效字節(jié)數(shù),當FIFO非空時,讀QSPI->DR寄存器獲取數(shù)據(jù),直到FIFO為空。

3、下板驗證

程序初始化后,調(diào)用QSPI_FlashErase(0x00, 1),從0地址開始,擦除1個扇區(qū),觀察打印信息,并截取了邏輯分析儀片段。

4、頁編程函數(shù)

主要內(nèi)容:若地址的最低9位(A8-A0)不全為0,則超出當前頁末尾的傳輸數(shù)據(jù)將從同一頁的起始地址(即最低9位全為0的地址)開始編程,即地址會在頁對齊的邊界內(nèi)回繞。這是因為用戶只需輸入單個頁地址即可覆蓋整個頁邊界。

如果發(fā)送給設備的數(shù)據(jù)不足一頁,這些數(shù)據(jù)字節(jié)將從所提供地址開始按順序編程,而不會影響同一頁內(nèi)的其他字節(jié)。

為優(yōu)化時序,使用頁編程(PP)命令在頁邊界內(nèi)加載整個頁大小的編程緩沖器,相比于加載不足一頁的數(shù)據(jù)到編程緩沖器,將節(jié)省總體編程時間。

int QSPI_FlashWrite(uint32_t block_start,uint32_t offset_into_block, uint32_t count, uint32_t buffer[])

{

uint32_t dst;

uint32_t ii;

uint32_t num;

dst = block_start + offset_into_block;

num = count;

if (dst%4 != 0)

{

Printf( "the addr must 4-byte alignmentrn");

return 0;

}

QSPI_Deinit();

if ((dst%256) == 0)

{ int loop = 0;

Printf( "the first packge is 256 bytesrn");

while (num > 256)

{

QSPI_StructInitenable();

QSPI_SetDataLength(0xff);

QSPI_WriteEnable();

QSPI_PageProgram();

QSPI_SetAddr(dst);

for (ii = loop256/4; ii < loop256/4+64; ii++)

{

QSPI->DR = buffer[ii];

}

while ( (QSPI_GetFlagStatus(QSPI_FLAG_BUSY) == 1));

dst += 256;

num -= 256;

delay_ms(20);

loop++;

}

QSPI_StructInitenable();

QSPI_SetDataLength(block_start + offset_into_block + count - dst -1);

QSPI_WriteEnable();

QSPI_PageProgram();

QSPI_SetAddr(dst);

for (ii = 256loop/4; ii < (256loop+block_start + offset_into_block + count - dst)/4; ii++)

{

QSPI->DR = buffer[ii];

}

while ( (QSPI_GetFlagStatus(QSPI_FLAG_BUSY) == 1));

dst += block_start + offset_into_block + count – dst;

}

else

{

QSPI_StructInitenable();

QSPI_WriteEnable();

QSPI_PageProgram();

QSPI_SetAddr(dst);

QSPI_SetDataLength(256-(dst%256));

for (ii = 0; ii < (256-(dst%256))/4; ii++)

{

QSPI->DR = buffer[ii];

}

while ( (QSPI_GetFlagStatus(QSPI_FLAG_BUSY) == 1));

dst += 256-(dst%256);

while (num > 256)

{

QSPI_StructInitenable();

QSPI_WriteEnable();

QSPI_PageProgram();

QSPI_SetAddr(dst);

QSPI_SetDataLength(256-1);

for (ii = 0; ii < 64; ii++)

{

QSPI->DR = buffer[ii];

}

while ( (QSPI_GetFlagStatus(QSPI_FLAG_BUSY) == 1));

dst += 256;

num -= 256;

}

QSPI_StructInitenable();

QSPI_WriteEnable();

QSPI_PageProgram();

QSPI_SetAddr(dst);

QSPI_SetDataLength(block_start + offset_into_block + count - dst -1);

for (ii = 0; ii < (block_start + offset_into_block + count - dst)/4; ii++)

{

QSPI->DR = buffer[ii];

}

while ( (QSPI_GetFlagStatus(QSPI_FLAG_BUSY) == 1));

dst += block_start + offset_into_block + count - dst;

}

QSPI_WriteDisable();

while ( (QSPI_GetFlagStatus(QSPI_FLAG_BUSY) == 1));

QSPI_ReadFlash(block_start,PROGRAME_SIZE,QSPI_BUFFER);

return 0; //RESULT_OK

}

第1至13行定義了函數(shù)參數(shù)并計算目標地址,同時檢查地址是否4字節(jié)對齊,若未對齊則報錯返回。第14行對QSPI控制器進行復位。第15至48行處理目標地址256字節(jié)對齊的情況:第16至35行循環(huán)寫入完整的256字節(jié)數(shù)據(jù)頁,每次寫入前初始化硬件、設置數(shù)據(jù)長度、使能寫入、發(fā)送頁編程命令并設置地址,隨后通過循環(huán)寫入64個32位數(shù)據(jù),等待操作完成后更新地址和剩余計數(shù);第36至47行處理剩余不足256字節(jié)的數(shù)據(jù)尾部,采用類似的流程但數(shù)據(jù)長度根據(jù)剩余量動態(tài)計算。第49至88行處理目標地址未256字節(jié)對齊的情況:第51至60行先寫入從起始地址到下一個256字節(jié)邊界的首部數(shù)據(jù)片段;第61至75行循環(huán)寫入后續(xù)完整的256字節(jié)頁;第76至87行處理最后的尾部數(shù)據(jù)。

5、下板驗證

準備寫入1024個數(shù),0-0x3FF,共4K,從0地址開始,觀察打印信息

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FlaSh
    +關注

    關注

    10

    文章

    1747

    瀏覽量

    155480
  • QSPI
    +關注

    關注

    0

    文章

    55

    瀏覽量

    13355
  • MCU芯片
    +關注

    關注

    3

    文章

    260

    瀏覽量

    12878
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    編譯可在QSPI Flash上運行的程序

    在前文中已經(jīng)實現(xiàn)了一個能夠在 MDK 平臺進行下載代碼到 QSPI Flash 中的下載算法,以及一個能跳轉(zhuǎn)執(zhí)行應用程序的 2nd Bootloader,但若想將代碼下載到 QSPI Flas
    的頭像 發(fā)表于 03-31 09:50 ?4862次閱讀
    編譯可在<b class='flag-5'>QSPI</b> <b class='flag-5'>Flash</b>上運行的程序

    在軟件SDK中選擇不同的下載模式時,是哪個部件更改了QSPI0中寄存器的值?

    請問如果我需要更換MCU_Flash,不使用兆易創(chuàng)新的Flash 我如何去配置QSPI的寄存器呢?我觀察到如果是XIP模式的話,需要使能QSPI
    發(fā)表于 01-10 08:10

    STM32H750 QSPI flash重映射模式下有方法能實現(xiàn)讀寫操作嗎?

    STM32H750 QSPI flash重映射模式下有方法能實現(xiàn)讀寫操作
    發(fā)表于 03-25 08:06

    STM32 QSPI怎么退出映射模式?

    FLASH 中,多 QSPI 進行ERASE 和 PROGRAMME, 這個時候我就需要退出映射模式,請問怎么退出映射模式
    發(fā)表于 03-29 08:15

    xilinx-A7 fpga 使用QSPI模式啟動,項目需要用MCU做FPGA程序升級,請問MCU怎么操作SPIFLASH?

    A7_fpga 使用QSPI模式啟動,項目需要用MCU做FPGA程序升級,用MCU同時升級FPGA存放在SPIflash中的程序,請問:1、MCU
    發(fā)表于 12-03 22:23

    如何對STM32 QSPI進行調(diào)試

    STM32之QSPI調(diào)試記錄先聲明一下,STM32的QSPI外設同樣支持單線模式(兼容普通spi),只是相比普通的spi少了一些特性(比如只支持模式
    發(fā)表于 08-12 07:23

    如何制作適用于MM32F5270系列MCUQSPI Flash下載算法呢?

    ?! ?b class='flag-5'>QSPI Flash 支持單線,雙線和四線操作,本文為方便編程,僅描述實現(xiàn)單線模式
    發(fā)表于 03-17 14:46

    什么是QSPI?如何使用QSPIQSPI Flash進行通信呢?

    。一般來說,在與 QSPI Flash 通信時,并不是全程都是四根數(shù)據(jù)信號線傳輸數(shù)據(jù),當同一時間只有一根數(shù)據(jù)線在傳輸數(shù)據(jù)的模式可稱為單線模式
    發(fā)表于 03-17 15:17

    先楫hpm6000的SPI外設使用四線模式操作讀寫華邦flash

    的spi_master_timing_init api接口進行SPI頻率調(diào)整。 (四)指令操作單線模式SPI操作) 1、華邦相關flash
    發(fā)表于 06-28 20:01

    AT32系列MCU flash具體操作說明

    AT32 MCU Flash Application Note為了讓用戶能夠更全面的了解Artery AT32 系列flash 相關操作
    發(fā)表于 10-23 06:51

    如何使用QSPI Flash控制器開發(fā)板上的 QSPI Flash進行寫讀操作

    學習內(nèi)容 本文首先介紹FlashQSPI Flash控制器的相關內(nèi)容,然后使用 QSPI Flash 控制器,開發(fā)板上的
    的頭像 發(fā)表于 06-10 17:08 ?1.6w次閱讀
    如何使用<b class='flag-5'>QSPI</b> <b class='flag-5'>Flash</b>控制器開發(fā)板上的 <b class='flag-5'>QSPI</b> <b class='flag-5'>Flash</b>進行寫讀<b class='flag-5'>操作</b>

    QSPI flash上運行毫米波芯片的測試代碼

    QSPI flash上運行毫米波芯片的測試代碼
    發(fā)表于 10-28 12:00 ?0次下載
    在<b class='flag-5'>QSPI</b> <b class='flag-5'>flash</b>上運行毫米波<b class='flag-5'>芯片</b>的測試代碼

    微控制器外置QSPI Flash選型的注意事項

    為了擴展微控制器可用的 Flash 空間,用戶可以使用 QSPI 接口連接 QSPI Flash;為了讓用戶能盡量像使用片內(nèi) Flash
    的頭像 發(fā)表于 04-07 09:23 ?3637次閱讀

    FreeRTOS 在 AS32系列RISC-V 架構MCU電機驅(qū)動中的應用實踐與優(yōu)化

    一、AS32系列 RISC-V MCU與 FreeRTOS 融合的電機驅(qū)動架構解析 1.1 硬件層: AS32系列 架構的優(yōu)勢 在電機驅(qū)動系
    的頭像 發(fā)表于 11-13 23:33 ?828次閱讀

    AS32系列MCU芯片中CRC計算模塊的應用介紹

    、執(zhí)行器動作異常甚至整個控制系統(tǒng)宕機。循環(huán)冗余校驗(CRC)作為一種高效的錯誤檢測技術,如同數(shù)據(jù)傳輸與存儲過程中的"安全校驗屏障",持續(xù)保障MCU與外部設備交互數(shù)據(jù)的準確性。本文將系統(tǒng)闡述國科安芯推出的AS32系列
    的頭像 發(fā)表于 11-21 15:20 ?1359次閱讀
    <b class='flag-5'>AS32</b><b class='flag-5'>系列</b><b class='flag-5'>MCU</b><b class='flag-5'>芯片</b>中CRC計算模塊的應用介紹