Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35102
  • 博文数量: 9
  • 博客积分: 128
  • 博客等级: 入伍新兵
  • 技术积分: 142
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-21 11:28
文章分类
文章存档

2015年(3)

2012年(6)

我的朋友

分类: 嵌入式

2012-04-11 21:26:04

这是我的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) |
0

上一篇:u-boot启动完全分析

下一篇:build.c

给主人留下些什么吧!~~