这是我的mini2440使用的nand flash 芯片,256MegaBytes。芯片手册也很容易找得。
昨天加今天一直在做芯片的读取,其实这部分我是在uboot里看过的。对于寻址部分没有充分注意。
我承认我在同一个问题上跌倒了两次。这次要记录下来!
这是三星提供的存储结构图。
column address A0-A11
row address A12-A28
这里row和page意思是一样的,一行就是一页。
256MB 8位 假如是内存的话要28根地址线才能寻址,2^28=256M ,2^30=1G。
很简单的运算。但是这里一共A0-A28,用到了29个地址位。
这里因为在一页内存里有2KByte+64Byte存储空间。另外的64字节可用于ECC和文件系统。
怎么对这64字节进行寻址呢。我错就错在这里。
参照韦东山的书
在nand_read函数里
我将s3c2440寻址部分做了更改
addr&0xff
(addr>>8)&0x0f
(addr>>12)&0xff
(addr>>20)&0xff
(addr>>28)&0x01
这样做是错的!
这里简单地将地址分为列地址和行地址。
比如,我想从4096开始寻址,这正好是第3页的起点。
4096=0x1000
s3c2440照着上式发给nand flash的地址,列地址0,行地址1,也就是告诉nand flash 要读取第2页的内容。
这就是错的地方。
因为在这个nand flash里2048和64并没有区分。
在同一个页里列地址0-2047是2kbytes的存储区,列2048-2111是另64bytes存储区。
得到的教训:
在2011年我已经发现了这个错误,没有记下来。不应该!
在忘记的时候多读芯片手册,多理解。
阅读(4677) | 评论(0) | 转发(0) |