⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 MCU为LPC2220,FLASH为39FV1601(地址0x80000000),外部一个SRAM(地址0x81000000)
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        ARM开发组
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: flash.c
**创   建   人: 陈明计
**最后修改日期:  2004年2月26日
**描        述: EasyARM2200板片上FLASH编程接口
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.0
** 日 期: 2004年2月26日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#define IN_FLASH
#include "config.h"
#define  system_base 0x80000000  // 4GByte System Memory Address.
#define  MaxAddr 0x1fffff  //SST39VF1601 = 2M Bytes
#define  GetAddr(addr)	(volatile uint16  *)(system_base|(addr<<1))
/*********************************************************************************************************
** 函数名称: GetAddr
** 功能描述: 转换地址
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月26日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

void Delay_150_Nano_Seconds(void)
{
    uint8 i;
    for(i=0;i<20;i++);
}
/*********************************************************************************************************
** 函数名称: WordProgram
** 功能描述: 字编程
** 输 入: 无
** 输 出: TRUE:成功
**         FALSE:失败
** 全局变量: 无
** 调用模块: GetAddr
**
** 作 者: 陈明计
** 日 期: 2004年2月26日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 WordProgram(uint32 Addr, uint16 Data) 
{
	volatile uint16  *ip;
    uint16  temp1,temp2;
    if(Addr>MaxAddr)
       return FALSE;
    ip = GetAddr(0x5555);// 转换地址0x5555
    *ip = 0xaa;			// 第一个写周期,地址0x5555,数据0xAA
    ip = GetAddr(0x2aaa);
    *ip = 0x55;			// 第二个写周期,地址0x2aaa,数据0x55
    ip = GetAddr(0x5555);
    *ip = 0xa0;			// 第三个写周期,地址0x5555,数据0xA0
    
    ip = (volatile uint16  *)(system_base|(Addr&0x1FFFFF));
    *ip = Data;				// 第四个写周期,地址Addr,数据Data
   
    while (1)				// 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
    {   temp1 = *ip;			
        temp2 = *ip;
        if (temp1 == temp2)
        {   if (temp1 != Data)
            {  
         	    return(FALSE);
            }
            else
            {  
         	    return(TRUE);
            }
        }
   }
   
   return(TRUE);
}
//小端
uint16 readflash(uint32 offset)
{ 
  uint16 i,tmp;
  if(offset>MaxAddr)
       return FALSE;   
  tmp= (*((volatile uint16 *)(system_base+offset)));
  i=tmp;
  tmp=(tmp>>8)&0xff;
  tmp=tmp|((i<<8)&0xff00);
  return tmp; 
}
uint32 readflashid(void)
{
    volatile uint16 *ip;
    uint32 re;
    uint32 Address;
    uint16 tmpint,tmpint2;
    ip = GetAddr(0x5555);
    ip[0] = 0xaa;
    ip = GetAddr(0x2aaa);
    ip[0] = 0x55;
    ip = GetAddr(0x5555);
    ip[0] = 0x90;
    Delay_150_Nano_Seconds();
   
    Address=0x0000; 
    ip=GetAddr(Address);
    tmpint=*ip;
    Address=0x0001; 
    ip=GetAddr(Address);
    tmpint2=*ip;
    re=tmpint;
    re=(re<<16)+tmpint2;
    
    
    Delay_150_Nano_Seconds();
    
    ip = GetAddr(0x5555);
    ip[0] = 0xaa;
    ip = GetAddr(0x2aaa);
    ip[0] = 0x55;
    ip = GetAddr(0x5555);
    ip[0] = 0xf0;
    Delay_150_Nano_Seconds();
    return re; 
}
/*********************************************************************************************************
** 函数名称: ChipErase
** 功能描述: 芯片擦除
** 输 入: 无
** 输 出: TRUE:成功
**         FALSE:失败
** 全局变量: 无
** 调用模块: GetAddr
**
** 作 者: 陈明计
** 日 期: 2004年2月26日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 ChipErase(void) 
{
    volatile uint16 *ip;
    uint16 temp1,temp2;

    ip = GetAddr(0x5555);
    ip[0] = 0xaa;
    ip = GetAddr(0x2aaa);
    ip[0] = 0x55;
    ip = GetAddr(0x5555);
    ip[0] = 0x80;
    ip = GetAddr(0x5555);
    ip[0] = 0xaa;
    ip = GetAddr(0x2aaa);
    ip[0] = 0x55;
    ip = GetAddr(0x5555);
    ip[0] = 0x10;
    
    while (1)
    {
        temp1 = *ip;
        temp2 = *ip;
        if (temp1 == temp2)
        {
            if (temp1 != 0xffff)
            {
                return FALSE;
            }
            else
            {
                return TRUE;
            }
        }
    }
    return TRUE;
}
/*********************************************************************************************************
** 函数名称: SectorErase
** 功能描述: 扇区擦除擦除
** 输 入: 无
** 输 出: TRUE:成功
**         FALSE:失败
** 全局变量: 无
** 调用模块: GetAddr
**
** 作 者: 陈明计
** 日 期: 2004年2月26日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 SectorErase(uint32 Index) 
{
    volatile uint16  *ip;
   uint16  temp1,temp2;

   if(Index>(MaxAddr/1024/4))
       return FALSE;
   ip = GetAddr(0x5555);
   *ip = 0xaa;			// 第一个写周期,地址0x5555,数据0xAA
   ip = GetAddr(0x2aaa);
   *ip = 0x55;			// 第二个写周期,地址0x2aaa,数据0x55
   ip = GetAddr(0x5555);
   *ip = 0x80;			// 第三个写周期,地址0x5555,数据0x80
   ip = GetAddr(0x5555);
   *ip = 0xaa;			// 第四个写周期,地址0x5555,数据0xAA
   ip = GetAddr(0x2aaa);
   *ip = 0x55;			// 第五个写周期,地址0x2aaa,数据0x55
   ip = (uint16 *)(system_base|Index<<12);
   *ip = 0x30;			// 第六个写周期,扇区地址,数据0x30

   while (1)				// 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
   {  temp1 = *ip;
      temp2 = *ip;
      if (temp1 == temp2)
      {  if (temp1 != 0xffff)
         {  return(FALSE);
         }
         else
         {  return(TRUE);
         }
      }
   }
   return(TRUE);
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -