块设备驱动程序之nandflash——基础知识

我们先来看一下原理图:
块设备驱动程序之nandflash——基础知识_第1张图片
 
我们先来分析一下这个原理图:
LDATA0——LDATA7:既传输数据,也传输地址,还传输命令。那么如何区分传输的是什么呢?不要担心,下面会说到控制引脚
RnB:读写nandflash的状态标志位,0表示读写完成了,1表示还在忙。
CLE:当CLE为高电平时表示传输的是命令
ALE:当ALE为高电平时表示传输的是地址,当CLE和ALE都为低电平时表示传输的是数据,这就区分开了命令、地址和数据。
nFWE:写使能
nFRE:读使能
nFCE:片选信号
原理图的引脚我们是清楚了,但是我们应该如何去操作nandflash呢?我们通过nandflash的芯片资料中的读操作时序图我们可以看出读nandflash的步骤:
1、发命令:
(1)选中芯片: nFCE=0
(2)CLE设为高电平 
(3)在DATA0——DATA1上输出命令值:00h
(4)发出一个写脉冲: nFWE下降沿命令被锁存
2、写地址:
(1)选中芯片: nFCE=0
(2)ALE设为高电平
(3) 在DATA0——DATA1上输出地址值:这个地址是自己规定的
(4)发出写脉冲
3、发命令:
(1)选中芯片: nFCE=0
(2)CLE设为高电平 
(3)在DATA0——DATA1上输出命令值:30h
(4)发出一个写脉冲: nFWE下降沿命令被锁存
4、读数据:
(1)选中芯片
(2)发出读脉冲
(3)读DATA0~DATA7的数据
我们可以看出,读nandflash的时序还是蛮麻烦的,那么我们具体操作的时候是否需要把每个时序都搞清楚呢?其实没有必要,我们的cpu里面集成了nandflash控制器,我们只需要将命令、地址、数据写入相应的寄存器里面,就能够发送出去,那些时序的东西,nandflash控制器会帮我们做好的。 那么我们的读操作就变得很简单了:
1、选中nandflash,这通过配置NFCONT寄存器来实现
2、00h写入命令寄存器:NFCMMD=0x00
3、把地址写入地址寄存器:NFADDR,有效位是8位
4、30h写入命令寄存器: NFCMMD=30
5、从数据寄存器读数据:val=NFDATA 

我们可以先用UBOOT来体验NAND FLASH的操作:
1. 读ID

                                                  S3C2440                 u-boot 
选中                                          NFCONT的bit1设为0   md.l 0x4E000004 1; mw.l 0x4E000004 1
发出命令0x90                           NFCMMD=0x90         mw.b 0x4E000008 0x90 
发出地址0x00                           NFADDR=0x00         mw.b 0x4E00000C 0x00
读数据得到0xEC                      val=NFDATA          md.b 0x4E000010 1
读数据得到device code            val=NFDATA          md.b 0x4E000010 1
          0xda
退出读ID的状态                        NFCMMD=0xff         mw.b 0x4E000008 0xff

具体操作:
1、进入uboot
2、以4字节显示 0x4E000004地址处的数据: md.l 0x4E000004 1,这里的1表示显示1个4字节的数据。
      显示为:4e000004: 00000003,我们看到  NFCONT寄存器的倒数第二位为1,应该将它设为0才能选通它。
3、将  NFCONT 倒数第二位写为0 mw.l 0x4E000004 1
4、 发出命令0x90: mw.b 0x4E000008 0x90
5、 发出地址0x00: mw.b 0x4E00000C 0x00
6、 读数据得到0xEC: md.b 0x4E000010 1,1表示读一个数据
7、 读数据得到device code---->0xda: md.b 0x4E000010 1
8、 退出读ID的状态: mw.b 0x4E000008 0xff

2、 读内容: 读0地址的数据

使用UBOOT命令:
nand dump 0
Page 00000000 dump:
        17 00 00 ea 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5
上面nand dump 0是uboot里面封装好的一个命令,那我们能否用一些最基本的命令来实现这个读操作呢?答案是肯定的:

选中                           NFCONT的bit1设为0   md.l 0x4E000004 1; mw.l 0x4E000004  1
发出命令0x00                   NFCMMD=0x00         mw.b 0x4E000008 0x00 
发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00
发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00
发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00
发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00
发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00
发出命令0x30                   NFCMMD=0x30         mw.b 0x4E000008 0x30 
读数据得到0x17                 val=NFDATA          md.b 0x4E000010 1
读数据得到0x00                 val=NFDATA          md.b 0x4E000010 1
读数据得到0x00                 val=NFDATA          md.b 0x4E000010 1
读数据得到0xea                 val=NFDATA          md.b 0x4E000010 1
退出读状态                         NFCMMD=0xff         mw.b 0x4E000008 0xff

我们可能会一些疑问:nandflash是256M的,28位地址就可以对它进行完全的寻址,一个地址周期可以传送8位地址,那么4个地址周期也就够了呀!为什么要用5个地址周期呢?要知道,这些东西是cpu上面的,cpu上面可以挂接更大的nandflash啊!不一定就是256M的嘛!很傻的一个问题
哦!自我嘲笑一下!

你可能感兴趣的:(块设备驱动程序之nandflash——基础知识)