于nor flash相比,nand flash的容量要大许多,nand 不同于nor ,其采用i/o接口只能采取顺序访问,s3c2440不仅具有nandflash的接口,而且还可以利用某些机制实现直接从nandflash启动并运行程序。相对于norflash,它具有一些优势,但它的一个劣势是很容易产生坏块,因此在使用nandflash时,往往要利用校验算法发现坏块并标注出来,以便以后不再使用该坏块。nandflash没有地址或数据总线,如果是8位nandflash,那么它只有8个IO口,这8个IO口用于传输命令、地址和数据。nandflash主要以page(页)为单位进行读写,以block(块)为单位进行擦除。每一页中又分为main区和spare区,main区用于正常数据的存储,spare区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等。
NANDFLASH是以页为单位写,以块为单位来擦除,那么它们的区别就在这个上面:
1Gb 为大页 page=2048Kb BLOCK=128K
512Mb 为小页 page=512byte BLOCK=16K
一般情况下,对于小页的nand falsh读写只能按照以也为单位进行读写,但是对于K9F2G08R0A是支持按字节读取的。
刚才上面有提到ECC校验,ECC是“Error Correcting Code”的简写,中文名称是“错误检查和纠正”,ECC是每256个字节生产一个24位的值。这样可以看出来,大页需要每一页需要8个ECC 小页每页只需要2个ECC。
NANDFLASH是这样利用ECC进行检测的,NANDFLASH在写的时候会生成一个原始的ECC值保存在页的SPARE区,当要读页时也会生产一个ECC值,会跟SPARE的值进行异或比较,看结果是否为0,在工程开发中假如在大页换小页的时候,一定要修改这个算法,相反也是。
一般情况下,由于nand的价格优势,用于会把启动代码放到nand 里面,而把一些主要运行的代码放到nor里面去执行。其实,三星公司是nandflash的供应商,所以2440对其的支持也就不足为怪了,但是nand flash只能按照页来读取,并且nand flash很容易出错,既然要对nand支持就要解决这两个问题,三星公司是这么做的,在2440内部装备了一块称为Steppingstone大小为4k字节的SRAM,在2440启动之初,系统会自动把nand的前4k字节的代码拷贝到Steppingstone,然后去Steppingstone执行这4K字节的代码,通过这4K字节的代码用户可以把nand 4k后面的代码拷贝到sdram,然后条状到sdram中去执行程序,这一过程的前半部分可以看下图来理解;为了解决nand存取数据送一出错的问题,nand支持硬件的ECC,通过ECC来保证数据的准确性。