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

📄 flash.c

📁 c8051f120为主控芯片,P5口的8位IO口完成的16位按键
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: Flash.C
* 文件标识: none
* 适用器件: SST39VF040
* 
* 摘 要: 本文件是外部Flash存储器SST39VF040的操作函数库
* 
* 当前版本:1.1
* 作者:刘大伟
* 完成日期:2007年1月24日
*
* 历史版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/

/*****************************引用外部头文件*****************************************/
#include "c8051f120.h"
#include "flash.h"
#include "delay.h"
#include <ABSACC.H>

/************************************************************************************/

/*************************************************************************************
* 函数名称:Flash_ChipErase;
*
* 函数功能描述:Flash芯片整片擦除程序;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    操作数据与顺序是针对39VF系列的固定操作,参考SST39VF512/010/020/040.PDF
*			系统选用39VF040,如有同系列型号变动,可修改头文件,无须改动此程序;
************************************************************************************
void Flash_ChipErase (void)				
{
	char data SFRPAGE_SAVE = SFRPAGE;    	// Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;    				// set SFR page F
	BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;	//顺序执行器件擦除步骤,p4口低N位是地址高N位 地址高2位是片选信号							
	CMD0_Addr	= 0XAA;
	BANK_ADDRHN = BANK_ADDRHN_CLR;
	CMD1_Addr	= 0X55;
	BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
	CMD0_Addr	= 0X80;
	BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
	CMD0_Addr	= 0XAA;
	BANK_ADDRHN = BANK_ADDRHN_CLR;
	CMD1_Addr	= 0X55;
	BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
	CMD0_Addr	= 0X10;
	Delay_ms (50);						//延时等待外部Flash擦除操作完毕
	SFRPAGE = SFRPAGE_SAVE;          	// Restore SFR page
}

/***********************************************************************************
* 函数名称:Flash_SectorErase;
*
* 函数功能描述:Flash芯片扇区擦除程序;
*              
* 输入参数:unsigned char类型扇区区号;
*
* 返回数据:none;
*
* 注意:    参数有效位位数与选用器件有关,系统中选用39VF040.
*		    作数据与顺序是针对39VF系列的固定操作,参考SST39VF512/010/020/040.PDF
*			如有同系列型号变动,可修改头文件,无须改动此程序;
************************************************************************************
void Flash_SectorErase (unsigned char Sector)
{
	unsigned char xdata *Addr_Bus;		//定义外部指针	
	union 								//定义地址转换
	{
		unsigned int Word;
	 	unsigned char Conver[2];
	}Conver	;
	char data SFRPAGE_SAVE = SFRPAGE;    	// Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;    				// set SFR page F

	if (Sector<FLASH_SECTORS)
	{			
		BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;	//顺序执行器件擦除步骤,p4口低N位是地址高N位 地址高2位是片选信号
		CMD0_Addr 	= 0XAA;
		BANK_ADDRHN = BANK_ADDRHN_CLR;
		CMD1_Addr 	= 0X55;
		BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
		CMD0_Addr	= 0X80;
		BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
		CMD0_Addr 	= 0XAA;
		BANK_ADDRHN = BANK_ADDRHN_CLR;
		CMD1_Addr 	= 0X55;	

		Conver.Conver[1] = Sector;										//扇区号赋给变量
		Conver.Conver[1] = (Conver.Conver[1]<<Chip_Model) & 0X30+0XC0;	//取扇区号低2位并加入片选信号
		Addr_Bus 		 = Conver.Word;									//16位指针赋值
		Conver.Conver[0] = Sector;										//扇区号赋给变量
		Conver.Conver[0] = (Conver.Conver[0]>>2) & BANK_ADDR;			//取扇区号高N位
		BANK_ADDRHN 	 = BANK_ADDRHN_CLR | Conver.Conver[0];			//高N位地址输出
		*Addr_Bus		 = 0X30;										//扇区擦除
	}
	Delay_ms (50);						//延时等待外部Flash擦除操作完毕
	SFRPAGE = SFRPAGE_SAVE;          	// Restore SFR page
}

/***********************************************************************************
* 函数名称:Flash_ByteWR;
*
* 函数功能描述:Flash写入字节程序;
*              
* 输入参数:unsigned long类型地址,unsigned char类型数据;
*
* 返回数据:none;
*
* 注意:    系统选用39VF040,如有同系列型号变动,可修改头文件,无须改动此程序;
************************************************************************************
void Flash_ByteWR (unsigned long Address, unsigned char Dat)
{
	unsigned char xdata *Addr_Bus;			//定义外部指针
	unsigned int Temp;						//定义地址总线地址寄存变量
	unsigned char Sec;						//定义高N位地址寄存变量
	char data SFRPAGE_SAVE = SFRPAGE;    	// Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;    				// set SFR page F

	BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;	//顺序执行器件操作,请参考相关DATASHEET
	CMD0_Addr 	= 0XAA;
	BANK_ADDRHN = BANK_ADDRHN_CLR;
	CMD1_Addr 	= 0X55;
	BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
	CMD0_Addr 	= 0XA0;

	Temp 		= Address | 0XC000;							 //加入片选信号
	Sec 		= ((unsigned char)(Address>>14)) & BANK_ADDR;//取地址高N位
	BANK_ADDRHN = BANK_ADDRHN_CLR | Sec;					 //高N位输出
	Addr_Bus 	= Temp;				
	*Addr_Bus 	= Dat;										 //数据写入
	Delay_us (14);
	SFRPAGE = SFRPAGE_SAVE;          						 // Restore SFR page
}

/***********************************************************************************
* 函数名称:Flash_DataWR;
*
* 函数功能描述:Flash写入多数据程序;
*              
* 输入参数:unsigned long类型地址,unsigned char类型数据起始指针,unsigned char类型数据长度;
*
* 返回数据:none;
*
* 注意:    字符串长度不超过256字节;
************************************************************************************
void Flash_DataWR (unsigned long Address, unsigned char *dat_sta, unsigned char Count)
{
	while (Count--)									//循环写入	
		Flash_ByteWR (Address++,*dat_sta++);		//更新细节写入的地址和数据	
}

/***********************************************************************************
* 函数名称:Flash_ByteRD;
*
* 函数功能描述:Flash读取字节函数程序;
*              
* 输入参数:unsigned long类型地址;
*
* 返回数据:unsigned char类型读出数据;
*
* 注意:    系统选用39VF040,如有同系列型号变动,可修改头文件,无须改动此程序;
************************************************************************************/
unsigned char Flash_ByteRD (unsigned long Address)
{
	unsigned char xdata *Addr_Bus;
	unsigned int Temp;
	unsigned char Sec;						//定义器件高位地址变量
	char data SFRPAGE_SAVE = SFRPAGE;   	// Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;    				// set SFR page F

	Temp 		= Address | 0XC000;			//14位低位地址组合2位片选信号
	Sec			= (Address>>14) & BANK_ADDR;//取出器件高位地址,舍弃无用位
	BANK_ADDRHN = BANK_ADDRHN_CLR | Sec;	//高位地址输出
	Addr_Bus	= Temp;						//给低位地址赋指针

	SFRPAGE = SFRPAGE_SAVE;          		// Restore SFR page

	return *Addr_Bus;						//取数据
}

/***********************************************************************************
* 函数名称:Flash_DataRD;
*
* 函数功能描述:Flash多数据读取程序;
*              
* 输入参数:unsigned long类型地址,unsigned char类型数据存储起始地址指针,unsigned char类型数据长度;
*
* 返回数据:none;
*
* 注意:    注意所给地址范围,地址出错将返回不正确的数据;
************************************************************************************/
void Flash_DataRD (unsigned long Address, unsigned char *Buf, unsigned char Count)
{
	while (Count--)
		*Buf++ = Flash_ByteRD (Address++);
}

/***********************************************************************************/
// 文件结束
/***********************************************************************************/

⌨️ 快捷键说明

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