微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 对S3C2440读取NAND Flash的总结

对S3C2440读取NAND Flash的总结

时间:11-09 来源:互联网 点击:

读命令有两个,分别是Read1,Read2其中Read1用于读取DataField的数据,而Read2则是用于读取SpareField的数据。对于NandFlash来说,读操作的最小操作单位为Page,也就是说当我们给定了读取的起始位置后,读操作将从该位置开始,连续读取到本Page的最后一个Byte为止(可以包括SpareField)

NandFlash的寻址
NandFlash的地址寄存器把一个完整的NandFlash地址分解成ColumnAddress与PageAddress.进行寻址。

ColumnAddress:列地址。ColumnAddress其实就是指定Page上的某个Byte,指定这个Byte其实也就是指定此页的读写起始地址。

PaageAddress:页地址。由于页地址总是以512Bytes对齐的,所以它的低9位总是0。确定读写操作是在Flash上的哪个页进行的。

Read1命令

当我们得到一个NandFlash地址addr时我们可以这样分解出ColumnAddress和PageAddress
column_addr=src_addrQ2;//columnaddress
page_address=(src_addr>>9);//pageaddress

也可以这么认为,一个NandFlash地址的src_addr[7,0]是它的column_addr,addr[25,9]是它的PageAddress。(注意地址位src_addr[8]并没有出现,也就是addr[8]被忽略,在下面你将了解到这是什么原因)

Read1命令的操作发送完读命令00h或01h(00h与01h的区别请见下文描述)之后将分4个Cycle发送参数,1st.Cycle是发送ColumnAddress。2nd.Cycle,3rd.Cycle和4th.Cycle则是指定PageAddress(每次向地址寄存器发送的数据只能是8位,所以17位的PageAddress必须分成3次进行发送。

Read1的命令里面出现了两个命令选项,分别是00h和01h。这里出现了两个读命是否令你意识到什么呢?是的,00h是用于读写1sthalf的命令,而01h是用于读取2ndhalf的命令。现在我可以结合上图给你说明为什么K9F1208U0B的DataField被分为2个half了。

如上文我所提及的,Read1的1st.Cycle是发送ColumnAddress,假设我现在指定的ColumnAddress是0,那么读操作将从此页的第0号Byte开始一直读取到此页的最后一个Byte(包括SpareField),如果我指定的ColumnAddress是127,情况也与前面一样,但不知道你发现没有,用于传递ColumnAddress的数据线有8条(I/O0-I/O7,对应addr[7,0],这也是addr[8]为什么不出现在我们传递的地址位中),也就是说我们能够指定的ColumnAddress范围为0-255,但不要忘了,1个Page的DataField是由512个Byte组成的,假设现在我要指定读命令从第256个字节处开始读取此页,那将会发生什么情景?我必须把ColumnAddress设置为256,但ColumnAddress最大只能是255,这就造成数据溢出。正是因为这个原因我们才把DataField分为两个半区,当要读取的起始地址(ColumnAddress)在0-255内时我们用00h命令,当读取的起始地址是在256-511时,则使用01h命令.假设现在我要指定从第256个byte开始读取此页,那么我将这样发送命令串。
column_addr=256;
NF_CMD=0x01;从2ndhalf开始读取
NF_ADDR=column_addr&0xff;1stCycle
NF_ADDR=page_address&0xff;2nd.Cycle
NF_ADDR=(page_address>>8)&0xff;3rd.Cycle
NF_ADDR=(page_address>>16)&0xff;4th.Cycle

NF_CMD=0x30;

事实上,当NF_CMD=0x01时,NANDFlash地址寄存器中的第8位(A8)将被设置为1(如上文分析,A8位不在我们传递的地址中,这个位其实就是硬件电路根据01h或是00h这两个命令来置高位或是置低位),这样我们传递column_addr的值256随然由于数据溢出变为1,但A8位已经由于NF_CMD=0x01的关系被置为1了。这8个位所表示的正好是256,这样读操作将从此页的第256号byte(2ndhalf的第0号byte)开始读取数据。

在对NANDFlash进行任何操作之前,NANDFlash必须被初始化。向NandFlash的命令寄存器和地址寄存器发送完以上命令和参数之后,我们就可以从rNFDATA寄存器(NandFlash数据寄存器)读取数据了.
我用下面的代码进行数据的读取.
for(i=column_addr;i<512;i++)
{
*buf++=NF_RDDATA();
}

每当读取完一个Page之后,数据指针会落在下一个Page的0号Column(0号Byte).

存储操作特点:
1.擦除操作的最小单位是块。
2.NandFlash芯片每一位(bit)只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前要一定将相应块擦除(擦除即是将相应块得位全部变为1).
3.OOB部分的第六字节(即517字节)标志是否是坏块,如果不是坏块该值为FF,否则为坏块。
4.除OOB第六字节外,通常至少把OOB的前3个字节存放NandFlash硬件ECC码(关于硬件ECC码请参看Nandflash控制器一节).

重要芯片引脚功能
I/O0-I/O7:复用引脚。可以通过它向nandflash芯片输入数据、地址、nandflash命令以及输出数据和操作状态信息。
CLE(CommandLatchEnable):命令锁存允许
ALE(AddressLactchEnable):地址锁存允许
-CE:芯片选择
-RE:读允许
-WE:写允许
-WP:在写或擦除期间,提供写保护
R/-B:读/忙输出

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top