存储类芯片的操作步骤:
1、初始化 (初始化 时序支持芯片运行周期)
2、识别 (读取设备id 验证是否初始化成功物理芯片是否正常)
3、读取或写入操作
4、擦除操作
初始化操作:初始化时序,使能soc nand控制器
nand flash时序图:
soc时序图:
nand flash 书序图中参数取值范围
由上图可以分析出:
1、竖着看第一个图每个变化的时间对对齐,
1)cle 从低到高变化:
经过 tcls - twp 时间段后, we从高到低变化
2)ce 从高到低变化:
经过 tcs - twp 时间段后, we从高到低变化
3)ale从高到低变化:
经过 tals - twp 时间段后, we从高到低变化;
结合图三:
tcls 取值范围: min = 12ns max 无所谓
tcs取值范围: min = 20 ns max无所谓
twp取值范围: min = 12ns
tds取值范围: min = 12ns
tal取值范围: min = 12ns
从取值范围可以看出:
如果都取到最小值,那么:
tcls - twp = 0; tals - twp = 0;表示这些指令可以同时发出,发出CLE和WE间隔可以为0;
tcs - twp =5; 表示一定要先发出 CE信号,延时5ns在发出写信号;
由上面两个图观察:
锁相环时钟分频系数: 我设置的如下
FCLK : HCLK : PCLK = 400m : 100m : 50m
因此周期T = 1/HCLK = 1/100 S = 10ns TACLS 刚好是一个周期
图1,图2 分析:
TACLS 就是 发出写ALE之后多久发出写使能
故:TACLS (最小值) = tals - twp = 0;
TWRPH0 表示nWE拉低所持续的时间
故: TWRPH0(最小值) twp = 12ns ;
TWRPH1 表示 nWE拉高多久后 CLE拉低
故: TWRPH1 (最小值) = tclh = 5 ns ;
设置寄存器 NFCONF:
1、TACLS
duration 表示 设置参数反应所需时长, 也就是
duration = HCLK * TACLS = 1/100 秒 * TACLS = tals - twp >>>>>>>>>>>>> TACLS = 0
2、TWRPH0
duration = HCLK * TWRPH0 = 10 ns *( TWRPH0 + 1) >= 12ns >>>>>>>>>>> TWRPH0 = 1;
3、TWRPH1
duration = HCLK * TWRPH1 = 10 ns *( TWRPH1 + 1) >= 5ns >>>>>>>>>>> TWRPH1 =0;
于是有代码如下:
void nand_init()
{
#define NFCONF (*(volatile unsigned int *)(0x4E000000))
#define NFCONT (*(volatile unsigned int *)(0x4E000004))
/*设置NAND FLASH的时序*/
NFCONF = (0<<12) | (1<<8) | (0<<4);
/*使能NAND FLASH控制器,初始化ECC,禁止片选*/
NFCONT = (1<<4) | (1<<1) | (1<<0);
}
NFCONT:
NFCONT = (1<<4) | (1<<1) | (1<<0);
使能nand控制器;