我造輪子,你造車,創客一塊兒造起來!塔克創新資訊【塔克社區 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讀寫數據測試,掉電喚醒測試。
硬件資源:
硬件鏈接:
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(); } } |
上電覆位後,運行效果以下圖所示。