Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9084664
  • 博文数量: 1732
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 19830
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1732)

文章存档

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: LINUX

2012-03-19 11:27:16

在进行数据存储的时候,我们需要保证数据的完整性,而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]);

阅读(4216) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~