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

2007-5-12 15:50 6784 6 12 分类: MCU/ 嵌入式

    在进行数据存储的时候,我们需要保证数据的完整性,而NAND Flash大容量存储器K<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />9F1G08U芯片由于工艺上问题,不可避免就会出现有的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来存储这些数据,这样我们重复上面的动作分析再进行分析是否可以存储数据,该块能存储就存储到该块中去。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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


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);


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

文章评论6条评论)

登录后参与讨论

用户297166 2007-12-20 17:42

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

用户60667 2007-6-5 15:43

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

ash_riple_768180695 2007-6-5 10:07

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

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

用户60667 2007-5-30 09:33

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

ash_riple_768180695 2007-5-29 09:19

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

ash_riple_768180695 2007-5-29 09:17

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

相关推荐阅读
用户60667 2010-10-25 22:22
基于SP1010-LPC213X-ARM实验板的SPWM实验
    实验工程应用的逆变器常采用SPWM技术来实现,以前常用硬件来产生三角波和正弦波进行比较来产生SPWM信号,但常常不稳定,而用嵌入式ARM来产生SPWM信号就非常容易,几乎不用增加任何附加硬件产...
用户60667 2010-10-25 10:39
SP1010-LPC213X-ARM实验开发板
SP1010-LPC213X-ARM实验开发板是一款基于NXP公司的LPC21XX的ARM7内核的嵌入式开发平台,板载丰富的实验资源,提供的从简单到复杂的综合实验源程序达60多个。同时板上集成的了与语...
用户60667 2010-10-19 18:31
基于SP1010-LPC213X-ARM实验板的可调正弦幅度实验
来 源:西谱电子(www.supermcu.com)/*      实验目的:掌握LPC213X的D/A转换器的使用和编程,掌握正弦波产生的原理      实验内容:利用LPC213X的D/A模块实现...
用户60667 2010-10-14 18:03
基于SP1010-LPC213X-ARM实验板的键按键加减计数实验
发布时间:2010-10-14 来 源:西谱电子(www.supermcu.com)/*      实验目的:掌握LPC213X对两个按键识别的编程方法      实验内容:通过连接在LPC2132引...
用户60667 2010-10-14 11:46
基于SP1010-LPC213X-ARM实验板的单键按键加计数实验
来 源:西谱电子(www.supermcu.com)/*      实验目的:掌握IOnPIN寄存器在按键识别的作用及使用方法      实验内容:通过连接在P0.16引脚上的按键K1,实现每按一下K...
用户60667 2008-11-19 07:08
我的书"PIC单片机实用C语言程序设计与典型实例"已出版
直接登录我们的网站: www.supermcu.com 或直接登录中国互动出版网:http://www.china-pub.com/41131或直接登录中国电力出版社网上书店:http://www.c...
EE直播间
更多
我要评论
6
6
关闭 站长推荐上一条 /4 下一条