S3C2440对NandFlash的大体操作.docx

上传人:b****5 文档编号:27921516 上传时间:2023-07-06 格式:DOCX 页数:21 大小:301.87KB
下载 相关 举报
S3C2440对NandFlash的大体操作.docx_第1页
第1页 / 共21页
S3C2440对NandFlash的大体操作.docx_第2页
第2页 / 共21页
S3C2440对NandFlash的大体操作.docx_第3页
第3页 / 共21页
S3C2440对NandFlash的大体操作.docx_第4页
第4页 / 共21页
S3C2440对NandFlash的大体操作.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

S3C2440对NandFlash的大体操作.docx

《S3C2440对NandFlash的大体操作.docx》由会员分享,可在线阅读,更多相关《S3C2440对NandFlash的大体操作.docx(21页珍藏版)》请在冰豆网上搜索。

S3C2440对NandFlash的大体操作.docx

S3C2440对NandFlash的大体操作

S3C2440对NandFlash操作和电路原理

——K9F2G08U0A

S3C2440内部集成了一个Nandflash操纵器。

S3C2440的Nandflash操纵器包括了如下的特性:

l       一个引导启动单元

l       NandFlash存储器接口,支持8位或16位的每页大小为256字,512字节,1K字和2K字节的Nandflash

l       软件模式:

用户能够直接访问NandFlash存储器,此特性能够用于NandFlash存储器的读、擦除和编程。

l       S3C2440支持8/16位的NandFlash存储器接口总线

l       硬件ECC生成,检测和指示(软件纠错)。

l       Steppingstone接口,支持大/小端模式的按字节/半字/字访问。

我用的开发板是天嵌的TQ2440,板子用到的NandFlash是Samsung公司的K9F2G08U0A,它是8位的Nandflash。

本文只介绍NandFlash的电路原理和NandFlash的读、写、擦除等大体操作,暂不涉及NandFlash启动程序的问题。

NandFlash的电路连接如图1所示:

图1NandFlash电路原理

上图的左侧为K9F2G08U0A与2440的连接图,原理方面就不多介绍,去看看datasheet估量就明白了,右边的部份是S3C2440的Nand操纵器的配置。

配置引脚NCON,GPG13,GPG14和GPG15用来设置NandFlash的大体信息,Nand操纵器通过读取配置引脚的状态获取外接的NandFlash的配置信息,图2是这四个配置引脚的概念:

图2Nand操纵配置引脚信息

      由于K9F2G08U0A的总线宽度为8位,页大小为2048字节,需要5个寻址命令,因此NCON、GPG13和GPG14应该接高电平,GPG15应该接低电平。

K9F2G08U0A没有地址或数据总线,只有8个IO口,这8个IO口用于传输命令、地址和数据。

K9F2G08U0A要紧以page(页)为单位进行读写,以block(块)为单位进行擦除。

每一页中又分为main区和spare区,main区用于正常数据的存储,spare区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等。

K9F2G08U0A的存储阵列如图3所示:

图3K9F2G08U0A内部存储阵列

由上图,咱们能够明白:

K9F2G08U0A的一页为(2K+64)字节(2K表示的是main区容量,64表示的是spare区容量),它的一块为64页,而整个设备包括了2048个块。

如此算下来一共有2112M位容量,假设是只算main区容量那么有256M字节(即256M×8位)。

图4K9F2G08U0A地址序列

要实现用8个IO口来要访问这么大的容量,如图4所示:

K9F2G08U0A规定了用5个周期来实现。

第一个周期访问的地址为A0~A7;第二个周期访问的地址为A8~A11,它作用在IO0~IO3上,而此刻IO4~IO7必需为低电平;第三个周期访问的地址为A12~A19;第四个周期访问的地址为A20~A27;第五个周期访问的地址为A28,它作用在IO0上,而此刻IO1~IO7必需为低电平。

前两个周期传输的是列地址,后三个周期传输的是行地址。

通过度析可知,列地址是用于寻址页内空间,行地址用于寻址页,假设是要直接访问块,那么需要从地址A18开始。

由于所有的命令、地址和数据全数从8位IO口传输,因此Nand

flash概念了一个命令集来完成各类操作。

有的操作只需要一个命令(即一个周期)即可,而有的操作那么需要两个命令(即两个周期)来实现。

K9F2G08U0A的命令说明如图5所示:

图5K9F2G08U0A命令表

为了方便利用,咱们宏概念了K9F2G08U0A的常常利用命令

#defineCMD_READ1                0x00             //页读命令周期1

#defineCMD_READ2                0x30             //页读命令周期2

#defineCMD_READID              0x90             //读ID命令

#defineCMD_WRITE1              0x80             //页写命令周期1

#defineCMD_WRITE2              0x10             //页写命令周期2

#defineCMD_ERASE1              0x60             //块擦除命令周期1

#defineCMD_ERASE2              0xd0             //块擦除命令周期2

#defineCMD_STATUS               0x70             //读状态命令

#defineCMD_RESET                0xff              //复位

#defineCMD_RANDOMREAD1         0x05      //随意读命令周期1

#defineCMD_RANDOMREAD2         0xE0      //随意读命令周期2

#defineCMD_RANDOMWRITE         0x85      //随意写命令

接下来介绍几个NandFlash操纵器的寄放器。

NandFlash操纵器的寄放器要紧有NFCONF(NandFlash配置寄放器),NFCONT(NandFlash操纵寄放器),NFCMMD(NandFlash命令集寄放器),NFADDR(NandFlash地址集寄放器),NFDATA(NandFlash数据寄放器),NFMECCD0/1(NandFlash的main区ECC寄放器),NFSECCD(NandFlash的spare区ECC寄放器),NFSTAT(NandFlash操作状态寄放器),NFESTAT0/1(NandFlash的ECC状态寄放器),NFMECC0/1(NandFlash用于数据的ECC寄放器),和NFSECC(NandFlash用于IO的ECC寄放器)。

      

(1)NFCONF:

2440的NFCONF寄放器是用来设置NANDFlash的时序参数TACLS、TWRPH0、TWRPH1。

配置寄放器的[3:

0]是只读位,用来指示外部所接的NandFlash的配置信息,它们是由配置引脚NCON,GPG13,GPG14和GPG15所决定的(比如说K9F2G08U0A的配置为NCON、GPG13和GPG14接高电平,GPG15接低电平,因此[3:

0]位状态应该是1110)。

(2)NFCONT:

用来使能/禁止NANDFlash操纵器、使能/禁止操纵引脚信号nFCE、初始化ECC。

它还有其他功能,在一样的应用顶用不到,比如锁定NANDFlash。

(3)NFCMMD:

关于不同型号的Flash,操作命令一样不一样。

参考前面介绍的K9F2G08U0A命令序列。

(4)NFADDR:

当写那个寄放器时,它将对Flash发出地址信号。

只用到低8位来传输,因此需要分次来写入一个完整的32位地址,K9F2G08U0A的地址序列在图4已经做了详细说明。

(5)NFDATA:

只用到低8位,读、写此寄放器将启动对NANDFlash的读数据、写数据操作。

(6)NFSTAT:

只用到位0,用来检测NAND是不是预备好。

0:

busy,1:

ready。

NFCONF寄放器利用TACLS、TWRPH0、TWRPH1这3个参数来操纵NANDFlash信号线CLE/ALE与写操纵信号nWE的时序关系,它们之间的关系如图6和图7所示:

图6CLE/ALE时序图

图7nWE和nRE时序图

 TACLS为CLE/ALE有效到nWE有效之间的持续时刻,TWRPH0为nWE的有效持续时刻,TWRPH1为nWE无效到CLE/ALE无效之间的持续时刻,这些时刻都是以HCLK为单位的。

通过查阅K9F2G08U0A的数据手册,咱们能够找到并计算与S3C2440相对应的时序:

K9F2G08U

0A中的Twp与TWRPH0相对应,Tclh与TWRPH1相对应,TACLS应该是与Tcls相对应。

K9F2G08U0A给出的都是最小时刻,2440只要知足它的最小时刻即可。

TACLS、TWRPH0、TWRPH1这三个变量取值大一些会更保险,在那个地址,这三个值别离取1,2和0。

下面就开始详细介绍K9F2G08U0A的大体操作,包括复位,读ID,页读、写数据,随意读、写数据,块擦除等。

为了更好地应用ECC和使能NandFlash片选,咱们还需要一些宏概念:

#defineNF_nFCE_L()        {rNFCONT&=~(1<<1);}

#defineNF_CE_L()          NF_nFCE_L()    //打开nandflash片选

#defineNF_nFCE_H()        {rNFCONT|=(1<<1);}

#defineNF_CE_H()         NF_nFCE_H()       //关闭nandflash片选

#defineNF_RSTECC()        {rNFCONT|=(1<<4);}   //复位ECC

#defineNF_MECC_UnLock()   {rNFCONT&=~(1<<5);}  //解锁main区ECC

#defineNF_MECC_Lock()     {rNFCONT|=(1<<5);}   //锁定main区ECC

#defineNF_SECC_UnLock()  {rNFCONT&=~(1<<6);}   //解锁spare区ECC

#defineNF_SECC_Lock()     {rNFCONT|=(1<<6);}   //锁定spare区ECC

NFSTAT是另一个比较重要的寄放器,它的第0位能够用于判定nandflash是不是在忙,第2位用于检测RnB引脚信号:

#defineNF_WAITRB() {while(!

(rNFSTAT&(1<<0)));} //等待NandFlash不忙

#defineNF_CLEAR_RB()  {rNFSTAT|=(1<<2);}   //清除RnB信号

#defineNF_DETECT_RB()   {while(!

(rNFSTAT&(1<<2)));}  //等待RnB信号变高,即不忙

NFCMMD,NFADDR和NFDATA别离用于传输命令,地址和数据,为了方便起见,咱们能够概念一些宏概念用于完成上述操作:

 

#defineNF_CMD(data)      {rNFCMD =(data);}       //传输命令

#defineNF_ADDR(addr)      {rNFADDR=(addr);}       //传输地址

#defineNF_RDDATA()        (rNFDATA)                 //读32位数据

#defineNF_RDDATA8()       (rNFDATA8)                 //读8位数据

#defineNF_WRDATA(data)    {rNFDATA=(data);}       //写32位数据

#defineNF_WRDATA8(data)   {rNFDATA8=(data);}     //写8位数据

第一,是初始化操作

voidrNF_Init(void)

{

rNFCONF=(TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);//初始化时序参数

rNFCONT=

(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);//非锁定,屏蔽nandflash中断,初始化ECC及锁定main区和spare区ECC,使能nandflash操纵器,禁止片选

rNF_Reset();//复位芯片

}

复位操作,写入复位命令

staticvoidrNF_Reset()

{

NF_CE_L();                   //打开nandflash片选

NF_CLEAR_RB();               //清除RnB信号

NF_CMD(CMD_RESET);          //写入复位命令

NF_DETECT_RB();              //等待RnB信号变高,即不忙

NF_CE_H();                   //关闭nandflash片选

}

读取K9F2G08U0A芯片ID的操作如下:

时序图在datasheet的figure18。

第一需要写入读ID命令(0x90),然后再写入0x00地址,并等待芯片就绪,就能够够够读取到一共五个周期的芯片ID,第一个周期为厂商ID,第二个周期为设备ID,第三个周期至第五个周期包括了一些具体的该芯片信息,函数如下

staticcharrNF_ReadID()

{

      charpMID;

      charpDID;

      charcyc3,cyc4,cyc5;

      NF_nFCE_L();              //打开nandflash片选

      NF_CLEAR_RB();            //清RnB信号

      NF_CMD(CMD_READID);       //读ID命令

      NF_ADDR(0x0);            //写0x00地址

      for(i=0;i<100;i++);等一段时刻

      //读五个周期的ID

      pMID=NF_RDDATA8();      //厂商ID:

0xEC

      pDID=NF_RDDATA8();      //设备ID:

0xDA

      cyc3=NF_RDDATA8();      //0x10

      cyc4=NF_RDDATA8();      //0x95

      cyc5=NF_RDDATA8();      //0x44

      NF_nFCE_H();              //关闭nandflash片选

       return(pDID);

}

下面介绍NandFlash读操作,读操作是以页为单位进行的。

假设是在读取数据的进程中不进行ECC校验判定,那么读操作比较简单,在写入读命令的两个周期之间写入要读取的页地址,然后读取数据即可。

假设是为了更准确地读取数据,那么在读取完数据以后还要进行ECC校验判定,以确信所读取的数据是不是正确。

在上文中已经介绍过,NandFlash的每一页有两区:

main区和spare区,main区用于存储正常的数据,spare区用于存储其他附加信息,其中就包括ECC校验码。

当咱们在写入数据的时候,咱们就计算这一页数据的ECC校验码,然后把校验码存储到spare区的特定位置中,在下次读取这一页数据的时候,一样咱们也计算ECC校验码,然后与spare区中的ECC校验码比较,假设是一致那么说明读取的数据正确,假设是不一致那么不正确。

ECC的算法较为复杂,好在S3C2440能够硬件产生ECC校验码,如此就省去了很多的麻烦事。

S3C2440既能够产生main区的ECC校验码,也能够产生spare区的ECC校验码。

因为K9F2G08U0A是8位IO口,因此S3C2440共产生4个字节的main区ECC码和2个字节的spare区ECC码。

在那个地址咱们规定,在每一页的spare区的第0个地址到第3个地址存储main区ECC,第4个地址和第5个地址存储spare区ECC。

产生ECC校验码的进程为:

在读取或写入哪个区的数据之前,先解锁该区的ECC,以便产生该区的ECC。

在读取或写入完数据以后,再锁定该区的ECC,如此系统就会把产生的ECC码保留到相应的寄放器中。

main区的ECC保留到NFMECC0/1中(因为K9F2G08U0A是8位IO口,因此那个地址只用到了NFMECC0),spare区的ECC保留到NFSECC中。

关于读操作来讲,咱们还要继续读取spare区的相应地址内容,以取得上次写操作时所存储的main区和spare区的ECC,并把这些数据别离放入NFMECCD0/1和NFSECCD的相应位置中。

最后咱们就能够够够通过读取NFESTAT0/1(因为K9F2G08U0A是8位IO口,因此那个地址只用到了NFESTAT0)中的低4位来判定读取的数据是不是正确,其中第0位和第1位为main区指示错误,第2位和第3位为spare区指示错误。

下面是一段具体的页读操作程序:

U8rNF_ReadPage(U32page_number)

{

   U32i,mecc0,secc;

NF_RSTECC();               //复位ECC

NF_MECC_UnLock();         //解锁main区ECC

   NF_nFCE_L();//使能芯片 

   NF_CLEAR_RB();//清除RnB

NF_CMD(CMD_READ1);         //页读命令周期1,0x00

   //写入5个地址周期

 NF_ADDR(0x00);                //列地址A0-A7

   NF_ADDR(0x00);                 //列地址A8-A11

   NF_ADDR((page_number)&0xff);          //行地址A12-A19

   NF_ADDR((page_number>>8)&0xff);   //行地址A20-A27

NF_ADDR((page_number>>16)&0xff);  //行地址A28

NF_CMD(CMD_READ2);       //页读命令周期2,0x30

   NF_DETECT_RB();     //等待RnB信号变高,即不忙

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

   {

      buf[i]= NF_RDDATA8();//读取一页数据内容

   }

 

NF_MECC_Lock();          //锁定main区ECC值

NF_SECC_UnLock();        //解锁spare区ECC

 //读spare区的前4个地址内容,即第2048~2051地址,这4个字节为main区的ECC

mecc0=NF_RDDATA();   

   //把读取到的main区的ECC校验码放入NFMECCD0/1的相应位置内

rNFMECCD0=((mecc0&0xff00)<<8)|(mecc0&0xff);

rNFMECCD1=((mecc0&0xff000000)>>8)|((mecc0&0xff0000)>>16);

            

NF_SECC_Lock();       //锁定spare区的ECC值

//继续读spare区的4个地址内容,即第2052~2055地址,其中前2个字节为spare区的ECC值

secc=NF_RDDATA();  

      //把读取到的spare区的ECC校验码放入NFSECCD的相应位置内

rNFSECCD=((secc&0xff00)<<8)|(secc&0xff);

NF_nFCE_H();   //关闭nandflash片选

      

   //判定所读取到的数据是不是正确

if((rNFESTAT0&0xf)==0x0)

return0x66;                 //正确

else

return0x44;                 //错误

}

这段程序是把某一页的内容读取到全局变量数组buffer中。

该程序的输入参数直接就为K9F2G08U0A的第几页,例如咱们要读取第128064页中的内容,能够挪用该程序为:

rNF_ReadPage(128064)。

由于第128064页是第2001块中的第0页(128064=2001×64+0),因此为了更清楚地表示页与块之间的关系,也能够写为:

rNF_ReadPage(2001*64)。

页写操作的大致流程为:

在两个写命令周期之间别离写入页地址和数据,固然假设是为了保证下次读取该数据时的正确性,还需要把main区的ECC值和spare区的ECC值写入到该页的spare区内。

然后咱们还需要读取状态寄放器,以判定这次写操作是不是正确。

下面就给出一段具体的页写操作程序,其中输入参数也是要写入数据到第几页:

U8rNF_WritePage(U32page_number)

{

U32i,mecc0,secc;

U8stat,temp;

temp=rNF_IsBadBlock(page_number>>6);    //判定该块是不是为坏块

if(temp==0x33)

return0x42;      //是坏块,返回

NF_RSTECC();         //复位ECC——>使能ECC

NF_MECC_UnLock();     //解锁main区的ECC

NF_nFCE_L();          //打开nandflash片选

NF_CLEAR_RB();       //清RnB信号

 

NF_CMD(CMD_WRITE1);          //页写命令周期1

 //写入5个地址周期

NF_ADDR(0x00);           //列地址A0~A7

NF_ADDR(0x00);          //列地址A8~A11

NF_ADDR((page_number)&0xff);         //行地址A12~A19

NF_ADDR((page_number>>8)&0xff);   //行地址A20~A27

NF_ADDR((page_number>>16)&0xff); //行地址A28

         

for(i=0;i<2048;i++)//写入一页数据

{

NF_WRDATA8((char)(i+6));

}

NF_MECC_Lock();    //锁定main区的ECC值

mecc0=rNFMECC0;   //读取main区的ECC校验码

//把ECC校验码由字型转换为字节型,并保留到全局变量数组ECC

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1