NAND Flash的驱动程序设计方案

图2 NAND Flash与S3C2410连接电路
2 Flash烧写程序原理及结构
基本原理:将在SDRAM中的一段存储区域中的数据写到NAND Flash存储空间中。烧写程序在纵向上分三层完成。第一层: 主烧写函数,将SDRAM中一段存储区域的数据写到NAND Flash存储空间中。第二层: 该层提供对NAND Flash进行操作的页读、写及块擦除等函数。第三层:为第二层提供具体NAND Flash控制器中对特殊功能寄存器进行操作的核心函数,该层也是真正将数据在SDRAM和NAND Flash之间实现传送的函数。其中第二层为驱动程序的设计关键所在,下面对该层的读、写(又称编程)、擦除功能编码进行详细介绍。
2.1 NAND Flash Read
功能:读数据操作以页为单位,读数据时首先写入读数据命令00H,然后输入要读取页的地址,接着从数据寄存器中读取数据,最后进行ECC校验。
参数说明:block,块号;page,页号;buffer,指向将要读取到内存中的起始位置;返回值1,读成功,返回值0:读失败。
static int NF_ReadPage(unsigned int block, unsigned int page, unsigned char *buffer){
NF_RSTECC(); /* 初始化 ECC */
NF_nFCE_L(); /* 片选NAND Flash芯片*/
NF_CMD(0x00); /* 从A区开始读 *//* A0~A7(列地址) */
NF_ADDR(0); /* A9A16(页地址) */
NF_ADDR(blockPage0xff); /* A17A24,(页地址) */
NF_ADDR((blockPage>>8)0xff);/* A25, (页地址) */
NF_ADDR((blockPage>>16)0xff);/* 等待NAND Flash处于再准备状态 */
ReadPage();/* 读整个页, 512字节 */
ReadECC();/* 读取ECC码 */
ReadOOB();/* 读取该页的OOB块 *//* 取消NAND Flash 选中*/
NF_nFCE_H();/* 校验ECC码, 并返回 */
Return (checkEcc())}
2.2 NAND Flash Program
功能:对页进行编程命令, 用于写操作。
命令代码:首先写入00h(A区)/01h(B区)/05h(C区), 表示写入那个区; 再写入80h开始编程模式(写入模式),接下来写入地址和数据; 最后写入10h表示编程结束。图3为程序流程图。
图3 写程序流程
参数说明:block,块号;page,页号;buffer,指向内存中待写入NAND Flash中的数据起始位置;返回值0,写错误,返回值1,写成功。
static int NF_WritePage(unsigned int block, unsigned int page, unsigned char *buffer){
NF_RSTECC(); /* 初始化 ECC */
NF_nFCE_L(); /* 片选NAND Flash芯片*/
NF_CMD(0x0); /* 从A区开始写 */
NF_CMD(0x80); /* 写第一条命令 *//* A0~A7(列地址) */
NF_ADDR(0);/* A9A16(页地址) */
NF_ADDR(blockPage0xff);/* A17A24(页地址) */
NF_ADDR((blockPage>>8)0xff); /* A25(页地址) */
NF_ADDR((blockPage>>16)0xff);/* 写页为512B到NAND Flash芯片 */
WRDATA(); /*OOB一共16字节,每一个字节存放什么由程序员自己定义, 在Byte0 Byte2存ECC检验码,Byte6 存放坏块标志*/
WRDATA(); /* 写该页的OOB数据块 */
CMD(0x10); /* 结束写命令 */
WAITRB();/* 等待NAND Flash处于准备状态 *//* 发送读状态命令给NAND Flash */
CMD(0x70);
if (RDDATA()0x1) { /*如果写有错, 则标示为坏块,取消NAND Flash 选中*/
MarkBadBlock(block);
return 0;
} else { /* 正常退出, 取消NAND Flash 选中*/
return 1;}
2.3 NAND Flash Erase
功能:块擦除命令。

评论