主题 : 请教:关于2440test工程中 nand.c 文件中的 void CopyProgramFromNand(void) 函数 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 19923
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
综合积分: 28 分
注册时间: 2010-04-25
最后登录: 2018-07-15
楼主  发表于: 2011-06-06 22:08

 请教:关于2440test工程中 nand.c 文件中的 void CopyProgramFromNand(void) 函数

关于2440test工程中 nand.c 文件中的 void CopyProgramFromNand(void) 函数

在函数 void CopyProgramFromNand(void)  中  对于 k9f1g08   为 2K的 大页

1:for (Sector = StartSector, GoodSector = Sector; Sector < StopSector; Sector ++, GoodSector++)
2:{        // begin of a block
3:           if (GoodSector & ( (1 << sector_block_shift) - 1 ) == 0)
4:           {    
5:        // found a good block
6:               for (;;)
7:                {
8:              if (!Nand_IsBadBlock(GoodSector >> sector_block_shift, bLargeBlock))
9:             {
10:                             // Is good Block
11:                    break;
12:    }
13:    // try next block
14:    GoodSector += (1 << sector_block_shift);
15:                }
16:            }
17:            Nand_ReadSector(GoodSector, RAM + (Sector << byte_sector_shift ), bLargeBlock);
18:}

问题一:第一行中的 Sector = StartSector,这里的扇区指的是什么?
       k9f1g08 数据手册上 ,1块是64页,每页是2048 字节,还有 额外的64字节 ,这里的 扇区指点什么意思啊?一页2048 字节中的 512 字节吗?
问题二:第三行中, sector_block_shift 定义为 8 ,2^8 = 256,减一就是 255,0xff,1111 1111 ,这句是判断GoodSector 是256的倍数吗?是256 的倍数,进行坏块检测?

问题三: Nand_ReadSector函数,里面,尽管是对2048的页进行读取,最终调用的函数是__RdPage512(),为什么只是读取 512 字节?
      
[ 此帖被cheng105在2011-06-06 22:45重新编辑 ]
级别: 新手上路
UID: 19923
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
综合积分: 28 分
注册时间: 2010-04-25
最后登录: 2018-07-15
1楼  发表于: 2011-06-06 22:41
写错了,一块是 64 页,每页2048字节
级别: 新手上路
UID: 43836
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2011-04-20
最后登录: 2012-01-13
2楼  发表于: 2011-08-16 20:48
我也很想知道为什么??最近在弄Nandflash的文件系统FATFS的移植
级别: 新手上路
UID: 43836
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2011-04-20
最后登录: 2012-01-13
3楼  发表于: 2011-08-21 10:22

 回 楼主(cheng105) 的帖子

我来回答你的问题。
关于第一个问题:Sector = StartSector,其实就是将Nandflash中需要把数据复制到SDRAM的开始扇区复制给Sector ,很显然,该程序是想从0扇区开始复制数据到5120扇区,总共你可以算算了,大概2.5M吧。

关于第二个问题:没错,sector_block_shift 的定义就是为了坏块检测的。你想一想2k的K9F2G08这款芯片是一块有64页,所以一块的容量就是2k*64=128k,那么一块包含的扇区数就=128k/512=256个扇区,那么很显然了。if (GoodSector & ( (1 << sector_block_shift) - 1 ) == 0)就是判断某一个扇区是不是块的第一个扇区,如果是的话就要检测这个块是不是坏块了。

关于第三个问题:Nand_ReadSector函数里面调用__RdPage512(),没错,就是想读取512个字节,因为你没看到最后一句吗?Nand_ReadSector(GoodSector, RAM + (Sector << byte_sector_shift ), bLargeBlock);
将GoodSector好扇区的数据复制到RAM+512哥字节。意思就是每次将好扇区的数据复制到SDRAM中,每次复制512字节。

当然了,对于页数是512字节的Nandflash也是一样的