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

Posted Neutionwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash相关的知识,希望对你有一定的参考价值。

1. Nor Flash与Nand Flash

NorNand
接口引脚多,类似于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 221=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

以上是关于S3C2440-裸机篇-09 | 使用S3C2440操作Nor Flash的主要内容,如果未能解决你的问题,请参考以下文章

S3C2440-裸机篇-05 | S3C2440时钟体系详解(FCLKPCLKHCLK)

_Embedded-System专栏文章导航与优秀笔记整理(2021.08.08更新)

S3C2440-裸机篇-03 | GPIO的使用(点亮LED按键检测)

S3C2440-裸机篇-07 | S3C2440内存控制器(Memory Controller)

S3C2440-裸机篇-02 | 安装和使用arm-linux-gcc交叉编译工具链

S3C2440-裸机篇-01 | JZ2440开发板快速上手