EDN首页   博客首页

日志档案

发表于 2007-5-12 15:50:20

12

标签: 西谱电子  SP9608  

NAND Flash大容量存储器K9F1G08U的坏块管理方法

    在进行数据存储的时候,我们需要保证数据的完整性,而NAND Flash大容量存储器K9F1G08U芯片由于工艺上问题,不可避免就会出现有的Block中就是某个位或某些位是块的,就是用块擦除命令也是无法擦除的,K9F1G08U数据手册也讲了坏块是存在的,对于K9F1G08U最多有20个坏块。如果数据存储到这个坏块中,就无法保证该数据存储的完整性。对于坏块的管理K9F1G08U数据手册也有它的方法去处理该坏块的方法,我根据实际经验总结出自己的一种方法。首先我们要定义一个坏块管理表:unsigned char BadBlockTable[128],此数组可以存储1024Block状态,即每一个字节存储8Block状态。我们要存储一批数据到NAND Flash中去某个Block时,先执行Block擦除操作,然后分析该Block1st Page2st Page中的每个位是否全是FFH,如果全是FFH,则在BadBlockTable数组当前Block对应的字节位给置0,否则置1。如果是1表示当前的块是不能存储数据的,这时需要更换下一个Block来存储这些数据,这样我们重复上面的动作分析再进行分析是否可以存储数据,该块能存储就存储到该块中去。

    具体实现的算法程序如下:

Flag=TRUE;
while(TRUE==Flag)
{                       

Erase_K9F1G08U_Block(K9F1G08U.HighAddress,K9F1G08U.LowAddress);               Flag=Check_K9F1G08U_Block(K9F1G08U.HighAddress/64);                   if(TRUE==Flag)//is invalid block
{                         

BadBlockTable[K9F1G08U.HighAddress/512]|=

(1<<(K9F1G08U.HighAddress%8));

  K9F1G08U.HighAddress+=64;//Point to Next Block
}
else
// is valid block ,record to BadBlockTable
  {               

BadBlockTable[K9F1G08U.HighAddress/512]&=

~(1<<(K9F1G08U.HighAddress%8));
  }

}
for(i=0;i<sizeof(BadBlockTable);i++)                    

Write_RAM(RAM_BANK_0,K9F1G08U_BAD_BLOCK+i,BadBlockTable[i]);

更多内容,我们的网站:www.supermcu.com

系统分类: 单片机   |   用户分类: AVR单片机   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(2546)    回复(6)  

投一票您将和博主都有获奖机会!

  • riple

    2007-5-29 9:17:37

    擦除不成功的块或写入不成功的块都是坏块,这点是正确的。不成功的检查方法可以有两种:1.操作完成后校验数据(博主采用的方法);2.操作完成后通过查询状态字节也可以得到操作是否成功的信息。后一点在芯片的数据手册中应该给出。后一种方法只需要在操作完成后发送一个字节的指令,执行一个字节的读操作就可以实现。

  • riple

    2007-5-29 9:19:39

    我用过2G08和4G08的芯片,这两种芯片内部都有校验电路,自动在烧写和擦除后校验数据,并更新状态字节。1G08应该也行。

  • supermcu

    2007-5-30 9:33:56

    感谢您给我提了这些好的建议.

  • riple

    2007-6-5 10:07:22

    还有一点:初始坏块不一定表现为坏块。几次擦除和写入可能没问题,一段时间以后就会出问题(操作次数、工作环境都有可能)。所以手册里提到:一定不要擦除初始坏块,擦除后可能成功,但是以后的数据完整性不能保证。这样的坏块就会表现为时好时坏,很危险的。要先查找初始坏块,这点手册里也有。

    还有一点:使用中出现的坏块不一定是永久性坏块,经过一次成功的擦除就可以恢复。使用中的坏块多是由于对邻近页反复执行写入和读取操作,造成当前页电荷泄露造成的。这是NAND的固有结构造成的,所以ECC是必要的。一方面可以保证数据的完整性,一方面可以延长器件的寿命。

  • supermcu

    2007-6-5 15:43:11

    嗯,我的将程序修改一下,采用ECC来完成,以保证数据的完整性,非常感谢您的建议.

  • w_m

    2007-12-20 17:42:57

       数据是大量的连续进来,需要存储,如果每次都要进行一次擦操作,判断好坏,那么数据会不会丢失呢?希望有人能指点一下