166 lines
5.3 KiB
C
166 lines
5.3 KiB
C
#ifndef _NAND_H
|
||
#define _NAND_H
|
||
#include "stm32h7xx_hal.h"
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
|
||
//ALIENTEK STM32H7开发板
|
||
//NAND驱动代码
|
||
//正点原子@ALIENTEK
|
||
//技术论坛:www.openedv.com
|
||
//创建日期:2017/8/16
|
||
//版本:V1.0
|
||
//版权所有,盗版必究。
|
||
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
|
||
//All rights reserved
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
//升级说明
|
||
//V1.1 20160520
|
||
//1,新增硬件ECC支持(仅在以NAND_ECC_SECTOR_SIZE大小为单位进行读写时处理)
|
||
//2,新增NAND_Delay函数,用于等待tADL/tWHR
|
||
//3,新增NAND_WritePageConst函数,用于搜寻坏块.
|
||
//V1.2 20160525
|
||
//1,去掉NAND_SEC_SIZE宏定义,由NAND_ECC_SECTOR_SIZE替代
|
||
//2,去掉nand_dev结构体里面的secbuf指针,用不到
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
typedef int32_t s32;
|
||
typedef int16_t s16;
|
||
typedef int8_t s8;
|
||
|
||
typedef const int32_t sc32;
|
||
typedef const int16_t sc16;
|
||
typedef const int8_t sc8;
|
||
|
||
typedef __IO int32_t vs32;
|
||
typedef __IO int16_t vs16;
|
||
typedef __IO int8_t vs8;
|
||
|
||
typedef __I int32_t vsc32;
|
||
typedef __I int16_t vsc16;
|
||
typedef __I int8_t vsc8;
|
||
|
||
typedef uint32_t u32;
|
||
typedef uint16_t u16;
|
||
typedef uint8_t u8;
|
||
|
||
typedef const uint32_t uc32;
|
||
typedef const uint16_t uc16;
|
||
typedef const uint8_t uc8;
|
||
|
||
typedef __IO uint32_t vu32;
|
||
typedef __IO uint16_t vu16;
|
||
typedef __IO uint8_t vu8;
|
||
|
||
typedef __I uint32_t vuc32;
|
||
typedef __I uint16_t vuc16;
|
||
typedef __I uint8_t vuc8;
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
#define NAND_MAX_PAGE_SIZE 4096 //定义NAND FLASH的最大的PAGE大小(不包括SPARE区),默认4096字节
|
||
#define NAND_ECC_SECTOR_SIZE 512 //执行ECC计算的单元大小,默认512字节
|
||
|
||
//NAND FLASH操作相关延时函数
|
||
#define NAND_TADL_DELAY 35 //tADL等待延迟,最少70ns
|
||
#define NAND_TWHR_DELAY 30 //tWHR等待延迟,最少60ns
|
||
#define NAND_TRHW_DELAY 50 //tRHW等待延迟,最少100ns
|
||
#define NAND_TPROG_DELAY 350 //tPROG等待延迟,典型值200us,最大需要700us
|
||
#define NAND_TBERS_DELAY 4 //tBERS等待延迟,典型值3.5ms,最大需要10ms
|
||
#define NAND_TRST_FIRST_DELAY 3 //tRST复位后的第一次等待时间,最大为3ms
|
||
|
||
//NAND属性结构体
|
||
typedef struct
|
||
{
|
||
u16 page_totalsize; //每页总大小,main区和spare区总和
|
||
u16 page_mainsize; //每页的main区大小
|
||
u16 page_sparesize; //每页的spare区大小
|
||
u8 block_pagenum; //每个块包含的页数量
|
||
u16 plane_blocknum; //每个plane包含的块数量
|
||
u16 block_totalnum; //总的块数量
|
||
u16 good_blocknum; //好块数量
|
||
u16 valid_blocknum; //有效块数量(供文件系统使用的好块数量)
|
||
u32 id; //NAND FLASH ID
|
||
u16 *lut; //LUT表,用作逻辑块-物理块转换
|
||
u32 ecc_hard; //硬件计算出来的ECC值
|
||
u32 ecc_hdbuf[NAND_MAX_PAGE_SIZE/NAND_ECC_SECTOR_SIZE];//ECC硬件计算值缓冲区
|
||
u32 ecc_rdbuf[NAND_MAX_PAGE_SIZE/NAND_ECC_SECTOR_SIZE];//ECC读取的值缓冲区
|
||
}nand_attriute;
|
||
|
||
extern nand_attriute nand_dev; //nand重要参数结构体
|
||
|
||
#define NAND_RB HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_6)//NAND Flash的闲/忙引脚
|
||
|
||
#define NAND_ADDRESS 0X80000000 //nand flash的访问地址,接NCE3,地址为:0X8000 0000
|
||
#define NAND_CMD 1<<16 //发送命令
|
||
#define NAND_ADDR 1<<17 //发送地址
|
||
|
||
//NAND FLASH命令
|
||
#define NAND_READID 0X90 //读ID指令
|
||
#define NAND_FEATURE 0XEF //设置特性指令
|
||
#define NAND_RESET 0XFF //复位NAND
|
||
#define NAND_READSTA 0X70 //读状态
|
||
#define NAND_AREA_A 0X00
|
||
#define NAND_AREA_TRUE1 0X30
|
||
#define NAND_WRITE0 0X80
|
||
#define NAND_WRITE_TURE1 0X10
|
||
#define NAND_ERASE0 0X60
|
||
#define NAND_ERASE1 0XD0
|
||
#define NAND_MOVEDATA_CMD0 0X00
|
||
#define NAND_MOVEDATA_CMD1 0X35
|
||
#define NAND_MOVEDATA_CMD2 0X85
|
||
#define NAND_MOVEDATA_CMD3 0X10
|
||
|
||
//NAND FLASH状态
|
||
#define NSTA_READY 0X40 //nand已经准备好
|
||
#define NSTA_ERROR 0X01 //nand错误
|
||
#define NSTA_TIMEOUT 0X02 //超时
|
||
#define NSTA_ECC1BITERR 0X03 //ECC 1bit错误
|
||
#define NSTA_ECC2BITERR 0X04 //ECC 2bit以上错误
|
||
|
||
|
||
//NAND FLASH型号和对应的ID号
|
||
#define MT29F4G08ABADA 0XDC909556 //MT29F4G08ABADA
|
||
#define MT29F16G08ABABA 0X48002689 //MT29F16G08ABABA
|
||
|
||
//MPU相关设置
|
||
#define NAND_REGION_NUMBER MPU_REGION_NUMBER4 //NAND FLASH使用region4
|
||
#define NAND_ADDRESS_START 0X80000000 //NAND FLASH区的首地址
|
||
#define NAND_REGION_SIZE MPU_REGION_SIZE_256MB //NAND FLASH区大小
|
||
|
||
u8 NAND_Init(void);
|
||
u8 NAND_ModeSet(u8 mode);
|
||
u32 NAND_ReadID(void);
|
||
u8 NAND_ReadStatus(void);
|
||
u8 NAND_WaitForReady(void);
|
||
u8 NAND_Reset(void);
|
||
u8 NAND_WaitRB(vu8 rb);
|
||
void NAND_Delay(vu32 i);
|
||
void NAND_MPU_Config(void);
|
||
u8 NAND_ReadPage(u32 PageNum,u16 ColNum,u8 *pBuffer,u16 NumByteToRead);
|
||
u8 NAND_ReadPageComp(u32 PageNum,u16 ColNum,u32 CmpVal,u16 NumByteToRead,u16 *NumByteEqual);
|
||
u8 NAND_WritePage(u32 PageNum,u16 ColNum,u8 *pBuffer,u16 NumByteToWrite);
|
||
u8 NAND_WritePageConst(u32 PageNum,u16 ColNum,u32 cval,u16 NumByteToWrite);
|
||
u8 NAND_CopyPageWithoutWrite(u32 Source_PageNum,u32 Dest_PageNum);
|
||
u8 NAND_CopyPageWithWrite(u32 Source_PageNum,u32 Dest_PageNum,u16 ColNum,u8 *pBuffer,u16 NumByteToWrite);
|
||
u8 NAND_ReadSpare(u32 PageNum,u16 ColNum,u8 *pBuffer,u16 NumByteToRead);
|
||
u8 NAND_WriteSpare(u32 PageNum,u16 ColNum,u8 *pBuffer,u16 NumByteToRead);
|
||
u8 NAND_EraseBlock(u32 BlockNum);
|
||
void NAND_EraseChip(void);
|
||
|
||
u16 NAND_ECC_Get_OE(u8 oe,u32 eccval);
|
||
u8 NAND_ECC_Correction(u8* data_buf,u32 eccrd,u32 ecccl);
|
||
#endif
|
||
|