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 。 |