S3C2440裸机实验(6) ----NAND FLASH

时间:2022-04-22 05:06:44

     转载请注明出处:http://blog.csdn.net/charistain_huang      
     文章中有什么不正确的地方恳请请各位网友指点
********************************************************
*****作者:黄仁军                                                                     *******
*****联系email:957626485@qq.com                                      *******
********************************************************

1.Nand  flashpage为单位进行读写,以block为单位进行擦除,没页分为main区和spare区,main区用于存放正常的数据,spare区用于存放一些附加信息

2S3c2440 支持从Nand 启动是因为内部有一个叫做SteppingstoneSRAM buffer,当启动的时候,nand 的前4k的将会代码将被拷贝到steppingstone中执行,注意前4k代码是不会经过ECC校验的,所以必须确保这些代码的准确

3.nand的操作都是通过使用命令来实现,有的操作只要一个命令就可以完成,而有的需要两个命令才能完成,下面是K9F1G08U0B的命令表:

  S3C2440裸机实验(6) ----NAND FLASH

 S3C2440裸机实验(6) ----NAND FLASH

4.关于TACLS,TWRPH0,TWRH1几个参数的数值问题:

从下面的时序图不难看出这几个参数的意思,在此就不赘述。

 

 

 

                                                             1 (s3c2440)

S3C2440裸机实验(6) ----NAND FLASH

                                                                                        2(K9F1G08U0B)

比较上面两个时序图,我们发现,TWRPH0 即为K9F1G08U0B 中的twp TWRH1 tCLH

TACLStcls – twpK9F1G08U0B的手册给出了这些参数的最小时间,如图

S3C2440裸机实验(6) ----NAND FLASH

 

都是以ns为单位的。Nand flash 控制器使用的是HCLK ,此时为100MHZ。一个周期为10ns。给本例中我们设置:TACLS1TWRPH02TWRH10;只要注意设置大于上面的最小值就ok了。

 

6.ECC校验编程:由于使用软件的方法进行ECC校验比较复杂,S3C2440中自带了硬件产生ECC校验,可以通过NFCONT[5][6]位来分别开启硬件ECC产生器,如果是8bitnand flash接口将产生4个字节的main ECC  校验码和2个字节的spare 校验码,分别存在NFMECCDNFSECCD中,当然前提是开启了对应区的ECC发生器。具体可以参考2440的手册P220.下面是编程ECC的过程:

         (1)NFCONT[4]1初始化ECC 编解码器,写NFCONT[5]0解锁mainECC发生器

(2)当读写玩数据时写NFCONT[5]1来锁定ECC防止被改变

(3)通常用户会将main区产生的ECC校验码写到spare区,这些数据和NFMECC0/1中的数据是相同的。本例中我们约定每一页的spare区的第0个地址到第3个地址存储mainECC,第4个地址和第5个地址存储spareECC

(4)硬件自动产生的ECC会自动保存在NFMECC中,而NFMECCD0/1中的数据需要用户自己写入,当放入数据后,系统会自动比较NFMECC0/1NFMECCD0/1的内容,这样就实现了ECC码的校验

(5) 最后我们就可以通过读取NFESTAT0/1(因为K9F1G08U0B8IO口,因此这里只用到了NFESTAT0)中的低4位来判断读取的数据是否正确,其中第0位和第1位为main区指示错误,第2位和第3位为spare区指示错误

 

 

下面是核心代码: