OpenEdv-开源电子网

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

关于F429例程中 nandflash操作的几点疑问,请大神解答,重赏

[复制链接]

14

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2017-5-4
在线时间
82 小时
发表于 2019-4-19 16:26:07 | 显示全部楼层 |阅读模式
50金钱
1 底层nand.c文件 NAND_ReadPage和NAND_WritePage 函数中有这么几句话[mw_shl_code=c,true]mw_shl_code=c,true]eccnum=NumByteToRead/NAND_ECC_SECTOR_SIZE;
eccstart=ColNum/NAND_ECC_SECTOR_SIZE;
p=pBuffer;
for(res=0;res<eccnum;res++)
{
FMC_Bank2_3->PCR3|=1<<6;
for(i=0;i<NAND_ECC_SECTOR_SIZE;i++)
{
*(vu8*)pBuffer++ = *(vu8*)NAND_ADDRESS;
}       
while(!(FMC_Bank2_3->SR3&(1<<6)));
nand_dev.ecc_hdbuf[res+eccstart]=FMC_Bank2_3->ECCR3;
FMC_Bank2_3->PCR3&=~(1<<6);
}
i=nand_dev.page_mainsize+0X10+eccstart*4; [/mw_shl_code]
其中eccstart = ColNum/NAND_ECC_SECTOR_SIZE;是不是有点问题,ColNum难道不需要512字节对其嘛,如果是从一页的任意列地址进行ECC的话那和原来的ECC校验值岂不是对应不上。
2 FTL层ftl.c文件的FTL_CreateLUT函数中有如下判断
[mw_shl_code=c,true]for(i=0;i<nand_dev.block_totalnum;i++)
    {
        if(nand_dev.lut>=nand_dev.block_totalnum)
        {
            nand_dev.valid_blocknum=i;
            break;
        }
    }
    if(nand_dev.valid_blocknum<100)return 2;[/mw_shl_code]
我认为这种判断有BUG。分析如下:当调用FTL_Format后,前93%的好块(假设数量为n)都被标记了逻辑号,并且逻辑号从0连续递增。那么LUT表建立后,前n个元素都赋值为对应的物理块号,第n+1个元素值为0xFFFF,这种判断方法是没有问题的。nand_dev.valid_blocknum = n。但是在FTL_CopyAndWriteToBlock函数中,有如下代码
[mw_shl_code=c,true]if(temp)                                                       
                                {
                                        FTL_BadBlockMark(unusedblock);       
                                        FTL_CreateLUT(1);                               
                                        goto retry;
                                }[/mw_shl_code]
如果unusedblock为坏块则调用FTL_CreateLUT(1);重新建立LUT表,如果unusedblock恰好小于100,则重建LUT表以后,LUT表原来值等于unusedblock的元素就等于0xFFFF了,并且该元素的索引肯定也是小于100的,因为没有进行格式化。因此这种判断的结果就是nand_dev.valid_blocknum<100。如果重新上电的话就会导致nand重新格式化,之前存的数据都丢了。
不知道我的分析是否正确,能否请大神解答一下我以上两点疑问,万分感谢!!!




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

153

主题

310

帖子

0

精华

高级会员

Rank: 4

积分
673
金钱
673
注册时间
2019-3-26
在线时间
18 小时
发表于 2019-4-19 17:21:14 | 显示全部楼层
http://www.iis7.com/c/90/
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14425
金钱
14425
注册时间
2018-8-3
在线时间
1157 小时
发表于 2019-4-19 20:09:46 | 显示全部楼层
帮顶....
回复

使用道具 举报

14

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2017-5-4
在线时间
82 小时
 楼主| 发表于 2019-4-22 08:25:46 | 显示全部楼层
自顶。。。没人帮忙解答吗
回复

使用道具 举报

14

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2017-5-4
在线时间
82 小时
 楼主| 发表于 2019-4-22 14:11:38 | 显示全部楼层
顶啊。。
回复

使用道具 举报

14

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2017-5-4
在线时间
82 小时
 楼主| 发表于 2019-4-23 17:23:53 | 显示全部楼层
顶一下
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2018-12-25
在线时间
54 小时
发表于 2019-9-2 13:50:40 | 显示全部楼层
没人回答吗?顶一个!!
回复

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-9-2 16:22:03 | 显示全部楼层
帮你顶帖
回复

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2016-7-5
在线时间
13 小时
发表于 2020-11-26 10:26:36 | 显示全部楼层
楼主解决了没有, 我有个问题,为什么不用这个呢
for(i=1;i<nand_dev.block_totalnum;i++)
        if(nand_dev.lut[i] ==i)
        {
            nand_dev.valid_blocknum++;
        }
}
还有当我遇到指定FLASH块(比如0-10块数据块)存满的时候,该如何处理。原子哥的程序好像没有做存满后再擦除循环存储的处理
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-12-31
在线时间
8 小时
发表于 2020-11-27 09:15:38 | 显示全部楼层
刚好最近也在研究原子的nand flash ftl,留个联系方式一起交流QQ19007359
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-14 13:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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