#ifndef __NORFLASH_H__ #define __NORFLASH_H__ #include "config.h" //------------------------------------------------------------------------------- // 串行 Norflash 的访问接口 // SPI接口 //---------------------------------------------- // 支持 W25Q80, W25Q16, W25Q32, W25Q64, W25Q128, W25Q256 #define W25Q80 8 // 8M Bit 1MB = 1024K = 1024 * 1024 B #define W25Q16 16 // 16M Bit 2MB = 2048K = 2 * 1024 * 1024 B #define W25Q32 32 #define W25Q64 64 #define W25Q128 128 // 128M Bit 16MB #define W25Q256 256 // 256M Bit 32MB // 芯片选择 #ifndef SERNORFLASHTYPE #define SERNORFLASHTYPE W25Q16 #endif //---------------------------------------------- #define RWSPI 1 #define RWQPI 2 #ifndef RWMODE #define RWMODE RWSPI #endif //---------------------------------------------- #define RWADDR3 1 #define RWADDR4 2 #ifndef RWADDRMODE #define RWADDRMODE RWADDR3 #endif //------------------------------------------------------------------------------- // 串行 Norflash 大小(字节数) #define SNF_TOTAL_BYTES (SERNORFLASHTYPE*1024*(1024/8)) // 字节数 #define SNF_BYTES_PER_PAGE 0x100 // 每页字节个数(256),页是编程写入的最小单位(页编程指令)1/4 K #define SNF_PAGES_PER_SEC 0x10 // 每扇区的页数(16),扇区是擦除的最小单位(扇区擦除指令) #define SNF_BYTES_PER_SEC (SNF_BYTES_PER_PAGE*SNF_PAGES_PER_SEC) // 每扇区字节个数(4096) 4K //------------------------------------------------------------------------------- // Norflash 使用划分,不同容量的划分不同。 // 最大容量 FLASH 区域划分, 小容量的优先保证高位地址的区域 // |-----------------|-----------------|-------------| // W25Q256 W25Q16 W25Q80 // | name | begin addr | size | // |-----------------|-----------------|-------------| // | file area | 0x00 | 0x01000000 | // 16MB // |-----------------|-----------------|-------------| // | rev area | 0x01000000 | 0x00E00000 | // 14MB // |-----------------|-----------------|-------------| // | run hour area | 0x01E00000 | 0x00100000 | // 1MB 1MB // |-----------------|-----------------|-------------| // | para area | 0x01F00000 | 0x00010000 | // 512KB 64KB 64KB // |-----------------|-----------------|-------------| // | rev area 2 | 0x01F10000 | 0x00070000 | // 512KB 448KB 448KB // |-----------------|-----------------|-------------| // | update area | 0x01F80000 | 0x00080000 | // 512KB 512KB 512KB // |-----------------|-----------------|-------------| #if (SERNORFLASHTYPE == W25Q256) #define SNF_DAT_FILE_BEGIN 0x00000000 #define SNF_DAT_FILE_SIZE 0x01000000 // 文件数据区,16M字节,作为存储数据文件的扩展。 #define SNF_RUNHOUR_BEGIN 0x01E00000 #define SNF_RUNHOUR_SIZE 0x00100000 // 运行时间计数区域, 1M字节 #define SNF_PARAS_BEGIN 0x01F00000 #define SNF_PARAS_SIZE 0x00010000 // 参数数据存储区域, 64KB字节 #define SNF_UPDATE_BEGIN 0x01F80000 #define SNF_UPDATE_SIZE 0x00080000 // 升级数据存储区域, 512KB字节 #elif (SERNORFLASHTYPE == W25Q16) #define SNF_PARAS_BEGIN 0x00100000 #define SNF_PARAS_SIZE 0x00010000 // 参数数据存储区域, 64KB字节 #define SNF_UPDATE_BEGIN 0x00180000 #define SNF_UPDATE_SIZE 0x00080000 // 升级数据存储区域, 512KB字节 #elif (SERNORFLASHTYPE == W25Q80) #define SNF_PARAS_BEGIN 0x00000000 #define SNF_PARAS_SIZE 0x00010000 // 参数数据存储区域, 64KB字节 #define SNF_UPDATE_BEGIN 0x00080000 #define SNF_UPDATE_SIZE 0x00080000 // 升级数据存储区域, 512KB字节 #endif //-------------------------------- //-------------------------------- //-------------------------------- //-------------------------------- //------------------------------------------------------------------------------- // 初始化,并注册读写函数 int SNFlashInit(void (*spicson)(void), void (*spicsoff)(void), u8 (*spird)(void), void (*spiwr)(u8 wb)); // 写使能开 void SNFWirteEnable(void); // 写使能关 void SNFWirteDisable(void); // 判断Nor是否处于空闲状态 int SNFIsdStatusBusy(void); // 读数据 int SNFlashRdData(u32 addr, u8 * pBuf, int len); // 快速读取(可达到104M) int SNFFastReadData(u32 addr, u8 * pBuf, int len); // 页内写数据[最多可以写256个字节数据] int SNFPageProgram(u32 addr, u8 * pBuf, int len); // 扇区擦除(4KB) int SNFlash4kErase(u32 addr, int wait); // 扇区擦除(32KB) int SNFlash32kErase(u32 addr, int wait); // 扇区擦除(64KB) int SNFlash64kErase(u32 addr, int wait); // 整片擦除 int SNFlashChipErase(u32 addr, int wait); // 读取 制造商 id 和 设备 ID u32 SNFGetManufacDeviceID(void); // 读取 JEDEC ID u32 SNFGetJedecID(void); // 读取 Unique ID 8字节的唯一序列号 u64 SNFGetUniqueID(void); // 连续写数据 int SNFlashWrData(u32 addr, u8 *data, int len); // 写数据(自动擦除) int SNFlashWrDataWithErase(u32 addr, u8 *data, int len); // 判断数据区是否为空 int IsSNFlashEmpty(u32 addr, int len); //------------------------------------------------------------------------------- #define DatFlashInit SNFlashInit //#define DatFlashRdData SNFlashRdData #define DatFlashRdData(saddr, taddr, blen) SNFlashRdData(saddr, (u8*)(taddr), blen) #define DatFlashWrData SNFlashWrData #define DatFlashWrDataWithErase SNFlashWrDataWithErase #define IsDatFlashEmpty IsSNFlashEmpty #define DatFlash4kErase SNFlash4kErase //------------------------------------------------------------------------------- #endif