首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

NAND Flash的驱动程序设计(2)

NAND Flash的驱动程序设计(2)

参数说明: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(blockPage&0xff);/* 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(blockPage&0xff);
  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 write、nand erease、nand bad。用到的主要数据结构有:struct nand_flash_dev和struct nand_chip,前者包括主要的芯片型号、存储容量、设备ID、I/O总线宽度等信息,后者是对NAND Flash进行具体操作时用到的信息。由于将驱动移植到UBoot的方法不是本文重点,故不作详细介绍。
  验证方式:通过TFTP将数据下载到SDRAM中,利用nand read、nand write、nand erease三个命令对NAND Flash进行读、编程、擦写测试。测试结果如表2所列。和datasheet中数据对比,可以得出结论,驱动在系统中运行良好。


  表2 测试结果
  结语
  现在嵌入式系统应用越来越广泛,而存储器件又是嵌入式系统必不可少的一部分,NAND Flash在不超过4 GB容量的需求下,较其他存储器件优势明显。本文所设计的驱动并未基于任何操作系统,可以方便地移植到多种操作系统和Boot Loader下,对于简化嵌入式系统开发有一定的实际意义。
继承事业,薪火相传
返回列表