全部博文(1293)
分类: LINUX
2011-03-24 00:01:51
1.正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。一般而言,
1block = 32page
1page = 512bytes(datafield) + 16bytes(oob 即out of band 带外数据.)
对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash的擦写,而擦写则是以一个block为单位的。同时必须提醒的是,512bytes理论上被分为1st half 和2sd half,每个half各占256个字节。
(1).Nand Flash的地址寄存器把一个完整的Nand Flash地址分解成Column Address与Page Address.进行寻址。
Column Address: 列地址。Column Address其实就是指定Page上的某个Byte,指定这个Byte其实也就是指定此页的读写起始地址。
Paage Address:页地址。由于页地址总是以512Bytes对齐的,所以它的低9位总是0。
Read1命令
当我们得到一个Nand Flash地址src_addr时可以这样分解出Column Address和Page Address
column_addr=src_addr%512; // column address
page_address=(src_addr>>9); // page address
能够指定的 Column Address范围为0~255(用于传递Column Address的数据线有8条(I/O0~I/O7,对应A0~A7),
(2)假定,指定读命令从第256个字节处 开始读取此页,把Column Address设置为256,但Column Address最大只能是255,这就造成数据溢出。。。所以必须Data Field分为两个半区,当要读取的起始地址(Column Address)在0~255内时用00h命令,当读取的起始地址是在256~511时,则使用01h命令.假设现在我要指定从第256个byte开 始读取此页,那么我将这样发送命令串
column_addr=256;
NF_CMD=0x01; ß 从2nd half开始读取
NF_ADDR=column_addr&0xff; 1st Cycle
NF_ADDR=page_address&0xff; 2nd.Cycle
NF_ADDR=(page_address>>8)&0xff; 3rd.Cycle
NF_ADDR=(page_address>>16)&0xff; 4th.Cycle