📄 flash.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 + -