2019-07-21 01:04发布
正点原子 发表于 2018-12-8 01:28 多看几遍。 第一次写的时候,根本就没有数据,全部是0XFF,读出来ECC校验值的位置,也是0XFFF 自然就有 ...
正点原子 发表于 2018-12-12 01:26 没看明白你问题是什么? 你直接用我们例程,可以操作么?
最多设置5个标签!
原子哥,我上面3、4楼的问题能帮我看看是什么问题吗
串口发上来调试信息:
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
err hd,rd:0xff9a5999,0xff96a69a
eccnum,eccstart:1,0
PageNum,ColNum:261888,0
2bit ecc error or more
err hd,rd:0xffaaa599,0xffaaa6a5
eccnum,eccstart:1,1
PageNum,ColNum:261888,512
2bit ecc error or more
容量
disk total volume:950 MB
disk valid volume:950 MB
扫描到文件
err hd,rd:0xff9966a5,0xbedede4c
eccnum,eccstart:1,0
PageNum,ColNum:262002,0
2bit ecc error or more
1:/0
1:/1
1:/2
1:/3
读文件0:
Read file data is:
err hd,rd:0xff033cc0,0xf7ff9e4c
eccnum,eccstart:1,0
PageNum,ColNum:262003,0
2bit ecc error or more
0031 0032 0033 0034 0035 0036 0037 0038 0039 0000
Readed data len:10
Read data over
读文件3:
Read file data is:
err hd,rd:0xffffffff,0x00
eccnum,eccstart:1,0
PageNum,ColNum:262004,0
2bit ecc error or more
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009
000A 000B 000C 000D 000E 000F 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F 0020 0021 0022 0023 0024 002…………后面还有很多数据,但每512字节就有>2bit的ECC错误
下面是测试函数:
FTL_Init();
fatfs_init();
res=f_mount(fs[1],"1:",1); //挂载NAND FLASH.
if(res==0X0D)//NAND FLASH磁盘,FAT文件系统错误,重新格式化NAND FLASH
{
printf("%s ","NAND Disk Formatting...");//格式化NAND
res=f_mkfs("1:",1,4096);//格式化FLASH,2,盘符;1,不需要引导区,8个扇区为1个簇
if(res==0)
{
f_setlabel((const TCHAR *)"0:NANDDISK"); //设置Flash磁盘的名字为:NANDDISK
printf("%s ","NAND Disk Format Finish"); //格式化完成
}else printf("%s ","NAND Disk Format Error "); //格式化失败
delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();
}
DELAY_US(1000000L);
//fatfs_unlink((u8*)"1:/3");
fatfs_showfree((u8*)"1:");//显示剩余容量
fatfs_scan_files((u8*)"1:");//遍历文件
fatfs_open((u8*)"1:/1",0x01);//打开、读取文件
fatfs_read(10);
fatfs_close();
fatfs_open((u8*)"1:/3",0x01);
fatfs_size();
fatfs_read(8192);
fatfs_close();
串口发上来调试信息:
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
err hd,rd:0xff9a5999,0xff96a69a
eccnum,eccstart:1,0
PageNum,ColNum:261888,0
2bit ecc error or more
err hd,rd:0xffaaa599,0xffaaa6a5
eccnum,eccstart:1,1
PageNum,ColNum:261888,512
2bit ecc error or more
容量
disk total volume:950 MB
disk valid volume:950 MB
扫描到文件
err hd,rd:0xff9966a5,0xbedede4c
eccnum,eccstart:1,0
PageNum,ColNum:262002,0
2bit ecc error or more
1:/0
1:/1
1:/2
1:/3
读文件0:
Read file data is:
err hd,rd:0xff033cc0,0xf7ff9e4c
eccnum,eccstart:1,0
PageNum,ColNum:262003,0
2bit ecc error or more
0031 0032 0033 0034 0035 0036 0037 0038 0039 0000
Readed data len:10
Read data over
读文件3:
Read file data is:
err hd,rd:0xffffffff,0x00
eccnum,eccstart:1,0
PageNum,ColNum:262004,0
2bit ecc error or more
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009
000A 000B 000C 000D 000E 000F 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F 0020 0021 0022 0023 0024 002…………后面还有很多数据,但每512字节就有>2bit的ECC错误
下面是测试函数:
FTL_Init();
fatfs_init();
res=f_mount(fs[1],"1:",1); //挂载NAND FLASH.
if(res==0X0D)//NAND FLASH磁盘,FAT文件系统错误,重新格式化NAND FLASH
{
printf("%s ","NAND Disk Formatting...");//格式化NAND
res=f_mkfs("1:",1,4096);//格式化FLASH,2,盘符;1,不需要引导区,8个扇区为1个簇
if(res==0)
{
f_setlabel((const TCHAR *)"0:NANDDISK"); //设置Flash磁盘的名字为:NANDDISK
printf("%s ","NAND Disk Format Finish"); //格式化完成
}else printf("%s ","NAND Disk Format Error "); //格式化失败
delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();
}
DELAY_US(1000000L);
//fatfs_unlink((u8*)"1:/3");
fatfs_showfree((u8*)"1:");//显示剩余容量
fatfs_scan_files((u8*)"1:");//遍历文件
fatfs_open((u8*)"1:/0",0x01);//打开、读取文件
fatfs_read(10);
fatfs_close();
fatfs_open((u8*)"1:/3",0x01);
fatfs_size();
fatfs_read(8192);
fatfs_close();
原子哥,麻烦你看一下我的问题,谢谢!
现在我有疑问的几点如下:
1、底层驱动中规定:大于512字节进行ECC校验,小于512字节不进行ECC校验,但是在读写时我看代码都是以512字节(扇区大小)为单位,根本没有区分写入字节到底是多少:因为diskio.c文件中disk_read和disk_write分别调用的FTL函数为:FTL_ReadSectors(buff,sector,512,count);//读取数据FTL_WriteSectors((u8*)buff,sector,512,count);//写入数据。单位都是512而不是我们要写入读取的字节数。
2、在diskio.c文件中的disk_ioctl函数中获取nand参数:在case GET_BLOCK_SIZE 等于 nand_dev.page_mainsize/512;//block大小,定义成一个page的大小。明明要定义成一个page大小为什么还要除以512.
3、您实现的坏块管理和均衡摩擦主要是通过保留区实现的。剩下百分之七的块作为保留区,提供坏块替换的块和plane内复制时的替换块,后者擦除成功后可以继续留在保留区使用不成功丢弃为坏块,如此循环往复。我这样理解对吗?
4、我现在遇到的问题就是,如上面我贴出的代码(串口返回的信息):无论我进行何种操作:比如打开文件、写入文件,读取数据(每读取512字节,好像缓存只有这么大)都会返回一个>2bit的ECC校验错误。
一周热门 更多>