www.pudn.com > flash.zip > flash.c


#include "stdio.h" 
#include "reg51.h" 
#define _29F040_h 
  
#define FCD_reset 0xf0 
#define FCD_erase_suspand 0xb0 
#define FCD_erase_resume  0x30 
  
#define FC_address555 0x555 
#define FC_address2AA 0x2aa 
#define size_29f040 0x80000 
#define flash_map_begin 0x4000 
#define flash_map_end   0x5fff  //8K 
#define flash_page   IO_EX4 
//-------------------------------------- 
void F29040_reset() 
{ 
XBYTE[flash_map_begin+0x30]=FCD_reset; 
} 
//-------------------------------------- 
//给出一个地址,自动送出页面地址,且返回页内偏移地址 
unsigned int F29040_calc_address(long address)  
{ 
 unsigned long segment; 
 unsigned int ret;  
 unsigned char page; 
 segment=address>>11; 
 segment=address/2048; 
 page=segment; 
 XBYTE[flash_page]=page; //写页面地址 
 ret=address; 
 ret&=0x07ff; 
 ret|=0x4000; 
 return(ret); 
} 
//-------------------------------------- 
//向flash写入一个字节,写入之前请调用F29040_reset,返回0:成功,1失败 
unsigned char F29040_write_a_byte(unsigned long address,unsigned char byte)  
{ 
 unsigned int offset;  
 unsigned char b1,b2; 
 unsigned char i=0;  
 bit ok=0; 
 F29040_reset(); 
 offset=F29040_calc_address(FC_address555); 
 XBYTE[offset]=0xaa; 
 offset=F29040_calc_address(FC_address2AA); 
 XBYTE[offset]=0x55; 
 offset=F29040_calc_address(FC_address555); 
 XBYTE[offset]=0xa0; 
 offset=F29040_calc_address(address); 
 XBYTE[offset]=byte; 
 do 
 { 
  b1=XBYTE[offset]; //读flash数据总线 
  b1&=B1000_0000; 
  b2=byte & B1000_0000; 
  if(b1==b2)  
   return(0); //成功 
  b1=XBYTE[offset]; 
  b1&=B0010_0000; 
  //MACRO_CALL_REFURBISH_WATCHDOG 
 }while(b1==0); //写字节周期完成 
 b1=XBYTE[offset]; //读flash数据总线 
 b1&=B1000_0000; 
 b2=byte & B1000_0000; 
 if(b1==b2)  
  return(0); //成功   
 else 
  return(1); //失败 
} 
//-------------------------------------- 
//向flash读一个字节,写入之前请调用F29040_reset 
unsigned char F29040_read_a_byte(long address)  
{ 
 unsigned int offset;  
 unsigned char ret; 
 F29040_reset(); 
 offset=F29040_calc_address(address); 
 ret=XBYTE[offset]; 
 return(ret); 
}