1. Nor Flash与Nand Flash
Nor | Nand | |
---|---|---|
接口 | 引脚多,类似于RAM | 引脚较少 |
容量 | 小(1-32MB) | 大(128-512MB) |
读操作 | 简单,和RAM相同 | 简单,和RAM相同 |
写操作 | 发出特定命令才能写入 | 发出特定命令才能写入 |
价格 | 贵 | 便宜 |
比较 | 无坏块 | 有坏块 |
XIP | 可以 | 不可以 |
应用场合 | 存储关键性代码(比如uboot,kernel) | 存储海量数据(允许错误) |
2. JZ2440开发板上的Nor Flash
JZ2440开发板上板载了一个Nor Flash,型号为MX29LV160DBTI-70G
,连接在S3C2440内存控制器上的BANK0,原理图如下:
3. 使用uboot命令直接读写内存操作Nor Flash
实验前提:烧录uboot.bin到Nor Flash,并且板子设置为Nor Flash启动方式。
知识准备:uboot | uboot内存操作指令mw和md详解。
3.1. 读取Nor Flash ID(Manifacture ID)
查看Nor FLash芯片数据手册:
从数据手册中可知,读取Manifacture ID的流程如下:
- ① 向Nor Flash的
0x555
地址处写入数据0xAA
; - ② 向Nor Flash的
0x2aa
地址处写入数据0x55
; - ③ 向Nor Flash的
0x555
地址处写入数据0x90
(进入读ID模式); - ④ 从Nor Flash的
0x00
地址处读取数据,读取出的值就是Manifacture ID,为0xC2; - ⑤ 退出读ID模式:向任意地址写0xF0;
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下几条命令进行测试:
mw.w aaa aa
mw.w 554 55
mw.w aaa 90
md.w 0 1
3.2. 读取Nor Flash ID( Device ID)
查看Nor FLash芯片数据手册:
从数据手册中可知,读取Device ID的流程如下:
- ① 向Nor Flash的
0x555
地址处写入数据0xAA
; - ② 向Nor Flash的
0x2aa
地址处写入数据0x55
; - ③ 向Nor Flash的
0x555
地址处写入数据0x90
(进入读ID模式); - ④ 从Nor Flash的
0x02
地址处读取数据,读取出的值就是Device ID,为实际ID; - ⑤ 退出读ID模式:向任意地址写0xF0;
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下几条命令进行测试:
mw.w aaa aa
mw.w 554 55
mw.w aaa 90
md.w 2 1
本实验中读取的Device ID是0x2249
,和数据手册中的一致:
3.3. 读取CFI信息
CFI 即 Common Flash Interface,公共Flash接口。Flash存储器接口标准有CFI和JEDEC(比较老的规范),CFI用于帮助程序从Flash芯片中获取操作方式信息,而不用在程序中硬编码Flash的ID。
① 进入CFI模式
查看Nor FLash数据手册中的命令列表,找到进入CFI模式的命令:
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下命令进行测试:
mw.w aa 98
② 进入CFI模式后,任意读取需要的CFI信息
首先读取一下CFI信息的前三个字符QRY
进行测试:
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下命令进行测试:
md.w 20 3
再读取Flash容量信息测试一下:
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下命令进行测试:
md.w 4e 1
测试结果和数据手册一致,Flash容量应该为
2
的
21
次
方
=
2
M
B
2的21次方=2MB
2的21次方=2MB。
③ 读取CFI信息完毕,退出读CFI模式:向任意地址写0xF0(复位)。
mw.w 00 f0
3.4. 擦除和写入数据
Nor Flash不能直接写入,这样设计也是非常合理,如果Flash的内容像SDRAM那样被轻易修改,那还叫什么Flash呢?
① 擦除
Flash的特性就是写入时数据只能由1变为0,而不能由0变为1,所以向Flash写入数据时,需要先进行擦除操作,将数据变为0xFF,之后才能写入待写数据。
擦除Flash的命令如下:
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下命令进行测试:
mw.w aaa aa
mw.w 554 55
mw.w aaa 80
mw.w aaa aa
mw.w 554 55
mw.w 100000 30
② 写入
首先确保一下要写入的地址处是否是0xFF:
md.w 100000 1
接下来可以写入数据,查看芯片手册获取写入命令:
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下命令进行测试:
mw.w aaa aa
mw.w 554 55
mw.w aaa a0
mw.w 100000 1234