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>再烧写

 

 

 

  

 

posted @ 2020-03-26 16:03  坦率  阅读(1182)  评论(0编辑  收藏  举报