optical/NxFuncs/norflash/norflash.h
2025-09-04 09:45:08 +08:00

188 lines
5.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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