转载请注明出处:http://blog.csdn.net/charistain_huang
文章中有什么不正确的地方恳请请各位网友指点
********************************************************
*****作者:黄仁军 *******
*****联系email:957626485@qq.com *******
********************************************************
1.Nand flash以page为单位进行读写,以block为单位进行擦除,没页分为main区和spare区,main区用于存放正常的数据,spare区用于存放一些附加信息
2.S3c2440 支持从Nand 启动是因为内部有一个叫做Steppingstone的SRAM buffer,当启动的时候,nand 的前4k的将会代码将被拷贝到steppingstone中执行,注意前4k代码是不会经过ECC校验的,所以必须确保这些代码的准确
3.对nand的操作都是通过使用命令来实现,有的操作只要一个命令就可以完成,而有的需要两个命令才能完成,下面是K9F1G08U0B的命令表:
4.关于TACLS,TWRPH0,TWRH1几个参数的数值问题:
从下面的时序图不难看出这几个参数的意思,在此就不赘述。
图1 (s3c2440)
图2(K9F1G08U0B)
比较上面两个时序图,我们发现,TWRPH0 即为K9F1G08U0B 中的twp, TWRH1 为tCLH
TACLS为tcls – twp,K9F1G08U0B的手册给出了这些参数的最小时间,如图
都是以ns为单位的。Nand flash 控制器使用的是HCLK ,此时为100MHZ。一个周期为10ns。给本例中我们设置:TACLS为1,TWRPH0为2,TWRH1为0;只要注意设置大于上面的最小值就ok了。
6.ECC校验编程:由于使用软件的方法进行ECC校验比较复杂,S3C2440中自带了硬件产生ECC校验,可以通过NFCONT的[5]和[6]位来分别开启硬件ECC产生器,如果是8bit的nand flash接口将产生4个字节的main 区 ECC 校验码和2个字节的spare区 校验码,分别存在NFMECCD和NFSECCD中,当然前提是开启了对应区的ECC发生器。具体可以参考2440的手册P220.下面是编程ECC的过程:
(1)写NFCONT[4]为1初始化ECC 编解码器,写NFCONT[5]为0解锁main区ECC发生器
(2)当读写玩数据时写NFCONT[5]为1来锁定ECC防止被改变
(3)通常用户会将main区产生的ECC校验码写到spare区,这些数据和NFMECC0/1中的数据是相同的。本例中我们约定每一页的spare区的第0个地址到第3个地址存储main区ECC,第4个地址和第5个地址存储spare区ECC
(4)硬件自动产生的ECC会自动保存在NFMECC中,而NFMECCD0/1中的数据需要用户自己写入,当放入数据后,系统会自动比较NFMECC0/1和NFMECCD0/1的内容,这样就实现了ECC码的校验
(5) 最后我们就可以通过读取NFESTAT0/1(因为K9F1G08U0B是8位IO口,因此这里只用到了NFESTAT0)中的低4位来判断读取的数据是否正确,其中第0位和第1位为main区指示错误,第2位和第3位为spare区指示错误
下面是核心代码: