OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4388|回复: 1

实验40 NAND FLASH实验中FTL_Format有bug?

[复制链接]

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
发表于 2017-9-16 09:26:38 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 magicoctoy 于 2017-9-16 21:51 编辑

在ftl.c文件中的FTL_Format函数如下:
//格式化NAND 重建LUT表
//返回值:0,成功
//    其他,失败
u8 FTL_Format(void)
{
    u8 temp;
    u32 i,n;
    u32 goodblock=0;
        nand_dev.good_blocknum=0;
#if FTL_USE_BAD_BLOCK_SEARCH==1                                //使用擦-写-读的方式,检测坏块
        nand_dev.good_blocknum=FTL_SearchBadBlock();//搜寻坏块.耗时很久
#else                                                                                //直接使用NAND FLASH的出厂坏块标志(其他块,默认是好块)
    for(i=0;i<nand_dev.block_totalnum;i++)       
    {
                temp=FTL_CheckBadBlock(i);                        //检查一个块是否为坏块
        if(temp==0)                                                        //好块,!!!既然是好块,为什么还要擦除整个块区,而不是坏块需要擦除!!!
        {
                        temp=NAND_EraseBlock(i);
                        if(temp)                                                //擦除失败,认为坏块
                        {
                                printf("Bad block:%d\r\n",i);
                                FTL_BadBlockMark(i);                //标记是坏块
                        }else nand_dev.good_blocknum++;        //好块数量加一
                }
        }
#endif
    printf("good_blocknum:%d\r\n",nand_dev.good_blocknum);
    if(nand_dev.good_blocknum<100) return 1;        //如果好块的数量少于100,则NAND Flash报废   
    goodblock=(nand_dev.good_blocknum*93)/100;        //%93的好块用于存储数据  
    n=0;                                                                               
    for(i=0;i<nand_dev.block_totalnum;i++)                //在好块中标记上逻辑块信息
    {
        temp=FTL_CheckBadBlock(i);                          //检查一个块是否为坏块
        if(temp==0)                                          //好块
        {
            NAND_WriteSpare(i*nand_dev.block_pagenum,2,(u8*)&n,2);//写入逻辑块编号
            n++;                                                                //逻辑块编号加1
            if(n==goodblock) break;                                //全部标记完了
        }
    }
    if(FTL_CreateLUT(1))return 2;                              //重建LUT表失败
    return 0;
}











最佳答案

查看完整内容[请看2#楼]

正常的块,全部要擦除掉。以便后续使用,这里完成擦除操作。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-9-16 09:26:39 | 显示全部楼层
正常的块,全部要擦除掉。以便后续使用,这里完成擦除操作。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 21:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表