对存储芯片的编程,一般都有如下步骤:
- 初始化(对Nand Flash而言,就是初始化主控芯片的Nand Flash控制器)
- 识别(读取ID)
- 读(一般一次读一个页Page)
- 写(一般一次写一个页Page)
- 擦除(一般一次擦除一个块Block,一个块通常是64个页)
如果可以正确识别,即读取到正确的ID,那么说明我们的初始化步骤是正确的,并且Nand Flash芯片也是可以正常工作的。
下面开始第一步初始化,这一步主要是
- 设置Nand Flash的时序;
- 使能Nand Flash控制器;
先找到S3C2440芯片手册中Nand Flash的存储时序。
这里有三个时间参数,分别是TACLS,TWRPH0,TWRPH1。从时序图分析,TACLS为CLE/ALE拉高后对酒可以使能WE,TWRPH0为WE低电平(使能)的持续时间,TWRPH1则是WE拉高之后多久拉低CLE/ALE。 每款Nand Flash的上述时间可能是不同的,这需要根据对应的Nand Flash芯片的数据手册来设置。
在S3C2440芯片手册中搜索这三个参数,发现是在NFCONF寄存器中设置。
S3C2440开发板上搭载的Nand Flash控制芯片型号为K9F2G08U0C,查找对应的芯片手册,搜索它的AC Timing Characteristics和时序图,可以获得上述参数的信息。
下面来分析这三个参数的设置。首先是TACLS,表示CLE/ALE拉高后多久可以使能WE,对比Nand Flash的时序图可以知道,这段时间为tCLS - tWP = 12 - 12 = 0ns;然后是TWRPH0,表示WE的使能持续时间,为tWP = 12ns;最后是TWRPH1,表示WE释放后过多久可以拉低ALE/CLE,为tCLH = 5ns。值得注意的是,Nand Flash芯片手册中的ALE和CLE的时间参数是相等的,时序也相同,可能是所有的Nand Flash芯片都遵循这个时序和设定吧。
计算完参数后,要把对应的参数写入寄存器中去,其中HCLK = 1000 / 100M = 10ns(1M=10^6)。所以TACLS设为0,TWRPH0要大等于12ns,所以TWRPH0设为1,TWRPH1要大等于5ns,所以TWRPH1设为0。
再修改一下寄存器的定义,命令,地址,数据,状态这四个寄存器,改为按字节操作。
这样,Nand Flash的时序就设置好了,接下来要使能Nand Flash控制器,使能是在NFCONT寄存器中设置,前面的锁和中断,ECC先不用管。
如下,bit0设为1表示使能Nand Flash控制器,bit1位Nand Flash的片选,这里我们没有操作Nand Flash,先设为1不使能,bit4为初始化ECC,之后我们会用到ECC,这里设为1初始化ECC。
最后,下面就是我们Nand Flash的初始化函数,设置了时序并且使能了控制器。