声明:本文章是学完韦东山老师的教学视频后看过一些文章后所写,在看文章时我会将一些可能重要的知识点复制下来,所以可能会抄到您文章中的一些内容,如果您有什么意见,请同我讲出我会修改或删除。而如果这篇文章对您有帮助,那是我的荣幸。同时我看到网上有一些很好的写nor驱动的文章,但是我发现这些文章中对于nor的硬件描述以及nor与开发板的联系上并不是说的十分清楚,所以我想借这篇文章说一些关于硬件的事。
下面我们言归正传说芯片,我用的这款nor芯片为MX29LV160D,而下面是一些他的基础特征:
•Byte/Word mode switchable(支持byte/Word两种模式)
-2,097,152 x8 / 1,048,576 x16 (2M*8bit /1M*16bit):文本使用的是1M*16bit,后面会在原理图上说明。
• 支持电压
- Vcc2.7 to 3.6 volt for read, erase, and program operations
•Support Common Flash Interface (CFI) (支持CFI)
•Ready/Busy# (RY/BY#) Output
-Provides a hardware method of detecting program and erase operation completion (提供硬件检测编码或擦除)
•Hardware Reset (RESET#) Input
-Provides a hardware method to reset the internal state machine to read mode(提供硬件重启)
Thememory array is divided into 32 equal 64 Kilo byte blocks(分成了32块64Kbit的块)
Thesoftware algorithm used for this device also adheres to the JEDEC standard forsingle power supply devices.(软件算法支持jedec标准)
而下面我们介绍硬件的引脚图,并对引脚进行说明:
符号 |
引脚名 |
A0~A19 |
地址引脚 |
Q0~Q14 |
数据引脚 |
Q15/A-1 |
Q15(Word模式:两字节模式)/LSB 地址(Byte模式:单字节模式) |
CE# |
(片选输入使能) |
WE# |
写输入使能 |
BYTE# |
Word/Byte 选择输入 |
RESET# |
硬件重启引脚/扇区保护不锁定 |
OE# |
输出使能 |
RY/BY# |
就绪/忙输出 |
VCC |
电源正极(2.7V~3.6V) |
GND |
电源地 |
WP#/ACC |
硬件写保护/加速引脚 |
NC |
不连接 |
而该nor芯片与S3C2440的接线图为:
看完这个接线图可能会有读者会问:为什么S3C2440的地址1引脚与nor芯片的地址0相连,地址1和地址2相连。。。。以此下去S3C2440的地址20和nor芯片的地址19相连?
要回答这个问题我们就要从S3C2440的数据传输结构讲起,S3C2440是以byte(8bit)为单位来传输数据的。而我们可以看到上图中nor芯片是以16bit(2byte)的形式传递数据的,这样就造成S3C2440所传递的地址0和地址1的值对应于nor中地址0的值,而S3C2440所传递的地址2和地址3的值对应于nor中地址1的值,这样就造成S3C2440的地址<<1 = nor地址中的值。所以就造成S3C2440中地址0不去接,而直接用地址1接nor的地址0.
或者我引用我在网上看到的一个很好的解释:为什么Nor Flash的地址线A0是接在2440的LADDR1上?
因为NorFlash的数据共有16位,也就是每个地址保存了2B数据,而我们的2440每个地址是保存的1B数据,
比如:
当2440访问0X00地址时,就会读取到Nor上0地址的2B数据,然后2440的内存控制器会根据0x00来找到低8位字节,并返回给CPU,
当2440访问0x01地址时,由于2440的LADDR0线未接,所以还是访问Nor的0地址上的2B数据,然后内存控制器会根据0x01来找到高8位字节,并返回给CPU
不过上面的介绍您是否看到懂,但是在S3C2440手册中对于16位ROM设备的接线他是有介绍的:
手册规定16位ROM就应该这样接。如果您实在理解不了,您只要记住就好了。
而对于问题:为什么我们的地址线是从A0到A19一共有20条?
那是因为我们的芯片的大小为1M*16,而1M=2^20,所以通过20条地址线加16条数据线我们就可以访问到芯片的任何位置的数据了。
在2440中是通过硬件开关来设置OM0为Nand启动还是Nor启动,如下图所示:
通过上面两幅电路图我们知道OM1是一直接地的,所以:
对于nand启动:OM0接地,nand flash的开始4KB会自动地被加载到2440内置的SRAM的“steppingstone”,就可以直接读写
对于nor启动:OM0接高,2440访问的内存就是nor flash,可以直接读,但是不能直接写
像上面说的那样nor是一种ROM可以像内存一样直接通过地址读数据,却不能随便的写,而要想对nor进行读写就要通过特殊的命令了。下面是命令表:
本芯片为MX29LV160DT:所以设备ID为: 22C4
同时由于本芯片支持CFI,所以我们可以通过查询CFI获得设备的操作特征,架构,以及供应商特有的信息如:ID信息,内存大小,byte/word设置,操作电压和这个设备的时间信息。而CFI对应的命令为:
我们后面的驱动程序会讲到通过查询CFI获得的芯片信息来确定芯片的驱动。当然这都是后话了。我们讲完CFI我们就应该讲一下我们读写芯片时所涉及到的时序问题了:
下面我们先讲写命令时序图:
为了写一个命令到设备中,系统要将WE#和CE#设为低电平,而OE#设为高电平。在一个命令周期中,当CE#和WE#的最后一个下降沿时所有的地址值被锁存,而当CE#和WE#的第一个上升沿时所有的数据被锁存。
接下来我们讲: 读数据在存储设备上电或者重启后他会自动进入读序列状态。如果微控制器想要读存储在序列中的数据,他必须将CE#(设备片选引脚)和OE#(输出控制引脚)设为低电平,同时输入想要读的数据的地址。经过一段时间的读周期后,想要被读的值就显示到输出引脚,来供微处理器读取。如果CE#或者OE#被设为高,输出的将是tri态,同时在输出引脚将没有数据展现。
当存储设备完成嵌入式操作后(自动擦除或者编程),他将自动切换到读序列状态,这时,设备的任何地址的数据都可以被读取。而如果设备在擦除操作时收到了擦除悬挂的命令后,擦除操作将要暂停,但暂停时间不会超过Tready1,暂停的这段时间之后,设备将会自动回到读序列状态。这个时候,可以读存储在设备中的任意地址的数据,除了被擦除的扇区中。在擦除悬挂这段期间,如果用户想要读取存储在被擦除扇区中的数据,设备将输出状态值到输出端。相似的,在擦除悬挂期间如果发出编码命令后,编码完成后,系统同样可以读设备任何地方的值,除了被擦除的地方。
在以下两种情况下可以发送重启命令以读取数据:
1. 在编码或者擦除操作时,编码或者擦除错误而造成Q5为高时。
2. 设备在自动选择模式或者CFI模式时。
而现在我们通过2440开发板的uboot来体验一下nor的操作,好让我们对nor有更清楚的认识(使用前开发板设为nor启动进入uboot)。
而在操作前先介绍一下要用到的uboot中的命令:
md(memory display)[.b(byte) .w(word) .long(4byte)] [地址] (次数)
mw(memory write) [.b(byte) .w(word) .long(4byte)] [地址] [数据]
,其中"[]"中的内容为必填项,而“()”中的内容为选填项
1. 读数据
md.b 0 1 //读0地址一字节, 读一次
2. 读ID
NOR手册上:往地址555H写AAH
往地址2AAH写55H
往地址555H写90H
读0地址得到厂家ID: C2H
读1地址得到设备ID: 22DAH或225BH
退出读ID状态: 给任意地址写F0H
UBOOT的操作 (2440的A1接到NOR的A0,所以2440发出(555h<<1), NOR才能收到555h这个地址 ):
往地址AAAH写AAH mw.w aaa aa
往地址554写55H mw.w 554 55
往地址AAAH写90H mw.w aaa 90
读0地址得到厂家ID: C2H md.w 0 1
读2地址得到设备ID: 22DAH或225BH md.w 2 1
退出读ID状态: mw.w 0 f0
3. NOR有两种规范, jedec, cfi(common flash interface)
读取CFI信息
NOR手册:
进入CFI模式 往55H写入98H
读数据: 读10H得到0051
读11H得到0052
读12H得到0059
读27H得到容量
UBOOT的操作
进入CFI模式 往AAH写入98H mw.w aa 98
读数据: 读20H得到0051 md.w 20 1
读22H得到0052 md.w 22 1
读24H得到0059 md.w 24 1
读4EH得到容量 md.w 4e 1
退出CFI模式 mw.w 0 f0
4. 写数据: 在地址0x100000写入0x1234
直接写:
md.w 100000 1 // 得到ffffmw.w 100000 1234
md.w 100000 1 // 还是ffff
NOR手册:
往地址555H写AAH
往地址2AAH写55H
往地址555H写A0H
往地址PA写PD
UBOOT的操作
往地址AAAH写AAH mw.w aaa aa
往地址554H写55H mw.w 554 55
往地址AAAH写A0H mw.w aaa a0
往地址0x100000写1234h mw.w 100000 1234
上面就是我所介绍的nor硬件的全部,而关于下节我会介绍nor中的驱动层次。