www.pudn.com > stcMCU.rar > stc_flash.c


/**************************************************************** 
//MCS-51单片机底层EEPROM操作库。 
//只在STC89C52单片机上实验过 
 
//create by changshengwuji  
//email: netspider@163.com 
//qq:    450353168 
//2006.05.03 
****************************************************************/ 
 
//#include "define_stc_flash.h" 
#include "../inc/MCS_X51.H" 
#include 
bit gint; 
/************************************************* 
//-----使能IAP---------------- 
*************************************************/ 
void flsh_en() 
{ 
	gint = EA; 
	INT_GLOBAL(0);	//DISABLE INTERUPT 
 
	set_flsh_wait;	//set wait time 
	set_flsh_en;	//enable flash operate 
} 
/************************************************** 
//停止IAP 
**************************************************/ 
void flsh_ds() 
{ 
	set_flsh_ds;		//disable flash operate 
	set_flsh_trig(0);	//dis trig 
	INT_GLOBAL(gint);	//return global int 
} 
 
/*从flash中读出一个字节返回*/	 
UINT8 flsh_rd_byte(UINT16 addx) 
{ 
	set_flsh_addr(addx); 
	flsh_wr_cmd(CMD_READ); 
    set_flsh_trig(TRIG1); 
	set_flsh_trig(TRIG2); 
	_nop_; 
	return(flsh_rd_data); 
} 
/****************************************** 
//从一个扇区内读出一串数据。 
//传送参数:扇区内地址,读出个数,读出地址 
********************************************/ 
bit flsh_sector_rd(UINT16 addx,UINT8 num,UINT8 *p) 
{ 
UINT8 i; 
	if(num > USED_SPACE) 
	 	return(0);			//超出扇区范围,退出 
	flsh_en(); 
	for(i = 0;i < num;i++) 
	{ 
		*p=flsh_rd_byte(addx + i);	 
		p++; 
	} 
	flsh_ds();		//禁止iap操作 
	return(1); 
} 
 
/*********************************************** 
//扇区擦除 
***********************************************/ 
void flsh_sector_earse(UINT16 addx) 
{ 
UINT16 sec_addr = 0xfe00; 
	sec_addr &= addx;	 //取得扇区首地址 
	 
	set_flsh_addr(sec_addr); 
	flsh_en(); 
	flsh_wr_cmd(CMD_SES);	//扇区擦除命令 
	set_flsh_trig(TRIG1); 
	set_flsh_trig(TRIG2); 
	_nop_; 
	flsh_ds(); 
} 
/*********************************************************** 
// 写一个字节并校验,如果写正确,返回1,否则返回0  
***********************************************************/ 
bit flsh_wr_verify(UINT16 addx,UINT8 dax) 
{ 
	set_flsh_addr(addx); 
	flsh_wr_cmd(CMD_PGM); 
	flsh_wr_data(dax);			 //写数据到iap的数据寄存器。 
	set_flsh_trig(TRIG1); 
	set_flsh_trig(TRIG2); 
	_nop_; 
	flsh_wr_data(0);	  		//使iap的数据寄存器改变,以便回读。 
	flsh_wr_cmd(CMD_READ); 
	set_flsh_trig(TRIG1); 
	set_flsh_trig(TRIG2); 
	_nop_; 
	if(flsh_rd_data == dax) 
		return(1); 
	else 
		return(0); 
} 
/************************************************************************** 
//写一个扇区	 
//传送16位的目的地址,最好从扇区首地址开始,8位的数据长度,源数据的指针 
**************************************************************************/ 
bit flsh_sector_wr(UINT16 addx,UINT8 num,UINT8 * pdax) 
{ 
UINT8 i; 
UINT16 addr; 
	if(num > USED_SPACE) 
		return(0);				//超出扇区范围退出 
	addr = addx; 
	flsh_sector_earse(addx);	//擦除目的扇区 
	flsh_en(); 
	for(i=0;i