1、nand flash的初始化操作
(1.1)nand flash的初始化操作流程
(1.1.1)设初始化 置管脚
(1.1.2)初始化NFCONF寄存器
(1.1.3)初始化NFCONT寄存器
(1.2)初始化NFCONF寄存器分析
(1.2.1)在2440手册中,分析nand flash 控制器的命令/地址时序图,里面只涉及三个参数TACLS,TWRPH0,TWRPH1
/* HCLK=100MHz,也就是10ns
* TACLS: 发出CLE/ALE之后多长时间才发出nWE信号, 从NAND手册可知CLE/ALE与nWE可以同时发出,所以TACLS=0
* TWRPH0: nWE的脉冲宽度, HCLK x ( TWRPH0 + 1 ), 从NAND手册可知它要>=12ns, 所以TWRPH0>=1
* TWRPH1: nWE变为高电平后多长时间CLE/ALE才能变为低电平, 从NAND手册可知它要>=5ns, 所以TWRPH1>=0
*/
(1.2.2)nand flash 手册相应类似的时序图如下
TACLS,TWRPH0,TWRPH1对应的是tCLS-twp,twp,tCLH.这里tCLS和twp的最小值都为12ns(3.3V下),twp大于等于12ns,tCLH大于5ns
(1.2.3)参数对应的取值的表格
(1.3)初始化函数
/* 初始化NAND Flash */
void nand_init(void)
{
S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000;
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0
//初始化NFCONF寄存器(nand flash配置寄存器)
/* 设置时序 */
s3c2440nand->NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
//初始化NFCONT寄存器(nand flash控制寄存器)
/* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */
s3c2440nand->NFCONT = (1<<4)|(1<<1)|(1<<0);
/* 复位NAND Flash */
s3c2440_nand_reset();
}
2、nand flash 的复位操作
(2.1)nand flash的时序图
其中tRST在nand flash手册的定义为在复位命令FFH被写入nand flash 的命令寄存器后状态引脚RnB变为高电平的时间(也就是nand flash状态变为空闲的时间)
(2.2)归纳步骤如下
选中nand flash芯片
发出FFH命令
等待nand flash变为空闲状态
取消片选
(2.3)函数编写
void s3c2440_nand_reset(void)
{
s3c2440_nand_select_chip();
s3c2440_write_cmd(0xff); // 复位命令
s3c2440_wait_idle();
s3c2440_nand_deselect_chip();
}