S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash

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,原理图如下:

S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第1张图片

3. 使用uboot命令直接读写内存操作Nor Flash

实验前提:烧录uboot.bin到Nor Flash,并且板子设置为Nor Flash启动方式。

知识准备:uboot | uboot内存操作指令mw和md详解。

3.1. 读取Nor Flash ID(Manifacture ID)

查看Nor FLash芯片数据手册:
S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第2张图片
从数据手册中可知,读取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芯片数据手册:
S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第3张图片
从数据手册中可知,读取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,和数据手册中的一致:
S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第4张图片

3.3. 读取CFI信息

CFI 即 Common Flash Interface,公共Flash接口。Flash存储器接口标准有CFI和JEDEC(比较老的规范),CFI用于帮助程序从Flash芯片中获取操作方式信息,而不用在程序中硬编码Flash的ID。

① 进入CFI模式

查看Nor FLash数据手册中的命令列表,找到进入CFI模式的命令:
S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第5张图片
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下命令进行测试:

mw.w aa 98

进入CFI模式后,任意读取需要的CFI信息

首先读取一下CFI信息的前三个字符QRY进行测试:
S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第6张图片
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下命令进行测试:

md.w 20 3


再读取Flash容量信息测试一下:
S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第7张图片
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下命令进行测试:

md.w 4e 1


测试结果和数据手册一致,Flash容量应该为 2 21 = 2 M B 2^{21} = 2 MB 221=2MB

③ 读取CFI信息完毕,退出读CFI模式:向任意地址写0xF0(复位)。

mw.w 00 f0

S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第8张图片

3.4. 擦除和写入数据

Nor Flash不能直接写入,这样设计也是非常合理,如何Flash的内容像SDRAM那样被轻易修改,那还叫什么Flash呢?

① 擦除
Flash的特性就是写入时数据只能由1变为0,而不能由0变为1,所以向Flash写入数据时,需要先进行擦除操作,将数据变为0xFF,之后才能写入待写数据。

擦除Flash的命令如下:
S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第9张图片
因为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

S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第10张图片

② 写入

首先确保一下要写入的地址处是否是0xFF:

md.w 100000 1


接下来可以写入数据,查看芯片手册获取写入命令:
S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第11张图片
因为S3C2440的A1接在Nor Flash的A0上,所以CPU发出的地址应该是左移一位之后的地址,所以uboot中应该使用如下命令进行测试:

mw.w aaa aa
mw.w 554 55
mw.w aaa a0
mw.w 100000 1234

S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash_第12张图片

你可能感兴趣的:(S3C2440学习之旅)