首先申明我用的NandFlash的型号是K9K8G08U0B,这里不做这款NandFlash芯片硬件结构的分析,只是分析NandFlash初始化的时候要配置NFCONF寄存器,这里涉及到这个寄存器中的三个参数,分别是TACLS,TWRPH0,TWRPH1,这三个参数关系到这款NandFlash的一个基本的时序问题。之前一直没有仔细研究过这么一段NandFlash的初始化函数,我先把这个子函数的代码贴出来:
static void NF_Init(void) { GPACON = (GPACON & ~(0x3f<<17)) | (0x3f<<17); //设置芯片引脚 //TACLS=1、TWRPH0=2、TWRPH1=0,8位IO NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4) | (0<<0); //非锁定,屏蔽nandflash中断,初始化ECC及锁定main区和spare区ECC,使能nandflash片选及控制器 NFCONT =(0<<13) | (0<<12) | (0<<10) | (0<<9) | (0<<8) | (1<<6) | (1<<5) | (1<<4) | (1<<1) |(1<<0); }
这段代码来自http://blog.csdn.net/zhaocj/article/details/5795254此链接,是赵春江老师的博客,个人觉得写得非常不错。
第一句代码,配置芯片的引脚,一开始我看赵老师的博客,给这句代码这么注释,我也一头雾水,今天通过一个高中的同桌给我分析的这时序问题,偶然发现第一句代码,注释成“设置芯片引脚”,现在能看懂了,哈哈,我这里顺便解释一下,看到s3c2440A的芯片手册的281页,发现是配置GPA17,GPA18,GPA19,GPA20,GPA21,GPA22分别为CLE引脚,ALE引脚,nFWE引脚,nFRE引脚,nRSTOUT引脚,nFCE引脚,这里我说的太啰嗦了,结合下面的图片,可以理解成,向寄存器GPACON的17位到22位这中间的6位分别都写1,不要让这几位配置成output(输出)引脚,你要使用NandFlash,引脚必须这么配置呀,对照着下面的图片,可以理解一下:
《嵌入式Linux应用开发》里没有写这么一句,其实也没有多大关系,因为复位以后,寄存器GPACON的默认值就是0xffffffff,所以不用写,不过基于程序的严谨性,我觉得还是写写为妙。至于这里CLE引脚,ALE引脚,nFWE引脚,nFRE引脚,nRSTOUT引脚,nFCE引脚是什么东西,就是NandFlash的原理图和s3c2440A芯片连接的状态图了,把NandFlash的原理图贴出来就明白了:
CLE表示命令锁存使能,高电平有效;CE表示芯片使能,上面加了一个横杆,表示低电平有效;RE同样加了横杆,表示读使能,低电平有效等等;这些为后面的时序分析做铺垫了。
讲了半天,只是说解释了第一句代码,想必你已经看得不耐烦了,不用急,下面分析第二句代码:
NFCONF为NandFlash的配置寄存器,里面配置TACLS,TWRPH0,TWRPH1这三个值。
看了赵春江老师博客里对三个值是这么解释的:“NFCONF主要用到了TACLS、TWRPH0、TWRPH1,这三个变量用于配置nandflash的时序。s3c2440的数据手册没有详细说明这三个变量的具体含义,但通过它所给出的时序图,我们可以看出,TACLS为CLE/ALE有效到nWE有效之间的持续时间,TWRPH0为nWE的有效持续时间,TWRPH1为nWE无效到CLE/ALE无效之间的持续时间,这些时间都是以HCLK为单位的(本文程序中的HCLK=100MHz)。通过查阅K9F2G08U0A的数据手册,我们可以找到并计算该nandflash与s3c2440相对应的时序:K9F2G08U0A中的tWP与TWRPH0相对应,tCLH与TWRPH1相对应,(tCLS-tWP)与TACLS相对应。K9F2G08U0A给出的都是最小时间,s3c2440只要满足它的最小时间即可,因此TACLS、TWRPH0、TWRPH1这三个变量取值大一些会更保险。在这里,这三个值分别取1,2和0。”引用的话我先用红色标记一下,其实对于一个软件工程出生的我来说,看懂这么一大段,还是有点吃力的,先把时序相关的原理图晒出来:
(注:上图来自s3c2440A的216页,把它称为图a)
(注:上图来自K9K8G08U0B数据手册的24页,把它称为图b)
首先解释一下HCLK是系统的运行的时候主频,因为我用的开发板是mini2440arm9的,主频最快达到400MHz,所以,我可以设置HCLK为100MHz,所以一个时钟周期是10ns,这里算出这里的时钟周期在后面是有用的。接下来看图a的第二条时序(CLE/ALE),这个时序表示的意思是命令或地址锁存使能,高电平有效,所以当CLE或者ALE发出一个高电平的时候,对应表示使能了命令锁存使能或者使能了地址锁存器;第三条时序(nWE)这个表示的意思是写使能,低电平有效;由上面的分析得首先CLE或者ALE电平被拉高(有效),接着nWE被拉低(有效),之间的时间差为TACLS,再看图b,图b中的那句英文Command
Latch cycle(命令持续周期),可以看出这是一个发送命令的时序图,发送命令分为两步,首先使能CLE(这时你可以看到ALE是低电平并没有被使能),NandFlash告诉s3c2440A说:我现在要发送命令给你了,第二步,发送什么命令,由WE来控制,低电平的时候表示准备发送命令的具体内容了。所以上面TACLS=tcls-twp,,,因为tcls和twp在芯片中都有一个固定的最小时间的可以参考下面的表格:
(注:上图为表1)
根据上面表格,可以看出tcls和twp持续时间的最小值都是12ns,所以TACLS的最小时间可以为0,就是你在使能CLE的同时就可以使能WE了,理论上是可以这样。
所以寄存器NFCONF的13和12位可以配置成0,也就是TACLS的值可以为0,不过寄存器的默认值是设置为01的,即TACLS的值为01更加保险吧,中间各一个时钟周期(10ns)更安全吧。
对应的TWRPH0,分析要结合图b中的CLE中的tCLH,tCLH时间表示的是CLE使能命令至少要持续tCLE纳秒的时间,才会使使能信号有效,所以这里设置TWRPH0的值为2,再加上上图中 的1就可以分析出现在Duration的时间为3倍的时钟周期,也就是30ns,对应图b,如果TWRPH1的值写0的话,则TWRPH1的Duration时间也就是tCLH的时间为10ns,大于5ns,满足了一个条件;还可以分许出tCLS为40ns,大于最小要求12ns了,满足了条件2;最后这里的twp为30ns,大于12ns,满足条件3,所以到这里时序就配置好了。
写到凌晨2点多终于可以结束了,还是感谢高中的同桌,学电子的,为我耐心解答,下面你再看看上面红色的那段话,是不是又有重新的体会呢?