原创 intel NORFLASH 28f128的编程

2009-3-20 15:12 5706 3 4 分类: MCU/ 嵌入式
最近开发板子上的norflash不能正常的擦除,详细阅读了相关的datasheet,自己实现了这个功能。

    记录下自己的调试过程:


    注意:必须先定义flash对应的bank中tacc的值大于最长指令周期,这里是14个系统时钟



完成的功能:
检测flash ID DEVICE
该flash为16M 共有128个sector 因此每个sector大小为0x20000


擦除前必须先unlocked



检测ID指令:给0x1000000(芯片起始地址) 写0x90 ,在0x1000000 读出ID


检测DEVICE指令:给0x1000000(芯片起始地址) 写0x90 ,在0x1000002 读出DEVICE



检测是否锁指令:给0x1000000(芯片起始地址) 写0x90 ,在0x1000004 读出



解锁指令:第一个时序周期:给0x1000000(芯片起始地址) 写0x60
          第二个时序周期:给0x1000000(芯片起始地址) 写0xd0
          检测0x1000004第一位是否为1,是 说明解锁完成
          结束,给0x1000000 写0xff


擦除sector指令:
          第一个时序周期:给0x1000000(芯片起始地址) 写0x20
          第二个时序周期:给0x1000000(芯片起始地址) 写0xd0
          第三个时序周期:给0x1000000(芯片起始地址) 写0x70
          检测0x1000000第一位是否为1,是则开始擦除一个sector 0x1000000~0x1020000
          每次只能擦除0x10000,所以擦除两次
          flash共有128个sector!



代码:


//==========================================================================================
int Strata_CheckID(int targetAddr)
{

//Add by HHTech
    _WR(targetAddr, 0x0090);   
    return _RD(targetAddr);                               }


//==========================================================================================
int Strata_CheckDevice(int targetAddr)
{
    
    _WR(targetAddr, 0x0090);

      return _RD(targetAddr+0x2);



}



//==========================================================================================
void Strata_ClearBlockLock(int targetAddr)
{
    U16 status;
    //_RESET();
    _WR(targetAddr, 0x0060);
    _WR(targetAddr, 0x00d0);
   
    while(1)
    {
status=_RD(targetAddr+0x4);
if(status&(1<<7))break;
    }


    _RESET();
}


//==========================================================================================
void Strata_EraseSector(int targetAddress)
{
    unsigned long ReadStatus;
    unsigned long bSR5;     
      unsigned long bSR7;      
    _WR(targetAddress, 0x0020);      
    _WR(targetAddress, 0x0070);    


   ReadStatus=_RD(targetAddress);     


    bSR7=ReadStatus & (1<<7);       


    //bSR7_2=ReadStatus & (1<<(7+16));// higher 16-bit 8MB Strata
    while(!bSR7 )
    {
        _WR(targetAddress, 0x0070);
        ReadStatus=_RD(targetAddress);
        bSR7=ReadStatus & (1<<7);
       
    }


    _WR(targetAddress, 0x0070);     
    ReadStatus=_RD(targetAddress);
    bSR5=ReadStatus & (1<<5);          
//    bSR5_2=ReadStatus & (1<<(5+16));    // higher 16-bit 8MB Strata
    if (bSR5==0 )
    {
    }
    else
    {
        
        _WR(targetAddress, 0x0050);     // Clear Status Register
        error_erase=1;                  // But not major, is it casual ?
    }


    _RESET();


}


//==========================================================================================
/*int Strata_BlankCheck(int targetAddr,int targetSize)
{
    int i;
    U16 j;
    for (i=0; i<targetSize; i+=2)
    {
        j=*((volatile U16 *)(i+targetAddr));
        if (j!=0xffff)      // In erasure it changes all block dta to 0xff
        {
           //Uart_Printf("E : %x = %x\n", (i+targetAddr), j);
            return 0;
        }
    }
    return 1;
}*/



void Program28F128J3A(void)
{
    int i;


       
    rINTMSK = BIT_ALLMSK;  
    targetAddress="TARGET"_ADDR_28F128;
targetOffset= 0x0;
targetSize = 0x20000*128;
       
//--------------------------------------------------------------------------------------------
    if ( (Strata_CheckID(targetAddress) & 0xffff) != 0x0089 )       // ID number = 0x0089
    {
        //Uart_Printf("Identification check error !!\n");
        return ;
    }
//---------------------------------------------------------------------------------------------
    if ( (Strata_CheckDevice(targetAddress) & 0xffff) != 0x0018 )   // Device number="0x0018"
    {
        //Uart_Printf("Device check error !!\n");
        return ;
    }
    
    for(i=0;i<targetSize;i+=0x10000)
    {
    Strata_ClearBlockLock(targetAddress+targetOffset+i);   //解除保护
Strata_EraseSector(targetAddress+targetOffset+i);      //擦除
    }

   }

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户208031 2013-4-3 11:48

不错,学习了~
相关推荐阅读
用户539229 2010-01-23 22:52
vmware下debian5的安装配置以及vmtools的安装使用
一.安装vmware6.5.21.下载vmware6.5.2http://4.scdx3.crsky.com/software/vmware_652.rar2.下载vmware6.5.2汉化包http...
用户539229 2009-12-29 12:57
最新诺基亚Qt4.6的上下位机移植手记,触摸屏支持
一.PC for Winxp下的开发环境的搭建诺基亚收购Qt以后,开发了自己的集成开发环境Qt Creater。这是一个非常强大的工具,上手也很快。登陆:http://qt.nokia.com/dow...
用户539229 2009-12-11 20:14
Omap3evm下android开发第一例hello下位机运行实践
1.       驱动的安装<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 1.1...
用户539229 2009-12-09 19:01
android的windows下开发环境的搭建与hello第一例
Android的SDK的官方网址如下官方网址:http://androidappdocs.appspot.com/sdk/index.html<?xml:namespace prefix = o...
用户539229 2009-11-28 13:21
Omap3下Goole的Android操作系统的实现 相当于山寨智能机啦
首先要有一个:OMAP3EVM平台的开发板 我用的是OMAP35x的TI的评估板还要有一个SD卡 TI花了很大的功夫打造了OMAP3智能手机开发平台,给用户提供了SDK包,GDK包,以及双核的Davi...
用户539229 2009-11-08 19:50
OMAP35x下OneNand的分析以及x-loader的介绍
OMAP35x下OneNand的分析以及x-loader的介绍<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:...
EE直播间
更多
我要评论
1
3
关闭 站长推荐上一条 /3 下一条