您的位置 首页 电子

S3C2410读写NandFlash剖析

一、结构分析S3C2410处理器集成了8位NandFlash控制器。目前市场上常见的8位NandFlash有三星公司的k9f1208、k9f1g08、k9f2g08等。k9f1208、k

一、结构剖析

S3C2410处理器集成了8位NandFlash控制器。现在市场上常见的8位NandFlash有三星公司的k9f1208、k9f1g08、k9f2g08等。k9f1208、k9f1g08、k9f2g08的数据页巨细分别为512Byte、2kByte、2kByte。它们在寻址办法上有必定差异,所以程序代码并不通用。本文以S3C2410处理器和k9f1208体系为例,叙述NandFlash的读写办法。
NandFlash的数据是以bit 的办法保存在memory cell里的,一般来说,一个cell 中只能存储一个bit,这些cell 以8 个或许16 个为单位,连成bit line,构成所谓的byte(x8)/word(x16),这便是NAND Device 的位宽。这些Line 组成Page, page 再安排构成一个Block。k9f1208的相关数据如下:
1block=32page;1page=528byte=512byte(Main Area)+16byte(Spare Area)。
总容量为=4096(block数量)*32(page/block)*512(byte/page)=64Mbyte
NandFlash以页为单位读写数据,而以块为单位擦除数据。依照k9f1208的安排办法能够分四类地址: Column Address、halfpage pointer、Page Address 、Block Address。A[0:25]表明数据在64M空间中的地址。
Column Address表明数据在半页中的地址,巨细规模0″255,用A[0:7]表明;
halfpage pointer表明半页在整页中的方位,即在0″255空间仍是在256″511空间,用A[8]表明;
Page Address表明页在块中的地址,巨细规模0″31,用A[13:9]表明;
Block Address表明块在flash中的方位,巨细规模0″4095,A[25:14] 表明;
二、读操作进程
K9f1208的寻址分为4个cycle。分别是:A[0:7]、A[9:16]、A[17:24]、A[25]。
读操作的进程为: 1、发送读取指令;2、发送第1个cycle地址;3、发送第2个cycle地址;4、发送第3个cycle地址;5、发送第4个cycle地址;6、读取数据至页末。
K9f1208供给了两个读指令,‘0x00’、‘0x01’。这两个指令差异在于‘0x00’能够将A[8]置为0,选中上半页;而‘0x01’能够将A[8]置为1,选中下半页。
尽管读写进程能够不从页鸿沟开端,但在正式场合下仍是主张从页鸿沟开端读写至页完毕。下面经过剖析读取页的代码,论述读进程。
static void ReadPage(U32 addr, U8 *buf) //addr表明flash中的第几页,即‘flash地址>>9’
{
U16 i;
NFChipEn(); //使能NandFlash
WrNFCmd(READCMD0); //发送读指令‘0x00’,由所以整页读取,所以选用指令‘0x00’
WrNFAddr(0); //写地址的第1个cycle,即Column Address,由所以整页读取所以取0
WrNFAddr(addr); //写地址的第2个cycle,即A[9:16]
WrNFAddr(addr>>8); //写地址的第3个cycle,即A[17:24]
WrNFAddr(addr>>16); //写地址的第4个cycle,即A[25]。
WaitNFBusy(); //等候体系不忙
for(i=0; i<512; i++)
buf[ i] = RdNFDat(); //循环读出1页数据
NFChipDs(); //开释NandFlash
}
三、写操作进程
写操作的进程为: 1、发送写开端指令;2、发送第1个cycle地址;3、发送第2个cycle地址;4、发送第3个cycle地址;5、发送第4个cycle地址;6、写入数据至页末;7、发送写完毕指令
下面经过剖析写入页的代码,论述读写进程。
static void WritePage(U32 addr, U8 *buf) //addr表明flash中的第几页,即‘flash地址>>9’
{
U32 i;
NFChipEn(); //使能NandFlash
WrNFCmd(PROGCMD0); //发送写开端指令’0x80’
WrNFAddr(0); //写地址的第1个cycle
WrNFAddr(addr); //写地址的第2个cycle
WrNFAddr(addr>>8); //写地址的第3个cycle
WrNFAddr(addr>>16); 写地址的第4个cycle
WaitNFBusy(); //等候体系不忙
for(i=0; i<512; i++)
WrNFDat(buf[ i]); //循环写入1页数据
WrNFCmd(PROGCMD1); //发送写完毕指令’0x10’
NFChipDs(); //开释NandFlash
}
四、总结
本文以S3C2410处理器和k9f1208体系为例叙述了nand flash的读写进程。在读写进程中没有考虑到坏块问题,有关ecc及坏块处理问题将在下个专题中叙述。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/254692.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部