微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 模拟电路设计 > NAND Flash的驱动程序设计方案

NAND Flash的驱动程序设计方案

时间:04-03 来源:互联网 点击:

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

  功能:块擦除命令。

  命令代码:首先写入60h进入擦写模式,然后输入块地址,接下来写入D0h, 表示擦写结束。

  参数说明:block,块号;返回值0,擦除错误(若是坏块直接返回0;若擦除出现错误则标记为坏块然后返回0),返回值1,成功擦除。

static int NF_EraseBlock(unsigned int block){/* 如果该块是坏块, 则返回 */
  if(NF_IsBadBlock(block)) return 0;
  NF_nFCE_L(); /* 片选NAND Flash芯片*/
  NF_CMD(0x60); /* 设置擦写模式 *//* A9A16(Page Address) , 是基于块擦除*/
  NF_ADDR(blockPage0xff);
  NF_ADDR((blockPage>>8)0xff); /* A25(Page Address) */
  NF_ADDR((blockPage>>16)0xff); NF_CMD(0xd0); WAITRB();CMD(0x70);
  if(RDDATA()0x1){/*如有错,标为坏块,取消Flash选中*/
  MarkBadBlock(block);
  return 0;
  } else { /* 退出, 取消Flash 选中*/
  return 1;}

3 ECC校检原理与实现

  由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能可靠,因此在NAND的生产及使用过程中会产生坏块。为了检测数据的可靠性,在应用NAND Flash的系统中一般都会采用一定的坏区管理策略,而管理坏区的前提是能比较可靠地进行坏区检测。如果操作时序和电路稳定性不存在问题的话,NAND Flash出错的时候一般不会造成整个块或是页不能读取或全部出错,而是整个页(例如512字节)中只有一位或几位出错。对数据的校验常用的有奇偶校验、CRC校验等,而在NAND Flash处理中,一般使用一种专用的校验——ECC。ECC能纠正单位错误和检测双位错误,而且计算速度很快,但对1位以上的错误无法纠正,对2位以上的错误不保证能检测。ECC一般每256字节原始数据生成3字节ECC校验数据,这3字节共24位分成两部分:6位的列校验和16位的行校验,多余的2位置1,如表1所列。

表1 校检数据组成

  首先介绍ECC的列校检。ECC的列校验和生成规则如图4所示,“^”表示“位异或”操作。由于篇幅关系,行校检不作介绍,感兴趣的读者可以参考芯片datasheet,在三星公司网站可以免费下载。


图4 列校验和生成规则

  数学表达式为:

  当向NAND Flash的页中写入数据时,每256字节生成一个ECC校验和,称之为原ECC校验和,保存到页的OOB数据区中。当从NAND Flash中读取数据时,每256字节生成一个ECC校验和,称之为新ECC校验和。校验的时候,根据上述ECC生成原理不难推断:将从OOB区中读出的原ECC校验和与新ECC校验和按位异或,若结果为0,则表示无错(或者出现了 ECC无法检测的错误);若3字节异或结果中存在11位为1,表示存在一个位错误,且可纠正;若3个字节异或结果中只存在1位为1,表示 OOB区出错;其他情况均表示出现了无法纠正的错误。

4 UBOOT下功能验证

实现UBOOT对NAND Flash的支持主要是在命令行下实现对NAND Flash的操作。对NAND Flash实现的命令为:nand info、nand device、nand read、nand writ

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top