Board logo

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

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

3.
NOR Flash的软件设计

Flash 的命令很多,但常用到的命令就3种:识别、擦除、编程命令。以下就对3种命令作分别的简要介绍:
1)
NOR Flash的识别
29lv160_CheckId()
{

U8 tmp;


U16 manId,devId;


int i;


_RESET();

   

_WR(0x555,0xaa);


_WR(0x2aa,0x55);


_WR(0x555,0x90);


manId=_RD(0x0);


devId=_RD(0x1);



_RESET();


printf("Manufacture ID(0x22C4)=%4x, Device ID(0x2249)=%4x\n",manId,devId);



if(manId == 0x22C4 && devId == 0x2249)


return 1;


else


return 0;

}
NOR Flash 的识别程序由四个读写周期就可以完成,在Flash的相关命令表中可以查到相应ID识别的命令。

2)
NOR Flash的擦除
要对NOR Flash进行写操作,就一定要先进性擦除操作。NOR Flash 的擦除都是以块(sector)为单位进行的,但是每一种型号的Flash的sector的大小不同,即使在同一片的Flash内,,不同sector的大小也是不完全一样的。
void 29lv160db_EraseSector(int targetAddr)
{


printf("Sector Erase is started!\n");



_RESET();


_WR(0x555,0xaa);


_WR(0x2aa,0x55);


_WR(0x555,0x80);


_WR(0x555,0xaa);

_WR(0x2aa,0x55);
_WR(BADDR2WADDR(targetAddr),0x30);

return
_WAIT(BADDR2WADDR(targetAddr);


}






                 


图5

Erase Operation
   


/**************

如上图5所示,擦除操作时还要有一个关键的操作擦除查询算法,即等待Flash擦除的过程,并返回擦除是否成功的结果。算法如右图6所示

****************/
Int
_WAIT(void)

{
unsigned int state,flashStatus,old;
old=_RD(BADDR2WADDR(0x0));
while(1)

{



flashStatus=_RD(BADDR2WADDR(0x0));


if( (old&0x40) == (flashStatus&0x40) )


break;


if( flashStatus&0x20 )



{


//printf("[DQ5=1:%x]\n",flashStatus);


old=_RD(BADDR2WADDR(0x0));


flashStatus=_RD(BADDR2WADDR(0x0));


if( (old&0x40) == (flashStatus&0x40) )



return 0;


else return 1;



}



//printf(".");



old=flashStatus;


}
//printf("!\n");


return 1;

}

图6
Toggle Bit Algorithm



以上的方法为查询数据线上的一个特定位Toggle位。此外还有2种检测方法,一种为提供额外的Busy信号,处理器通过不断查询Busy信号来得知Flash的擦除操作是否完成,一般较少应用;一种为查询Polling位。


3)
NOR Flash 的编程操作

int 29lv160db_ProgFlash(U32 realAddr,U16 data)

{


_WR(0x555,0xaa);


_WR(0x2aa,0x55);


_WR(0x555,0xa0);



_WR(BADDR2WADDR(realAddr),data);



return
_WAIT(BADDR2WADDR(realAddr);



}

对擦除过的Flash进行编程比较简单,但仍然用到以上提到的查询算法,速度比较慢,一般为20uS,最长的达到500uS 。




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