首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嵌入式系统中的FLASH(2)

嵌入式系统中的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
继承事业,薪火相传
返回列表