加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

NAND Flash产生坏块原因

发布时间:2020-12-15 17:26:14 所属栏目:百科 来源:网络整理
导读:由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。坏块的特性是:当编程/擦除这个块时,不能将某些位拉高,这会造成Page Program和Block Erase操作时的错误,相应地反映到Status
由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。坏块的特性是:当编程/擦除这个块时,不能将某些位拉高,这会造成Page Program和Block Erase操作时的错误,相应地反映到Status Register的相应位。总体上,坏块可以分为两大类:
1.固有坏块
这是生产过程中产生的坏块,一般芯片原厂都会在出厂时都会将坏块第一个page的spare area的第6个byte标记为不等于0xff的值。
2.使用坏块
这是在NAND Flash使用过程中,如果Block Erase或者Page Program错误,就可以简单地将这个块作为坏块来处理,这个时候需要把坏块标记起来。为了和固有坏块信息保持一致,将新发现的坏块的第一个page的spare area的第6个Byte标记为非0xff的值。
  我们了解了NAND Flash出厂时在spare area中已经反映出了坏块信息,因此,如果在擦除一个块之前,一定要先check一下spare area的第6个byte是否是0xff,如果是就证明这是一个好块,可以擦除;如果是非0xff,那么就不能擦除。当然,这样处理可能会犯一个错误―――“错杀伪坏块”,因为在芯片操作过程中可能由于电压不稳定等偶然因素会造成NAND操作的错误。但是,为了数据的可靠性及软件设计的简单化,我们就要奉行“蒋委员长”的“宁可错杀一千,也决不放过一个”的宗旨。
补充说明:
  1.需要对前面由于Page Program错误发现的坏块进行一下特别说明。如果在对一个块的某个page进行编程的时候发生了错误就要把这个块标记为坏块,首先就要把其他好的page里面的内容备份到另外一个空的好块里面,然后,把这个块标记为坏块。当然,这可能会犯“错杀”之误,一个补救的办法,就是在进行完页备份之后,再将这个块擦除一遍,如果Block Erase发生错误,那就证明这个块是个真正的坏块,那就毫不犹豫地将它打个“戳”吧!
  2.可能有人会问,为什么要使用spare area的第六个byte作为坏块标记。这是NAND Flash生产商的默认约定,你可以看到Samsung,Toshiba,STMicroelectronics都是使用这个Byte作为坏块标记的。

如何快速检测NAND的坏块

首先调用erase,将NAND全部擦除一遍,然后执行如下检测操作,
如果页大于512字节,
badblockpos?? = 0;
badblockbytes = 2;
如果页小于512字节,
badblockpos?? = 5;
badblockbytes = 1;
读取每个block的前两页OOB区域的第badblockpos开始的后badblockbytes字节是否为0xff,
如果是,那么说明该block是好的,否则该block是坏块[gliethttp_20080523]!

DE>UINT_T create_bbt(FlashBootType_T fbt)
{
????UINT_T Retval;
????P_FlashProperties_T pFlashP?=?GetFlashProperties(fbt);
????UINT_T BlkSize,BlkNum;
????UINT_T flash_addr;
#define?page_size?(2048define?page_spare_size?(64define?block_size?*page_sizedefine?tmp_buffer_addr?(0x80200000?-?page_size?-?page_spare_sizedefine?tmp_spare_buffer_addr?(tmp_buffer_addr?+?page_size)
????int?i;
????char?*bbpos;

????bbpos?=?(char*(tmp_spare_buffer_addr?+?0;
????BlkSize?=?pFlashP->BlockSize;
????BlkNum?>NumBlocks;?
????
????for(i?=?0;i?<?BlkNum;i+{
????????flash_addr?=?i?*?BlkSize;
????????(j?;j?<?2;j)
????????{
????????????Retval?=?xdfc_read(UINT_T?)tmp_buffer_addr+j?)tmp_spare_buffer_addr;
????????????if(Retval)
????????????{
????????????????goto?__create_bbt_mark}
????????????
????????????(bbpos[0]?!=?0xff[1}
????????continue;

__create_bbt_mark:
????????RelocateBlock(?i&GetFMProperties>BBT}
}

转自:?http://qipeng.le.blog.163.com/blog/static/556691182010210101141383/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读