Nor flash 原理及硬件操作(1)
准备:使用OpenJTAG下载u-boot.bin于Nor flash,并且使用Nor启动。
下面我们使用u-boot来体验Nor Flash的操作(开发板设置Nor启动,进入u-boot)
Note:
Word(width=16bit):jz2440开发板原理图使用的是16bits的接法,所以在u-boot中使用Word行的命令。
Byte(width=8bit):另外的一种接法,具体怎么接,取决于硬件原理图。
1.读Nor flash上存储的数据
1 md.b 0 //从0地址开始读取数据
2.读Nor flash的ID
Nor flash | jz2440 | u-boot |
地址555H写AAH | 地址AAAH(555H<<1)写AAH | mw.w aaa aa |
地址2AAH写55H | 地址554H(2AAH<<1) 写55H | mw.w 554 55 |
地址555H写90H | 地址AAAH(555H<<1)写90H | mw.w aaa 90 |
读0得到厂家ID | 读地址0(0<<1)得到厂家ID | md.w 0 |
读1得到设备ID | 读地址2(1<<1)得到设备ID | md.w 2 |
退出读ID状态 | 退出读ID状态 | mw.w 0 f0 |
技巧:左移1位相当于乘以2。
为什么Nor flash上的操作和jz2440上的操作地址不一致???
捋一捋:
操作对象Nor flash,由于操作对象是Nor flash,所以我们必须遵从Nor flash的操作指令,查看MX29LV800BT/BB:TABLE 5. MX29LV800BT/BB COMMAND DEFINITIONS。
操作工具jz2440,因为通过jz2440操作Nor flash,所以必须得清楚jz2440与Nor flash的原理图:
经过观察,我们发现,jz2440的A1对应Nor flash的A0,...依次类推。换言之,jz2440中的数据是从A0开始存放的,想要操作Nor flash的A0,必须要将写入jz2440的数据左移一位(高位),才能与Nor flash的A0对齐。
3.Flash 存储器接口还有两个标准:CFI和JEDEC。(Flash=Nor flash/Nand flash)
<1>CFI[Common Flash Interface]为公共Flash接口,用来帮助程序从Flash芯片中获取操作方式信息(发送命令,从Nor flash的芯片里获取器件的各种参数,换芯片时,不需修改内核代码),而不用在程序中硬编码Flash的ID。
<2>JEDEC用来帮助程序读取Flash的制造商ID和设备ID(在内核里有这个Nor flash 的所有信息,换另外一款芯片时,若内核里没有这款芯片的描述,需手动添加该器件的各种参数),以确定Flash的大小和算法,如果芯片不支持CFI,就需使用JEDEC了。
通过查阅手册我们知道,Nor flash 也有两个接口标准:
在u-boot源码之中有一个jedec.c文件,里面记录了flash的信息,如果采用的是JEDEC标准接口,换用不同的flash时,需要修改jedec.c里面的相关信息。
注意:JEDEC接口标准在换用不同的flash之后,需要修改u-boot里面的jedec.c文件。
由于CFI模式更加通用一些,所以我们主要演示CFI模式下读取Nor flash信息的操作:
<1>进入CFI模式:往地址aa(55H<<1)写入98。
<2>读取相关数据
读地址20H(10H<<1)得到0051
读地址22H(11H<<1)得到0052
读地址24H(12H<<1)得到0059
读地址4EH(27H<<1)得到容量 (15H->10进制:21,2^21=2097152Bytes)
<3>退出CFI模式
1 mw.w 0 f0 //mw.w写操作命令,也是复位操作命令
4.写数据
(1)实验1,往Nor flash写数据
读地址100000H
地址100000H写入1234H
再读地址100000H
结论:Nor flash 无法写入。
难道说Nor flash就只能读,不能写吗?答:当然能够写,只不过需要些特殊的指令。(参考5)
(2)实验2,往SDRAM写数据
读地址30000000H
地址30000000H写入1234H
再读地址30000000H
结论:通过u-boot可以读写内存,自动擦除原来的数据并写入新的数据。
5.烧写
特殊的指令:
地址AAAH(555H<<1)写AAH
地址554H(2AAH<<1)写55H
地址AAAH(555H<<1)写A0H
地址PA写PD //PA:Program Addr PD:Program Data
(1)实验1,地址0x100000写入1234
结论:在Nor flash地址值全为0xffff时,使用特殊指令后,可以写入数据。
(2)实验2,地址0x100000写入5678
结论:在Nor flash地址值不为0xffff时,使用特殊指令后,无法写入数据。
有什么解决办法吗?
1>先擦除
特殊的指令:
地址AAAH(555H<<1)写AAH
地址554H(2AAH<<1)写55H
地址AAAH(555H<<1)写80H
地址AAAH(555H<<1)写AAH
地址554H(2AAH<<1)写55H
地址SA写30H //SA:Sector Erase
2>再烧写