1.NAND FALSH 介绍
我看来,NAND FLASH 在嵌入式系统中与pc上的硬盘的功能类似,用于保存系统运行过程中的各种数据。且可以在断电后继续保存。
例如:在s3c2440中将一个点灯程序烧写到NAND FLASH 中,下一次利用NAND FLASH启动,程序任然可以正常运行。
2.NAND FLASH硬件连接
由上图可发现:
- NAND FLASH只有LDATA0-LDATA7 这7条数据线,因此 命令、地
址、数据都通过8个I/O口输入/输出,这种形式减少了芯片的引脚个数,并使得系统很容易升级到更大的容量。写入命令、地址或数据时,都需要将WE#、CE#信号同时拉低。在WE#信号的上升沿被NAND Flash锁存;命令锁存信号CLE、地址锁存信号ALE用来分辨、锁存命令或地址。 - K9F1208U0M的64MB存储空间需要26位地址,因此以字节为单位方问Flash时需要4个地址序列:列地址、行地址的低位部分、行地址的高位部分。读/写页在父出命令后,需要4个地址序列,而擦除块在发出擦除命令后仅需要3个地址序列。
在使用NAND FLASH时,并不需要分别控制引脚,而是通过控制寄存器来实现上述功能
3. NAND FLASH 访问方法
NAND Flash 与S3C2440的连线比较少: 8个I/O引脚(IO0~IO7)、 5个使能信号(nWE、 ALE、CLE、nCE、nRE)、1个状态引脚(RDY/B)、 1个写保护引脚(nWP)。地址、数据和命令都是在这些使能信号的配合下,通过8个I/O引脚传输。写地址、数据、命令时,nCE、nWE信号必须为低电平,它们在nWE信号的上升沿被锁存。命令锁存使能信号CLE和地址锁存信号ALE用来区分I/O引脚上传输的是命令还是地址。
时序图如下所示:
上图为s3c2440发出命令时的时序图:
- ce变为低电平,使能NAND FLASH。
- CLE保持高电平,ALE变为低电平,通知即将传输的是命令。
- 通过I/O引脚传输命令。
- WE由定电平变为高电平时锁存。
传输地址与数据时操作与上述类似。对于时序大小的确定:
- 看2440芯片手册,确定能配置哪几个参数
- 在看外设手册,确定取值
- 计算
4. 相应的寄存器
查找芯片手册,确定使用的寄存器功能与设置方法。
-
1 .NFCONF:2440的NFCONF寄存器是用来设置NAND Flash的时序参数TACLS、TWRPH0、TWRPH1。配置寄存器的[3:0]是只读位,用来指示外部所接的Nand Flash的配置信息,它们是由配置引脚NCON,GPG13,GPG14和GPG15所决定的(比如说K9F2G08U0A的配置为NCON、GPG13和GPG14接高电平,GPG15接低电平,所以[3:0]位状态应该是1110)。
-
2.NFCONT:用来使能/禁止NAND Flash控制器、使能/禁止控制引脚信号nFCE、初始化ECC。它还有其他功能,在一般的应用中用不到,比如锁定NAND Flash。
-
3.NFCMMD:对于不同型号的Flash,操作命令一般不一样。参考前面介绍的K9F2G08U0A命令序列。
-
4.NFADDR:当写这个寄存器时,它将对Flash发出地址信号。只用到低8位来传输,所以需要分次来写入一个完整的32位地址。
-
5.NFDATA:只用到低8位,读、写此寄存器将启动对NAND Flash的读数据、写数据操作。
-
6.NFSTAT:只用到位0,用来检测NAND是否准备好。0:busy,1:ready。
5. 读NAND FLASH
- 如果程序小于4k,s3c2440从NAND FLASH启动后会自动将4k的内容复制到片内的“Steppingstone”的内部SRAM缓存。
- 如果程序大于4k,这时需要用到NAND FLASH ,将程序分为两部分,第一部分进行存储控制器的初始化,将后半部分的内容复制到SDRAM中,使其在外设SDRAM中执行。第二部分为实现程序设定的主体功能。
- 设置NFCONF与NFCONT
对于S3C2440。时间参数设为: TACLS=0, TWRPH0=3,TWRPH1=0。NFCONF 寄存器的值如下
NFCONF为0x300.
NFCONT寄存器的取值如下,表示使能NAND Flash控制器、禁止控制引脚信号nFCE、初始化ECC。
NFCONT = (1<<4) 1(1<<1)1(1<<0)
- 在操作NAND FLASH前,进行复位
NFCONT &= ~(1<<1) (发出片选信号)
NFCMD =0xff (reset命令)
然后循环查询NFSTAT位0,直到它等于1。
最后禁止片选信号,在实际使用NAND Flash时再使能。
NFCONTI- 0x2 (# it NAND Flash)
- 发出读命令
NFCONT&=~(1<<11) 发出片选信号
NFCMD=0 读命令
- 发出地址信号
NFADDR = (addr>>9) & 0xff;
NFADDR = (addr>>17) & 0xff;
NFADDR = (addr>>25) & 0xff;
NFADDR = addr & 0xff;
其中, 在数据手册中列出了地址操作。没有用到A8是因为当读命令为0时,A8=0;当读命令为1时,A8=1;