色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

物聯網行業中Nor Flash的軟件設計分享_W25Q128的軟件設計方案

jf_94171069 ? 來源:jf_94171069 ? 作者:jf_94171069 ? 2024-09-26 11:20 ? 次閱讀

一 概述

W25Q128是一種NOR Flash芯片,掉電后數據不丟失的特點。

W25Q128FV陣列被組織成65,536個可編程頁面,每個頁面256字節。每次最多可編程256字節。可以以16頁為一組(即一個Sector)、128頁為一組(8個Sector)、256頁為一組(16個Sector)或整個芯片(芯片擦除)進行擦除。W25Q128FV分別有4,096個可擦除扇區和256個可擦除塊。較小的4KB扇區為需要數據和參數存儲的應用程序提供了更大的靈活性。

標準SPI通信支持時鐘頻率高達104MHz,Dual SPI通信支持時鐘頻率高達208MHz,QSPI通信支持時鐘頻率高達416MHz。

注意:W25Q128一共為128M bits(16M Byte),又分為256個塊(每個塊512K bit(64K Byte)),每個塊又分為16個扇區(每個扇區32K bit(4 KByte)),每個扇區又分為16頁(每個頁2K bit(256 Byte))

二 物理特性

可以將 1 寫成 0,但是不能將 0 寫成 1,要想將 0 寫成 1,必須進行擦除操作。如果要改變數據,就需要先擦除后寫數據。

如果想要修改小于扇區大小的數據,需要將整個扇區的數據,在內存中進行備份,然后修改內存中的數據,再將數據寫回到原扇區位置。因此,驅動要達到支持自動完成這個過程,用戶可以使用驅動修改任意位置的數據。

三 存儲結構

W25Q128可以存儲16777216字節,存儲一個字節占用一個地址,所以尋址范圍是0-(16777216-1),對應的16進制為0-0xFFFFFF(所以寄存器地址是24位的)

wKgaomb00wqACUqfAAG4uUcIoAw154.jpg

四 命令總覽

wKgZomb00w2Ac1-YAAHXaioKKxw748.jpg

五 組件的使用

1 Gitee鏈接地址

Demo位于amaziot_bloom_os_sdksample3rd2.1_W25Q128

Gitee源碼地址:https://gitee.com/ning./hongdou

Github源碼地址:https://github.com/ayumid/hongdou

編譯指令:.build.bat -l .amaziot_bloom_os_sdksample3rd2.1_W25Q128

2 組件功能介紹

實現軟件模擬SPI,驅動W25Q128芯片,實現數據存儲。

3 代碼講解

1 drv_w25q128_delay_us

功能:該函數用于,延時。

參數:

參數 釋義
count 死循環次數

返回值:無

示例:

//初始化i2c總線
ret = drv_xl9535_i2c_init();

2 drv_w25q128_gpio_set

功能:該函數用于,模擬SPI設置IO輸出電平。

參數:

參數 釋義
num 引腳號
val 0 低電平,1 高電平

返回值:0 成功,-1 失敗

示例:

drv_w25q128_gpio_set(DRV_w25q128_SPI_CS, DRV_w25q128_GPIO_LOW);

3 drv_w25q128_byte_wr

功能:該函數用于,SPI寫讀一個字節 mode3。

參數:

參數 釋義
byte 發送數據

返回值:flash返回數據

示例:

drv_w25q128_byte_wr(DRV_w25q128_DUMMY_BYTE);

4 drv_w25q128_byte_rd

功能:該函數用于,SPI只讀一個字節。

參數:無

返回值:flash返回數據

示例:

drv_w25q128_byte_rd(DRV_w25q128_DUMMY_BYTE);

5 drv_w25q128_busy_wait

功能:該函數用于,W25Q128 忙等待。

參數:無

返回值:無

示例:

while(drv_w25q128_read_reg1() & BIT_BUSY);

6 drv_w25q128_read_reg

功能:該函數用于,讀reg。

參數:無

返回值:無

示例:

while(drv_w25q128_read_reg() & BIT_BUSY);

7 drv_w25q128_read_jedecid

功能:該函數用于,讀 W25Q128 JEDEC_ID(制造商、類型、容量)。

參數:無

返回值:無

示例:

sample_w25q128_uart_printf("identification is 0x%X, Device id is 0x%X, Manufacturer Device ID is 0x%X", 
                               drv_w25q128_read_identification(), drv_w25q128_read_device_id(), drv_w25q128_read_manufacturer_id());

8 drv_w25q128_read_manufacturer_id

功能:該函數用于,讀 W25Q128 制造商 ID。

參數:無

返回值:無

示例:

sample_w25q128_uart_printf("identification is 0x%X, Device id is 0x%X, Manufacturer Device ID is 0x%X", 
                               drv_w25q128_read_identification(), drv_w25q128_read_device_id(), drv_w25q128_read_manufacturer_id());

9 drv_w25q128_read_device_id

功能:該函數用于,讀 W25Q128 設備 ID。

參數:無

返回值:無

示例:

sample_w25q128_uart_printf("identification is 0x%X, Device id is 0x%X, Manufacturer Device ID is 0x%X", 
                               drv_w25q128_read_identification(), drv_w25q128_read_device_id(), drv_w25q128_read_manufacturer_id());

10 drv_w25q128_write_enable

功能:該函數用于,寫使能。

參數:無

返回值:無

示例:

sample_w25q128_uart_printf("identification is 0x%X, Device id is 0x%X, Manufacturer Device ID is 0x%X", 
                               drv_w25q128_read_identification(), drv_w25q128_read_device_id(), drv_w25q128_read_manufacturer_id());

11 drv_w25q128_write_disable

功能:該函數用于,寫失能。

參數:無

返回值:無

示例:

12 drv_w25q128_write_page

功能:該函數用于,頁編程(調用本函數寫入數據前需要先擦除扇區)。

參數:

參數 釋義
pbuf 數據
addr 地址
len 長度

返回值:無

示例:

drv_w25q128_write_page(pbuf, addr, pageremain);

13 drv_w25q128_read

功能:該函數用于,讀閃存數據。

參數:

參數 釋義
pbuf 數據
addr 地址
len 長度

返回值:無

示例:

drv_w25q128_read((UINT8*)rx_buff1, 8181, strlen(tx_buff1));

14 drv_w25q128_sector_erase

功能:該函數用于,扇區擦除。

參數:

參數 釋義
addr 地址

返回值:無

示例:

drv_w25q128_sector_erase(secpos * DRV_w25q128_SOCTOR_SIZE);

15 drv_w25q128_chip_rease

功能:該函數用于,FLASH整片擦除(為了安全起見,若要調用,請先調用 drv_w25q128_write_enable 函數)。

參數:無

返回值:無

示例:

16 drv_w25q128_powr_down

功能:該函數用于,掉電。

參數:無

返回值:無

示例:

17 drv_w25q128_release_powr_down

功能:該函數用于,讀閃存數據。

參數:

參數 釋義
pbuf 數據
addr 地址
len 長度

返回值:無

示例:

drv_w25q128_read((UINT8*)rx_buff1, 8181, strlen(tx_buff1));

18 drv_w25q128_write_nocheck

功能:該函數用于,寫數據。

參數:

參數 釋義
pbuf 數據
addr 地址
len 長度

返回值:無

示例:

drv_w25q128_write_nocheck(w25q128_buffer, secpos * DRV_w25q128_SOCTOR_SIZE, DRV_w25q128_SOCTOR_SIZE);

19 drv_w25q128_write

功能:該函數用于,寫閃存數據,可以使任意地址。

參數:

參數 釋義
pbuf 數據
addr 地址
len 長度

返回值:無

示例:

drv_w25q128_write((UINT8*)tx_buff1, 8181, strlen(tx_buff1));

20 drv_w25q128_init

功能:該函數用于,寫數據。

參數:無

返回值:無

示例:

drv_w25q128_init();

4 Demo實戰

4.1 創建一個Demo

復制20.1_file_xtu示例工程,到同一個文件夾下,修改文件名為3.1_SSD1315,如圖:

wKgaomb00w-AFrO4AABzXQF3wLE458.jpg

4.2 修改makefile

增加文件組件所在目錄頭文件路徑,和源文件路徑,如圖:

wKgZomb00xCAYBJCAABjS-wnlzE612.jpg

4.3 增加頭文件

使用代碼編輯器,將新建的工程文件加入代碼編輯器中,打開main.c,修改main.c,加入am.h等頭文件,如圖:

wKgaomb00xGAG41CAAAJBaHV2rA635.jpg

4.4 修改代碼

在Phase2Inits_exit 創建一個任務,如圖:

wKgZomb00xKAS4x6AABJVrwH_NQ593.jpg

4.1 概述

上電后,按下按鍵,串口會打印出按下了哪一個按鍵

4.2 測試

測試步驟:

參考編譯教程,和文檔開頭的編譯指令,進行編譯

按照編譯教程選擇對應的選項

燒錄

4.3 宏定義介紹

sample_w25q128_uart_printf

輸出日志到DEBUG 串口,日志比較少,可以輸出到這個串口,如果日志比較多,需要輸出到usb口,以免不必要的問題出現

sample_w25q128_catstudio_printf

輸出日志到USB 串口,使用catstudio查看,catstudio查看日志需要更新對應版本mdb.txt文件,軟件打開filtter過濾日志,只查看用戶輸出的日志

SAMPLE_W25Q128_STACK_SIZE

棧空間宏定義

4.4 全局變量介紹

sample_w25q128_task_ref

任務指針

4.5 函數介紹

Phase1Inits_enter

底層初始化,本例空

Phase1Inits_exit

底層初始化,本例空

Phase2Inits_enter

底層初始化,本例空

Phase2Inits_exit

創建主任務,初始化INT 引腳

代碼片段:

void Phase2Inits_exit(void)
{
    int ret;

    sample_w25q128_task_stack = malloc(SAMPLE_W25Q128_STACK_SIZE);

    ret = OSATaskCreate(&sample_w25q128_task_ref, sample_w25q128_task_stack, SAMPLE_W25Q128_STACK_SIZE, 88, "sample_w25q128_task", sample_w25q128_task, NULL);
    ASSERT(ret == OS_SUCCESS);
}

sample_w25q128_task

主任務,代碼發分為兩部分,一部分是發送不定長數據;另一部分是上電后等待其它模塊發送的數據,收到后打印到串口。

代碼片段:

static void sample_w25q128_task(void *ptr)
{
    int ret = 0;
    uint32_t identification = 0;
//    unsigned char writeBuf[30] = {0};
//    unsigned char readBuf[30] = {0};

//    ret = ql_spi_init(QL_SPI_PORT0, QL_SPI_MODE3, QL_SPI_CLK_812_5KHZ);
//    sample_w25q128_catstudio_printf("ql_spi_init ret %d", ret);

    drv_w25q128_init();

    identification = drv_w25q128_read_jedecid();
    sample_w25q128_uart_printf("identification is 0x%X, Device id is 0x%X, Manufacturer Device ID is 0x%X", 
                               drv_w25q128_read_jedecid(), drv_w25q128_read_device_id(), drv_w25q128_read_manufacturer_id());
    
//    while(1)
//    {
//        drv_w25q128_gpio_set(DRV_w25q128_SPI_CS, 0);
//        sample_w25q128_uart_printf("low");
//        OSATaskSleep(5*200);
//        drv_w25q128_gpio_set(DRV_w25q128_SPI_CS, 1);
//        sample_w25q128_uart_printf("high");
//        OSATaskSleep(5*200);
//    }
    if(identification != JEDECID)
    {
        /* 讀取錯誤處理 */
        sample_w25q128_uart_printf("SPI read-write Error, please check the connection between MCU and SPI Flashn");
    }
    else
    {
        //讀取成功處理
        char tx_buff1[64] = "abcdefghigklmnopqrstuvwxyz0123456789";
        char rx_buff1[64] = {0};
        char tx_buff2[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210";
        char rx_buff2[64] = {0};
        int i = 0;
        //測試跨sector寫,并且讀出數據,寫兩次,第二次保留第一次部分數據,證明數據擦除,寫入正常
        drv_w25q128_write((UINT8*)tx_buff1, 8181, strlen(tx_buff1));//從8181地址開始寫數據,需要寫第二和第三個扇區
        drv_w25q128_read((UINT8*)rx_buff1, 8181, strlen(tx_buff1));
        sample_w25q128_uart_printf("read flash:%s", rx_buff1);

        if(!strncmp(tx_buff1, rx_buff1, strlen(tx_buff1)))
        {
            sample_w25q128_uart_printf("SPI read-write succeed 1");
        }
        //驗證驅動擦除扇區時,可以保留之前有效內容
        drv_w25q128_write((UINT8*)tx_buff2, 8186, strlen(tx_buff2));//從8186地址開始寫數據,需要寫第二和第三個扇區,同時不能擦掉8181 - 8186的5字節數據
        drv_w25q128_read((UINT8*)rx_buff2, 8181, strlen(tx_buff2) + 5);
        sample_w25q128_uart_printf("read flash:%s", rx_buff2);

        if(!strncmp(rx_buff2, "abcdeABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210", strlen("abcdeABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210")))
        {
            sample_w25q128_uart_printf("SPI read-write succeed 2");
        }
    }
//    memset(writeBuf, 0x00, sizeof(writeBuf));
//    memset(readBuf, 0x00, sizeof(readBuf));

//    writeBuf[0] = 0x9F;
    while (1)
    {
//        ret = ql_spi_write_read(QL_SPI_PORT0, readBuf, writeBuf, 1);
//        sample_w25q128_catstudio_printf("ql_spi_write_read ret %d, readBuf %02X,%02X,%02Xn", ret, readBuf[0], readBuf[1], readBuf[2]);
//        ret = ql_spi_write(QL_SPI_PORT0, writeBuf, 1);
//        sample_w25q128_catstudio_printf("ql_spi_write_read ret %d, readBuf %02Xn", ret, writeBuf[0]);
//        ret = ql_spi_read(QL_SPI_PORT0, readBuf, 3);
//        sample_w25q128_catstudio_printf("ql_spi_write_read ret %d, readBuf %02X,%02X,%02Xn", ret, readBuf[0], readBuf[1], readBuf[2]);
        OSATaskSleep(5 * 200);
    }
}

4.6 固件

wKgaomb00xOAAcqTAABoORGfLTA102.jpg

點擊下載 Lora Demo固件

5 生態組件鏈接

SPI NOR FLASH

本文章源自奇跡物聯開源的物聯網應用知識庫Cellular IoT Wiki,更多技術干貨歡迎關注收藏Wiki:Cellular IoT Wiki 知識庫(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)

歡迎同學們走進AmazIOT知識庫的世界!

這里是為物聯網人構建的技術應用百科,以便幫助你更快更簡單的開發物聯網產品

Cellular IoT Wiki初心:

在我們長期投身于蜂窩物聯網 ODM/OEM 解決方案的實踐過程中,一直被物聯網技術碎片化與產業資源碎片化的問題所困擾。從產品定義、芯片選型,到軟硬件研發和測試,物聯網技術的碎片化以及產業資源的碎片化,始終對團隊的產品開發交付質量和效率形成制約。為了減少因物聯網碎片化而帶來的重復開發工作,我們著手對物聯網開發中高頻應用的技術知識進行沉淀管理,并基于 Bloom OS 搭建了不同平臺的 RTOS 應用生態。后來我們發現,很多物聯網產品開發團隊都面臨著相似的困擾,于是,我們決定向全體物聯網行業開發者開放奇跡物聯內部沉淀的應用技術知識庫 Wiki,期望能為更多物聯網產品開發者減輕一些重復造輪子的負擔。

Cellular IoT Wiki沉淀的技術內容方向如下:

wKgaombqoM2AYL2RAAQrZ8e-uz8392.jpg

奇跡物聯的業務服務范圍:基于自研的NB-IoT、Cat1、Cat4等物聯網模組,為客戶物聯網ODM/OEM解決方案服務。我們的研發技術中心在石家莊,PCBA生產基地分布在深圳、石家莊、北京三個工廠,滿足不同區域&不同量產規模&不同產品開發階段的生產制造任務。跟傳統PCBA工廠最大的區別是我們只服務物聯網行業客戶。

連接我們,和10000+物聯網開發者一起 降低技術和成本門檻

讓蜂窩物聯網應用更簡單~~

哈哈你終于滑到最重要的模塊了,

千萬不!要!劃!走!忍住沖動!~

歡迎加入飛書“開源技術交流”,隨時找到我們哦~

點擊鏈接如何加入奇跡物聯技術話題群(https://rckrv97mzx.feishu.cn/docx/Xskpd1cFQo7hu9x5EuicbsjTnTf)可以獲取加入技術話題群攻略

Hey 物聯網從業者,

你是否有了解過奇跡物聯的官方公眾號“eSIM物聯工場”呢?

這里是奇跡物聯的物聯網應用技術開源wiki主陣地,歡迎關注公眾號,不迷路~

及時獲得最新物聯網應用技術沉淀發布

注:本文部分內容來源于網絡,如有侵權,請及時聯系我們。

審核編輯 黃宇

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

    關注

    2909

    文章

    44740

    瀏覽量

    374506
  • NOR flash
    +關注

    關注

    2

    文章

    91

    瀏覽量

    23045
收藏 人收藏

    評論

    相關推薦

    想問問外接一個flash有什么用如外接w25q128 spi接口flash

    stm32 外接了一個 spi接口的flash w25q128 不知道在實際應用到底 有什么作用求指教 大家可以把自己的用途 寫上給大家看看謝謝了
    發表于 04-03 11:16

    外擴FLASH(W25Q128)如何存儲數組的數據!?

    ]用于放數據,現外擴了一個帶有SPI接口的FLASHW25Q128),如何將dat[4096]數據存入其內,并且可以讀出呢? 非常感謝
    發表于 12-23 19:45

    W25Q128數據置頂

    請問各位大神一個問題,現在W25Q128保存著一段數據,但是我想把這段數據中間的某一段刪除,同時把后面的數據全部向前移動,填滿之前刪除的數據功能類似于聊天記錄置頂,大家有什么簡單快捷的方法?
    發表于 04-09 12:37

    W25Q128芯片簡介

    1、W25Q128 是華邦公司推出的一款 SPI 接口的 NOR Flash 芯片,其存儲空間為 128Mbit,相當于 16M 字節。 W25Q1
    發表于 08-13 08:49

    求大佬分享stm32 cubemx u*** spi flash w25q128 u盤調試筆記

    求大佬分享stm32 cubemx u*** spi flash w25q128 u盤調試筆記
    發表于 02-14 07:57

    基于RT-Thread的W25Q128虛擬U盤和文件系統如何實現自由切換呢

    文件系統RT-Thread:W25Q128虛擬U盤并搭載文件系統RT-Thread:STM32F407虛擬U盤,無法識別拔出問題解決方案1、W25Q128分區使用fal組件給spi flash
    發表于 08-04 10:57

    基于基于Qt的集成電路測試軟件設計方案

    基于基于Qt的集成電路測試軟件設計方案
    發表于 06-19 12:02 ?30次下載

    引射氏跨聲速風洞流暢控制軟件設計方案

    引射氏跨聲速風洞流暢控制軟件設計方案
    發表于 06-29 14:10 ?4次下載

    水下航行器通用的數據處理軟件設計方案

    水下航行器通用的數據處理軟件設計方案
    發表于 06-30 15:29 ?5次下載

    W25Q128 閃存芯片SPI詳解

    。/WP為寫保護管腳,/HOLD or /RESET為保持或復位引腳(通過寄存器配置)。原理圖連接W25Q128(W25Q64)將16M(8M)的容量分為256(128)個塊(Block),每個...
    發表于 11-26 17:36 ?264次下載
    <b class='flag-5'>W25Q128</b> 閃存芯片SPI詳解

    FLASH芯片(W25Q128

    簡介W25Q128FV (128M-bit)串行閃存為有限的空間、引腳和電源系統提供了存儲解決方案25Q系列提供的靈活性和性能遠遠超過普通的串行F
    發表于 11-26 18:51 ?72次下載
    <b class='flag-5'>FLASH</b>芯片(<b class='flag-5'>W25Q128</b>)

    stm32 cubemx usb spi flash w25q128 u盤調試筆記

    基本代碼確定使用需求 USB SPIusb以下配置保持默認配置即可,切記不要胡亂修改參數。spi調試spi flash我使用的flashw25q128 spi 通信模式,所以直接找一個別人寫好的驅動就可以了。
    發表于 12-14 18:52 ?33次下載
    stm32 cubemx usb spi <b class='flag-5'>flash</b> <b class='flag-5'>w25q128</b> u盤調試筆記

    STM32CUBEMX(13)--SPI,W25Q128外部Flash移植

    省空間,提供方便,正是出于這種簡單易用的特性,越來越多的芯片集成了這種通信協議,比如 EEPROM,FLASH,實時時鐘,AD轉換器。 W25Q128 是一款SPI接口的Flash芯片,其存儲空間為
    的頭像 發表于 11-14 16:54 ?3570次閱讀
    STM32CUBEMX(13)--SPI,<b class='flag-5'>W25Q128</b>外部<b class='flag-5'>Flash</b>移植

    瑞薩e2studio----串口獲取數據通過SPI存儲于W25Q128外部flash

    本篇文章主要介紹如何使用e2studio對瑞薩進行spi配置,同時移植stm32上的W25Q128到瑞薩上,同時通過對該FLASH進行讀寫操作,驗證是否正確。
    的頭像 發表于 12-02 17:54 ?2976次閱讀
    瑞薩e2studio----串口獲取數據通過SPI存儲于<b class='flag-5'>W25Q128</b>外部<b class='flag-5'>flash</b>

    BQ79616-Q1軟件設計參考

    電子發燒友網站提供《BQ79616-Q1軟件設計參考.pdf》資料免費下載
    發表于 09-03 10:37 ?5次下載
    BQ79616-<b class='flag-5'>Q</b>1<b class='flag-5'>軟件設計</b>參考
    主站蜘蛛池模板: 国产AV亚洲国产AV麻豆| 欧美精品高潮呻吟AV久久| 无码专区aaaaaa免费视频| 国产不卡一卡2卡三卡4卡网站| 我强进了老师身体在线观看| 韩国无遮羞禁动漫在线观看96 | 大肥婆丰满大肥奶bbw肥| 外国xxxx| 久久精品视频91| 成人毛片免费观看视频大全| 亚洲精品久久久久中文字幕二区| 无遮挡h肉3d动漫在线观看| 国产欧美日韩亚洲第一页| 伊人久久大香线蕉观看| 欧美性最猛xxxx在线观看视频| 国产精品婷婷久青青原| 正在播放黑人杂交派对卧槽| 日韩在线av免费视久久| 久草草在线视视频| 大睾丸内射老师| 樱花草在线影视WWW日本动漫| 日韩 国产 欧美视频二区| 久久WWW免费人成一看片| 爆操日本美女| 一区二区三区无码被窝影院| 日韩一区二区三区视频在线观看| 极品少妇高潮啪啪AV无码吴梦梦| SM脚奴调教丨踩踏贱奴| 一本色道久久综合亚洲精品蜜桃冫| 青草影院天堂男人久久| 久久精品国产亚洲AV热无遮挡| 高H内射NP古文| 91成品视频| 亞洲人妻AV無碼在線視頻| 手机毛片在线观看| 免费看毛片的网址| 精品国产在天天线在线麻豆 | 99久久精品免费国产一区二区三区| 午夜无码国产理论在线| 日本不卡一二三| 久久青草影院|