NFCONF
配置寄存器主要是设置命令的锁存周期,根据下面2440的nand的时序,当WE在使能之前,CLE要先使能,等CLE稳定之后WE才能使能,然后等待一段时间才去拉低CLE .这里就有两个稳定的时间,分别是WE命令使能之前与之后,也就是建立时间与保持时间,就跟他们时间名的后缀一样,S->ser, H->hold
至于TACLS等的时间周期大小可以参照K9F2G08U0C(NAND FLASH).pdf芯片手册中时序
对比上面两个图我们可以得出结论
1.从CLE拉高到WE使能的这段时间,意思就是说CLE要使能一段时间,稳定后在WE使能
“TACLS”= tCLS - Twp
2.WE写周期时间:
“TWRPH0” = twp
3.CLE保持时间(WE无效后, CLE需要保持一段时间,使其能好好的锁存,即延长硬件的锁存动作(就是存储一段时间),如果WE上升沿后马上拉高CLE(锁存使能无效), 很可能数据就不能及时存入nandflash,造成存储丢失, 我们还可以看到命令在I/O总线上也要随着CLE停留而停留一段时间(tDH)
“TWRPH1” = tCLH
找到关系后, 通过nandflash数据手册可以找到这些时间的最小定义(即完成动作的最小时间,比如 tCLS的最小时间)
根据之前的计算,我们要满足TACLS >= 0ns,TWRPHO >= 12ns,TWROH1 >= 5ns,根据寄存器的配置信息,HCLK = 100M = 10ns, TACLS -> Duration = HCLK × TACLS, TWRPH0 -> Duration = HCLK × ( TWRPH0 + 1 ), TWRPH1->Duration = HCLK × ( TWRPH1 + 1 ), 所以三个配置参数为 0,1,0 就能够满足
配置寄存器最终取值:TACLS=0,TWRPH0=1,TWRPH1 = 0
NFCONT
InitECC [4] : 初始化ECC检验
Reg_nCE [1]:用来控制片选 (一般在读写一次的周期,都要进行片选信号的选定,取消选定的操作,目的是为了省电),初始化默认关闭,读取的 时候开启
MODE [0]: 用来控制flash是否能工作
控制寄存器默认取值:MODE=1,Reg_nCE=1,InitECC=1
NFCMMD
当要发送读取或者写命令时,直接往NFCMMD寄存器低八位(单字节)里写入命令值,其他位保留
NFADDR
跟NFCMMD寄存器一样,往低八位写入地址值就可以了
NFDATA
NFDATA字节的存储方式主要参考下表,以大端模式来讲解, 当传送一个字时,这时候存4个字节的数据, 0x12345678(大端, 内存低字节存高位) ,2440的nandflash是8位的, 所以先发送
0x78(1st [31:24]) –> 0x56(2nd [23:16]) –> 0x34(3nd [15:8]) –> 0x12(4th [7:0])。
NFCON
RnB [0] : 读取该位,判断nandflash判断是否处于空闲状态
上面就是所有的寄存器的设置, 当读取nandflash的页数据时,要参照nandflash的读顺序,下面就是读页的流程: 发送读命令00后,连续发5个地址,再发读命令30,然后判断是否空闲,最后读取数据