Board logo

标题: 基于ARM920T的FLASH的读写(6) [打印本页]

作者: yuyang911220    时间: 2015-5-30 21:23     标题: 基于ARM920T的FLASH的读写(6)

6)
NAND 的写操作

static int NF_WritePage(U32 block,U32 page,U8 *buffer)

//
写Flash

{

int i;


U32 blockPage=(block<<5)+page;


U8 *bufPt=buffer;



NF_RSTECC();

// Initialize ECC

   

NF_nFCE_L();


NF_CMD(
[url=]0x0[/url][q4] );
//?????\\Read Mode 1


NF_CMD(0x80);

// Write 1st command,数据输入


NF_ADDR(0);


// Column 0


NF_ADDR(blockPage&0xff);



NF_ADDR((blockPage>>8)&0xff);

// Block & page num.


NF_ADDR((blockPage>>16)&0xff);



for(i=0;i<512;i++)


{


NF_WRDATA(*bufPt++);

// Write one page to NFM from buffer


}

   
    [url=]seBuf[0]=rNFECC0;[/url]

seBuf[1]=rNFECC1;


seBuf[2]=rNFECC2;


seBuf[5]=0xff;

// Marking good block

   

for(i=0;i<16;i++)


{


NF_WRDATA(seBuf);

// Write spare array(ECC and Mark)


}

[q5]

NF_CMD(0x10);

// Write 2nd command

   

for(i=0;i<10;i++);

//tWB = 100ns. ////??????



NF_WAITRB();

//wait tPROG 200~500us;




NF_CMD(0x70);

// Read status command

   

for(i=0;i<3;i++);

//twhr=60ns

   

if (NF_RDDATA()&0x1)
// Page write error


{



NF_nFCE_H();


Uart_Printf("[PROGRAM_ERROR:block#=%d]\n",block);


return 0;


}


else


{



NF_nFCE_H();


#if (WRITEVERIFY==1)


//return NF_VerifyPage(block,page,pPage);


#else


return 1;


#endif


}

}

以下讨论一下NAND 设备上所支持的文件系统,大概现在有以下几种:
A.
JFFS2(没有坏块处理,支持大容量存储的时候需要消耗大量的内存,大量的随机访问降低了NAND设备的读取效率)和YAFFS(速度快,但不支持文件的压缩和解压)
B.
支持DiskOnChip设备的TRUEFFS(True Flash File System). TRUEFFS是M-Systems公司为其产品DiskOnChip开发的文件系统,其规范并不开放。
C.
由SSFDC(Solid State Floppy Disk Card)论坛定义的支持SM卡的DOS-FAT。SM卡的DOS-FAT文件系统是由SSFDC论坛定义的,但它必须用在标准的块设备上。
对于大量用在各类存储卡上的NAND 设备而言,他们几乎都采用FAT文件系统,而在嵌入式操作系统下,还没有驱动程序可以直接让NAND设备采用文件系统,就技术角度来说,FAT文件系统不是很适合NAND设备,因为FAT文件系统的文件分区表需要不断地擦写,而NAND设备的只能有限次的擦写。


在上面已经很明显的提到,NAND设备存在坏块,为和上层文件系统接口,NAND设备的驱动程序必须给文件系统提供一个可靠的存储空间,这就需要ECC(Error Corection Code)校验,坏块标注、地址映射等一系列的技术手段来达到可靠存储目的。


SSFDC软件规范中,详细定义了如何利用NAND设备每个页中的冗余信息来实现上述功能。这个软件规范中,很重要的一个概念就是块的逻辑地址,它将在物理上可能不连续、不可靠的空间分配编号,为他们在逻辑空间上给系统文件提供一个连续可靠的存储空间。

表3给出了SSFDC规范中逻辑地址的标注方法。在系统初始化的时候,驱动程序先将所有的块扫描一遍,读出他们所对应的逻辑地址,并把逻辑地址和虚拟地址的映射表建好。系统运行时,驱动程序通过查询映射表,找到需要访问的逻辑地址所对应的物理地址然后进行数据读写。





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0