我造輪子,你造車,創客一起造起來!塔克創新資訊【塔克社區 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倍
80Mhz的時鍾操作
支持160Mhz的雙輸出SPI
支持320Mhz的四輸出SPI
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(); } } |
實現效果
上電復位后,運行效果如下圖所示。