块设备驱动程序之nandflash——基础知识
发布时间:2020-12-15 07:07:56 所属栏目:百科 来源:网络整理
导读:我们先来看一下原理图: ? 我们先来分析一下这个原理图: LDATA0——LDATA7:既传输数据,也传输地址,还传输命令。那么如何区分传输的是什么呢?不要担心,下面会说到控制引脚 RnB:读写nandflash的状态标志位,0表示读写完成了,1表示还在忙。 CLE:当CLE
我们先来看一下原理图:
我们先来分析一下这个原理图:
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上输出命令值:00h
(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的嘛!很傻的一个问题
哦!自我嘲笑一下!
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |