新闻中心

EEPW首页 > 模拟技术 > 设计应用 > NAND Flash的驱动程序设计方案

NAND Flash的驱动程序设计方案

作者:时间:2012-04-03来源:网络收藏
TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 3em; PADDING-TOP: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align=center>按此在新窗口浏览图片
图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

  功能:块擦除命令。



关键词: 模拟电路 模拟芯片 德州仪器 放大器 ADI 模拟电子

评论


相关推荐

技术专区

关闭