主题 : 关于 K9F1G08U0B NAND flash 读写问题? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 14440
精华: 0
发帖: 11
金钱: 75 两
威望: 15 点
综合积分: 22 分
注册时间: 2010-02-09
最后登录: 2011-05-25
楼主  发表于: 2010-03-10 20:11

 关于 K9F1G08U0B NAND flash 读写问题?

图片:
最开始看2440test里的nand.c代码,对照datasheet 一直没弄明白它里面的地址周期的指令(如上图),后来看到http://aiothome.net/read.php?tid-3795.html帖子,里面版主说K9F1G08U0B 是每页2K,column地址应该是(A0~A10) 而A11~A26为page和block地址,A27可以不要。我觉得这样就可以解释Nand_ReadSectorPage2048()函数,如下

STATIC int Nand_ReadSectorPage2048(U32 sector, U8 *buffer)
{
    U32 page, data_addr;

     Nand_Reset();

    NF_nFCE_L();    

    NF_CLEAR_RB();
    NF_CMD(0x00);        
    page = sector/4;
    data_addr = 512 *(sector%4);
    NF_ADDR(data_addr&0xff);
    NF_ADDR((data_addr>>8)&0xff);
    NF_ADDR(page&0xff);
    NF_ADDR((page>>8)&0xff);
    NF_ADDR((page>>16)&0xff);
    NF_CMD(0x30);
    
    
    NF_DETECT_RB();    

    __RdPage512(buffer);

    NF_nFCE_H();    

       return OK;
}
上面第5个地址周期是针对大于128MB的flash设计的,K9F1G08U0B会自己忽略,也就是说可以去掉!

但是当我看到Nand_IsBadBlockPage2048()函数时,发现函数读到column地址是2048(Spare feild),我知道K9F1G08U0B flash PAGE READ 命令是将整个页column地址后面的数据都可以读出来,包括Main和Spare。由于上面对地址周期的认识,column地址的寻址范围就只有0~2047,也就是Spare Field不能随机读取。但是这里的代码寻址为2048,就感觉不符合上面的解释。
于是我猜想K9F1G08U0B的column地址就是A0~A11(0~4095),这样就可以随机访问2048以后的数据;而page和block地址为A12~A27。但是这里需要注意:A11是不会反映在PAGE READ的读取地址里,它只有在具体函数命令里根据需要才有意义(如Nand_IsBadBlockPage2048()函数),而PAGE READ地址数据的A11~A26才是page和block地址。如果是这样,那么就可以很好解释datasheet和nand.c里的程序!!
不知道我的理解是不是正确的,希望大家给个答复,谢谢!!!!


STATIC int Nand_IsBadBlockPage2048(U32 block)
{
    U32     Page;
    U8     BAD;
    
    Page = block << 6;
    NF_nFCE_L();
    NF_CLEAR_RB();
    NF_CMD(0x00);
    NF_ADDR(0);
    NF_ADDR((2048>>8)&0xff);
    NF_ADDR(Page&0xff);
    NF_ADDR((Page>>8)&0xff);
    NF_ADDR((Page>>16)&0xff);
    NF_CMD(0x30);        
    NF_DETECT_RB();

    BAD = NF_RDDATA8();
            
    NF_nFCE_H();    

    return BAD != 0xff;
}
以下是根据我的理解,写的一个示例int NAND_READ_PAGE(U32 addr)
{
    NF_nFCE_L();
    NF_CLEAR_RB();
    NF_CMD(0x00);
    NF_ADDR();
    NF_ADDR();     //1st和2nd地址周期发送column地址(0~2111),若是访问Main feild,NF_ADDR(addr&0xff);NF_ADDR((addr>>8)&07);
    NF_ADDR((addr>>11)&0xff);
    NF_ADDR((addr>>19)&0xff);
    NF_ADDR ((addr >> 27) & 0xff);  // >128M flash 有效
  NF_CMD(0x30);        
    NF_DETECT_RB();
   ·········
}
[ 此帖被shell110在2010-03-10 20:17重新编辑 ]
级别: 新手上路
UID: 14440
精华: 0
发帖: 11
金钱: 75 两
威望: 15 点
综合积分: 22 分
注册时间: 2010-02-09
最后登录: 2011-05-25
1楼  发表于: 2010-03-11 10:59
没人理吗?
级别: 新手上路
UID: 5775
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
综合积分: 24 分
注册时间: 2009-05-08
最后登录: 2011-05-05
2楼  发表于: 2010-03-11 13:03
其实你这个是一个很好的贴子,我也在这个问题上搞了好久。我用的开发板是mini2440 128m nandflash 期间也做裸机实验,在nand读写问题上不知如何理解,最终我也只是修改了一下例程就用了。论坛上裸机贴很少,看了你的分析感觉挺有道理的,我也要在研究一下才行。可以交个朋友不?我的qq:214874248.
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2010-03-11 13:48
是的,我那样说是针对page内的数据读取,对于OOB数据来说,columm地址当然会超过2047。
谢谢你指出这一点
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 14440
精华: 0
发帖: 11
金钱: 75 两
威望: 15 点
综合积分: 22 分
注册时间: 2010-02-09
最后登录: 2011-05-25
4楼  发表于: 2010-03-11 15:43

 回 3楼(kasim) 的帖子

哦 终于弄明白了  这个论坛挺不错的!!版主, 加油!!
级别: 新手上路
UID: 23533
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2010-06-21
最后登录: 2010-07-05
5楼  发表于: 2010-06-22 11:48
就楼主的地址周期图以及讨论,我有些不同看法,希望和大家交流。
有两种读操作需求,一种是将OOB统一编址,一种非统一编址,根据这两种读需求可以得到两种不同的编址方式,分别再以各自的周期方式发送给控制器,最终控制器通过整合得到的是绝对唯一的物理地址,所以A11到底是column还是row是由需求决定的,无所谓对错。我查看了omap3530中美光的NAND驱动(x-loader版),它的驱动与三星的k9f1g08r0a兼容,与楼主的地址周期也相同。有以下分析:
1.统一编址OOB
如果考虑OOB,那么A0-A11均为column地址。在计算地址时,PAGE的大小必须指定为2112.
CYCLE1:A0-A7
CYCLE2:A8-A11,高位补0
CYCLE3:A12-A19
CYCLE4:A20-A27
2.非统一编址
如果不考虑OOB,那么A11为row地址。在计算地址时,PAGE大小必须指定为2048.
CYCLE1:A0-A7
CYCLE2:A8-A10,高位补0
CYCLE3:A11-A18
CYCLE4:A19-A26
CYCLE5:A27,如果FLASH<128M,此周期可以忽略

通常用户是不考虑OOB的,所以编址时采用第2种方案。X-LOADER采用第2种方案,在发送第2个地址时周期,会判断此次读操作是否为读OOB,如果是,则会将第2个周期的第4比特置1,这样控制器就会处理2048-2111,而不是0-2047.
级别: 新手上路
UID: 23911
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2010-06-28
最后登录: 2010-08-31
6楼  发表于: 2010-07-09 20:17
顶!!
学到东西了
级别: 新手上路
UID: 19923
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
综合积分: 28 分
注册时间: 2010-04-25
最后登录: 2018-07-15
7楼  发表于: 2011-05-31 21:14
mark
级别: 新手上路
UID: 49154
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2011-06-08
最后登录: 2011-06-12
8楼  发表于: 2011-06-08 18:35
nice
我的嵌入式之家,大家的嵌入式天堂!一起加油!!!
级别: 新手上路
UID: 55859
精华: 0
发帖: 22
金钱: 115 两
威望: 23 点
综合积分: 44 分
注册时间: 2011-09-24
最后登录: 2017-11-18
9楼  发表于: 2012-01-11 15:45
相见恨晚啊!!!