玩轉X-CTR100 l STM32F4 l W25Q64 SPI串行FLASH存儲

我造輪子,你造車,創客一塊兒造起來!塔克創新資訊【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/ 編程

    

本文介紹X-CTR100控制器 板載FLASH存儲芯片W25Q64的使用。 緩存

W25Q64,芯片容量爲64M bit,即8M Byte,可用於存儲參數、字庫、圖片等數據。 安全

原理

W25Q64是華邦公司推出的大容量SPI FLASH產品,其容量爲64Mb。該25Q系列的器件在靈活性和性能方面遠遠超過普通的串行閃存器件。W25Q64將8M字節的容量分爲128個塊,每一個塊大小爲64K字節,每一個塊又分爲16個扇區,每一個扇區4K個字節。W25Q64的最小擦除單位爲一個扇區,也就是每次必須擦除4K個字節。因此,這須要給W25Q64開闢一個至少4K的緩存區,這樣必需要求芯片有4K以上的SRAM纔能有很好的操做。W25Q64的擦寫週期多達10W次,可將數據保存達20年之久,支持2.7~3.6V的電壓,支持標準的SPI,還支持雙輸出/四輸出的SPI,最大SPI時鐘可達80Mhz。 函數

 支持標準、雙輸出和四輸出的SPI 性能

 高性能串行閃存 測試

 高達普通串行閃存性能的6倍 ui

 80Mhz的時鐘操做 spa

 支持160Mhz的雙輸出SPI 設計

 支持320Mhz的四輸出SPI blog

 40MB/S的數據連續傳輸速率

 高效的"連續讀取模式"

 低指令開銷

 僅需8個時鐘週期處理內存

 容許XIP操做

 性能優於X16並行閃存

 低功耗,溫度範圍寬

 單電源2.7V至3.6V

 4mA有源電流

 -40°C 至+85°C的正常運行溫度範圍

 靈活的4KB扇區構架

 扇區統一擦除(4KB)

 塊擦除(32KB和64KB)

 1到256個字節編程

 超過10萬次擦除/寫循環

 超過20年的數據保存

 高級的安全功能

 軟件和硬件寫保護

 自上至下,扇區或塊選擇

 鎖定和保護OTP

 每一個設備都有惟一的64位ID

 CS:片選信號輸入

 DO(IO1):數據輸出(數據輸入輸出1)

 WP(IO2):寫保護輸入(數據輸入輸出2)

 GND:地信號

 DI(IO0):數據輸入(數據輸入輸出0)

 CLK:串行時鐘輸入

 HOLD(IO3):Hold輸入(數據輸入輸出3)

 VCC:電源

例程

讀取W25Q64芯片ID,FLASH讀寫數據測試,掉電喚醒測試。

硬件說明

硬件資源:

  • 串口UART1
  • W25Q64

硬件鏈接:

X-CTR100設計有SPI FLASH存儲芯片和TF卡接口,共用SPI1資源,可經過片選信號進行分時工做。

軟件生態

X-SOFT軟件生態,X-API文件以下。

ax_w25q64.c——X-CTR100 板載W25Q64 FLASH存儲源文件

ax_w25q64.h——X-CTR100 板載W25Q64 FLASH存儲頭文件

操做函數以下:

void AX_W25Q64_Init(void); //W25Q64初始化

void AX_W25Q64_SectorErase(uint32_t sector); //W25Q64擦除一個扇區    

void AX_W25Q64_ChipErase(void); //W25Q64擦除整個芯片

void AX_W25Q64_Read(uint8_t *pbuf, uint32_t addr, uint16_t num); //W25Q64指定地址讀出指定長度的數據

void AX_W25Q64_Write(uint8_t *pbuf, uint32_t addr, uint16_t num); //W25Q64指定地址寫入指定長度的數據

void AX_W25Q64_PageWrite(uint8_t *pbuf, uint32_t addr, uint16_t num); //W25Q64頁寫操做

uint32_t AX_W25Q64_ReadID(void); //W25Q64讀取芯片ID

void AX_W25Q64_WakeUp(void); //W25Q64喚醒操做

void AX_W25Q64_PowerDown(void); //W25Q64掉電操做

軟件說明

本例程FLASH初始化成功後,首先進行讀取ID操做,而後進行數據讀寫測試,並顯示讀寫數據進行對比。最後進行掉電喚醒測試,掉電500ms後喚醒芯片。在FLASH不操做狀態下,掉電處理可下降系統功耗。主程序代碼以下。

int main(void)

{

    uint8_t str[] = { "X-CTR100 FLASH TEST" };

    uint8_t str1[sizeof(str)];

    uint32_t id = 0;

    uint32_t address = 2 * 4096;

 

    /* X-CTR100初始化 */

    AX_Init(115200);

    printf("***X-CTR100 FLASH W25Q64讀寫例程***\r\n\r\n");

 

    //模塊初始化及配置

    AX_W25Q64_Init();

 

    //XAPI測試:讀取W25Q64 FLASH ID測試

    printf("*W25Q64 讀取FLASH ID測試\r\n");

    id = AX_W25Q64_ReadID();

    printf("*W25Q64 FLASH ID:0x%X\r\n\r\n", id);

 

 

    //X-API測試:讀寫W25Q64測試    

    printf("*W25Q64讀寫測試\r\n");

    //擦除將要寫入的FLASH扇區

    AX_W25Q64_SectorErase(address);

    //寫數據

    AX_W25Q64_Write(str, address, sizeof(str));

    printf("*地址 0x%X 寫入數據:%s\r\n", address, str);

    //讀數據

    AX_W25Q64_Read(str1, address, sizeof(str));

    printf("*地址 0x%X 讀出數據:%s\r\n", address, str1);

 

    //X-API測試:掉電喚醒測試

    AX_W25Q64_PowerDown();

    AX_Delayms(500);

    AX_W25Q64_WakeUp();

 

    while (1)

    {

        AX_Delayms(500);

        AX_LEDG_Toggle();

    }

}

實現效果

上電覆位後,運行效果以下圖所示。

    

相關文章
相關標籤/搜索