主题 : mini2440 128M nand(K9F1G08U0B)读写的疑问 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 10162
精华: 0
发帖: 47
金钱: 365 两
威望: 151 点
贡献值: 0 点
综合积分: 94 分
注册时间: 2009-10-26
最后登录: 2013-09-07
楼主  发表于: 2009-11-28 19:42

 mini2440 128M nand(K9F1G08U0B)读写的疑问

管理提醒: 本帖被 qq2440 从 Linux技术交流专区 移动到本区(2010-02-08)
(Update: 关于这一问题的进一步讨论,看http://www.aiothome.net/read.php?tid-5088.html
K9F1G08U0B这个手册上地址时序是四个周期(第6页),不太明白mini2440为什么用五个周期?

参考Tekkaman的移植uboot代码中int nand_read_llb(unsigned char *buf, unsigned long start_addr, int size) 函数 
(此函数在 ……/u-boot-2009.08/board/tekkamanninja/mini2440/nand_read.c中)
  (http://www.aiothome.net/read.php?tid-3539.html
  
        NFADDR = 0;
        NFADDR = 0;
        NFADDR = (i >> 11) & 0xff;
        NFADDR = (i >> 19) & 0xff;
        NFADDR = (i >> 27) & 0xff;

确实是五个周期,但是也不太明白。为什么不是这样呢:
                    
        NFADDR = 0;
        NFADDR = 0;
        NFADDR = (i >> 12) & 0xff;
        NFADDR = (i >> 20) & 0xff;
四个周期不就结束了?        
[ 此帖被kasim在2010-03-11 13:52重新编辑 ]
级别: 新手上路
UID: 11180
精华: 0
发帖: 7
金钱: 70 两
威望: 35 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2009-11-29
最后登录: 2010-04-09
1楼  发表于: 2009-11-29 22:24
我也刚好遇见这个问题,按照nand的芯片手册,应该是
nfaddr=i&0xff
nfaddr=(i>>8)&0x0f
nfaddr=(i>>12)&0xff
nfaddr=(i>>20)>>0xff
四个周期,但是很明显页大小是2k,如果第三个周期右移12的话就会造成2-4k这个地址和0-2k一样了,也就是说页大小成了4k.所以右移11是对的,这样刚好是2k,我读取的时候也发现右移12的话,2k内数据一样,2k到4k就不一样了,因为实际上2-4k还是读取的0-2k数据
至于5个周期是s3c2440芯片手册上根据gcon,gpg13,14,15这个接的情况决定的,可以看到原理图上接的是gcon=1所以后面需要5个地址周期。
我的问题是,即使右移了11位,2-4k数据也是不对,原因不明,因为发布的uboot那个用0x400内的数据比较,而0x400只是1k大小,对于512byte的这样就可以验证了,但是2k的应该用0x1000才可以吧,这才是4k大小,0x400属于2k内无法检验是否正确。(同时有个疑问为何0x400后面写的注释是4*1024=4k?这明明是2^10=1k阿,奇怪)希望得到解答
                                                                                            
级别: 新手上路
UID: 11180
精华: 0
发帖: 7
金钱: 70 两
威望: 35 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2009-11-29
最后登录: 2010-04-09
2楼  发表于: 2009-11-30 10:29
ldr r0,=_TEXT_BASE
      ldr r1,=0x0
      mov r2,#0x20000
      bl read_nand_ll
      tst r0,#0x0
      beq testequ
lll:  b lll
testequ:
     ldr r0,=_TEXT_BASE
     ldr r1,=0x0
    mov r2,#0x800
testp:ldr r3,[r1],#4
     ldr r4,[r0],#4
     teq r3,r4
     bne notmatch
     subs r2,r2,#4
     beq done    
     bne testp
notmatch:
     ldr r0,=LEDCON
     mov r1,#0x15400
     str r1,[r0]
     ldr r0,=LEDDAT
     mov r1,#0xef
     str r1,[r0]
here: b here
done:ldr r0,=LEDCON
     mov r1,#0x15400
     str r1,[r0]
     ldr r0,=LEDDAT
     mov r1,#0x0
     str r1,[r0]
abc: b abc
版主我的意思是这个,当我把0x20000这么大128k代码拷到sdram中的时候,用来比较0x800内(2k大小)这样的话数据是没错的,led灯也全亮了(证明进入了done里面)。而当我比较0x1000(4k大小)的时候灯亮了一个,进入了notmatch里面,说明2k到4k的数据有不相同的,只有0-2k的数据是相同的。在read_nand_ll里面我是按照128m的那种操作来的,和大家用的一样。因为大家用的是0x400比较,这个在0-2k里面没有超过一页,所以验证不出来问题。不知道版主有没有验证过2k之后的数据是不是一样?
级别: 新手上路
UID: 11180
精华: 0
发帖: 7
金钱: 70 两
威望: 35 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2009-11-29
最后登录: 2010-04-09
3楼  发表于: 2009-11-30 18:24
谢谢版主,是我自己写错了