NAND Flash 在嵌入式系统中的地位与PC机上的硬盘是类似的。用于保存系统运行所必需的操作系统,应用程序,用户数据,运行过程中产生的各类数据,系统掉电后数据不会护丢失。现在的Flash主要有两咱,一种是NAND Flash 一种是Nor Flash。NOR Flash是由Intel公司于1988年发明的,用以代替EERPOM,NAND Flash由Toshiba 公司在19年发明的。
网上有很多介绍两者区别的文章,在此就不做介绍了,主要介绍关于NAND Flash的组织结构和编写程序的方法。
NAND Flash的寻址方式和NAND Flash的memory组织方式紧密相关。NAND Flash的数据是以bit的方式保存在 memory cell(存储单元)。一般情况下,一个cell中只能存储一个bit。这些cell以8个或者16个为单位,连成 bit line ,形成所谓的byte(x8)/word(x16),这就是NAND Flash的位宽。
这些Line会再组成Pape(页)。然后是每32个page形成一个Block,所以一个Block(块)大小是16k.Block是NAND Flash中最大的操作单元,其中的擦除操作是以Block为单位进行擦除的,而读写和编程是以page为单位进行操作的,并且读写之前必须进行flash的擦写。我们这里以三星K9F1208U0M的NAND Flash为例,它的大小是MB的。
1block = 32page
1page = 512bytes(datafield) + 16bytes(oob)
K9F1208U0B总共有4096 个Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes = 66 MB(故用烧录器将其内容全部读出,可保存为大小为67584kB的BIN文件,科系的代理商竟然说我的文件太大,故烧录时造成部分失败。。。。。,有理说不清了都!)
   但事实上每个Page上的最后16Bytes是用于存贮检验码用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为
4096 *(32 *512) = 671088 Bytes =  MB 
存储操作特点:
1.擦除操作的最小单位是块
2.Nand Flash芯片每一位只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前一定要将相应块擦除(擦除就是将相应块的位全部变为1
3 OOB部分的第六字节(即517字节)标志是否坏块,如果不是坏块该值为FF,否则为坏块
4 除OOB第六字节外,通常至少把OOB前3字节存放Nand Flash硬件ECC码
Columnaddr = addr % 512 // column address
Pageaddr = addr>>9 // page address
现在假设我要从Nand Flash中的第5000字节处开始读取1024个字节到内存的0x30000000处,我们这样调用read函数
NF_Read(5000, 0x30000000,1024);
我们来分析5000这个src_addr.
根据
column_addr=src_addr%512;
page_address=(src_addr>>9);
我们可得出column_addr=5000%512=392
page_address=(5000>>9)=9
column_addr=5000%512;
page_address=(5000>>9);
NF_CMD=0x01; //要从2nd half开始读取 所以要发送命令0x01
NF_ADDR= column_addr &0xff; //1st Cycle A[7:0]
NF_ADDR=page_address& 0xff
NF_ADDR=(page_address>>8)&0xff; //3rd.Cycle A[24:17]
NF_ADDR=(page_address>>16)&0xff; //4th.Cycle A[25]
我用下面的代码进行数据的读取.
for(i=column_addr;i<512;i++)
{
*buf++=NF_RDDATA();
}
每当读取完一个Page之后,数据指针会落在下一个Page的0号Column(0号Byte).
from:
