文章目录
1.硬件知识
1.1 如何传输地址信号?
DATA0 ~ DATA7
上既传输数据,又传输地址(复用)- ALE (Address Lock Enable)地址锁存允许信号
- 当ALE = 1时,传输地址
- 当ALE = 0时,传输数据
1.2 如何传输命令?
命令表
由NAND FLASH芯片手册可知,要操作NAND FLASH需要先发出命令
DATA0 ~ DATA7
上既传输数据,又传输地址,也传输命令- CLE (Command Lock Enable)地址锁存允许信号
- 当ALE = 1时,传输地址
- 当CLE = 1时,传输命令
- 当ALE = 0 & CLE = 0时,传输数据
1.3.NAND、NOR、SDRAM、DM900数据总线,如何互不干扰?
- 这些设备,访问之前必须通过片选CS引脚“选中”,没有选中芯片不会工作
1.4 给NAND烧写,如何判断烧写完成?
- 通过状态引脚
RnB
来判断:- 当高电平表示就绪(空闲)
- 当低电平表示正忙
2.如何操作NAND
NAND FLASH需要复杂的流程才能进行操作,由于S3C2440中有NAND FLASH控制器,只需要向相应的寄存器写入或读出数据即可,如下表
操作 | NAND FLASH | S3C2440 |
---|---|---|
发命令 | CS选中芯片 CLE 设置为高电平 在 DATA0~DATA7 上输出命令值 发出一个写脉冲 |
NFCMMD =命令值 |
发地址 | CS选中芯片 ALE 设置为高电平 在 DATA0~DATA7 上输出命令值 发出一个写脉冲 |
NFADDR =地址值 |
发数据 | CS选中芯片 CLE、ALE 设置为低电平 在 DATA0~DATA7 上输出命令值 发出一个写脉冲 |
NFDATA =数据值 |
读数据 | CS选中芯片 发出读脉冲 读 DATA0~DATA7 的数据 |
val=NFDATA |
2.1 读ID
- 选中:
NFCONT
寄存器bit1设为0
-
发出命令90H:
NFCMMD
=0x90 -
发出地址00H:
NFADDR
=0x00 -
读数据得到ECH:val=
NFDATA
-
读数据得到Device Code:val=
NFDATA
-
退出读ID的状态(复位):
NFCMMD
=0xFF
2.2 读内容
-
选中芯片:
NFCONT
寄存器bit1设为0 -
发出命令90H:
NFCMMD
=0x00 -
发出5个字节的地址位
for(i = 0;i<5;i++)
{
NFADDR = 0x00;
}
-
发出命令17H:
NFCMMD
=0x17 -
读数据:val=
NFDATA
-
退出读状态(复位):
NFCMMD
=0xFF
3.NAND初始化
初始化主控芯片NAND FLASH控制器
3.1 时序
不同NAND芯片,操作时序不同
NAND FLASH命令锁存周期图(时间参数由“时间特性表”可以得到)
NAND FLASH时间特性表
由上两图分析可得,S3C2440 NAND FLASH控制器时序时间
TACLS最小等于0ns;TWRPH0最小等于12ns;TWRPH1最小等于5ns
再由上图得到的结论:TACLS最小等于0ns;TWRPH0最小等于12ns;TWRPH1最小等于5ns
分别得到寄存器的值(如上图)
得到几条关键的信息:
- 1.CLE、ALE、WE信号可以同时发出
- 2.WE信号的持续时间(tWP)最小为12ns
- 3.WE信号释放后,ALE和CLE信号释放的最小时间为5ns
#define TACLS 0
#define TWRPH0 1
#define TWRPH1 0 //为了方便理解,时间定义为宏
/* 设置nand 时序 */
NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);
3.2 注意NAND是8位的
注意:因为这里的Nand Falsh的位宽是8位的,因此地址,命令、数据、状态 的读写只能以8位形式,因此需要重新设置一下读写的字节数:
3.3 NAND控制器使能、初始化ECC
- 1.NAND控制器使能
- 2.先禁止片选,避免误操作
- 3.初始化ECC编码器
/* 使能NAND FLASH控制器、禁止片选、初始化ECC */
NFCONT = (1<<4) | (1<<1) | (1<<0);