188 lines
5.2 KiB
C
188 lines
5.2 KiB
C
|
||
#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
|