#include "SC92F725X.H"
#include "intrins.H"
#include "eeprom.h"
unsigned char code eep_flag[1]={0x00};
/*****************************************************
*函数名称:void EEPROM_Init(void)
*函数功能:EEPROM初始化操作
*入口参数:void
*出口参数:void
*****************************************************/
void EEPROM_Init(void) //EEPROM初始化
{
if(eep_flag[0]==0x00) //判断是否第1次上电
{
EEPROM_Erase(); //如果是第1次上电,清除EEPROM
ROM_Write((unsigned int)(eep_flag),0xFF);
}
if(eep_flag[0]==0x00) //判断是否第1次上电
{
EEPROM_Erase(); //如果是第1次上电,清除EEPROM
ROM_Write((unsigned int)(eep_flag),0xFF);
}
}
/*****************************************************
*函数名称:void ROM_Write(unsigned int Addr,unsigned char Value)
*函数功能:ROM写操作
*入口参数:Addr:写入的地址,Value:写入的值
*出口参数:void
*****************************************************/
void ROM_Write(unsigned int Addr,unsigned char Value)
{
OPINX = 0xC2; // 操作OP_CTM1寄存器
OPREG |= 0x0C; // 设置全部Code区域允许IAP操作(0000H~0FFFH)
IAPDAT=Value;
IAPADH=Addr/0x100;
IAPADL=Addr%0x100;
IAPKEY=0xF0;
IAPCTL = 0x06; // 执行EEPROM写入操作,CPU hold time为2ms@24/12/6/2MHz
_nop_(); // 等待(至少需要8个_nop_())
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
OPINX = 0xC2; // 操作OP_CTM1寄存器
OPREG &= ~0x0C; // Code区域禁止IAP操作,仅EEPROM区域可作为数据存储使用
}
/*****************************************************
*函数名称:unsigned char ROM_Read(unsigned int eep_add)
*函数功能:ROM读操作
*入口参数:eep_add:读取的地址
*出口参数:void
*****************************************************/
unsigned char ROM_Read(unsigned int eep_add)
{
unsigned char eep_dat;
unsigned int code *POINT=0x0000;
eep_dat=*(POINT+eep_add);
return eep_dat;
}
/*****************************************************
*函数名称:void EEPROM_Write(unsigned int Addr,unsigned char Value)
*函数功能:EEPROM写操作
*入口参数:Addr:写入的地址,Value:写入的值
*出口参数:void
*****************************************************/
void EEPROM_Write(unsigned int Addr,unsigned char Value)
{
EA = 0; // 关闭总中断
IAPADE = 0x02; // 设置IAP操作区域:IAPArea=0x02:选择EEPROM区操作
IAPDAT = Value; // 要写入的数据Data
IAPADH = 0x00; // 写入地址的高5位
IAPADL = Addr; // 写入地址的低8位
IAPKEY = 0xF0; // IAP开启保护控制时间:此值可根据实际调整,需保证本条指令执行后到
// 对IAPCTL赋值前,时间间隔需小于240(0xF0)个系统时钟,否则IAP功能关闭
IAPCTL = 0x06; // 执行EEPROM写入操作,CPU hold time为2ms@24/12/6/2MHz
_nop_(); // 等待(至少需要8个_nop_())
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
IAPADE = 0x00; // 返回ROM区域
EA = 1; // 开启总中断
}
/*****************************************************
*函数名称:unsigned char EEPROM_Read(unsigned char Addr)
*函数功能:EEPROM读操作
*入口参数:Addr:读取的地址
*出口参数:读取的值
*****************************************************/
unsigned char EEPROM_Read(unsigned char Addr)
{
unsigned char ReadValue = 0x00; // 初始化读取值为0
unsigned char code *POINT=0x0000;
EA = 0; // 关闭总中断
IAPADE = 0x02; // 设置IAP操作区域:IAPArea=0x02:选择EEPROM区操作
ReadValue = *(POINT+Addr); // 读取的数据,在POINT的基地址上偏移了Addr的地址处的值
IAPADE = 0x00; // 返回ROM区域,防止MOVC操作到EEPROM
EA = 1; // 开启总中断
return ReadValue;
}
/*****************************************************
*函数名称:void EEPROM_Erase(void)
*函数功能:EEPROM数据全擦除
*入口参数:void
*出口参数:void
*****************************************************/
void EEPROM_Erase(void)
{
unsigned char eep_add;
for(eep_add=0;eep_add<128;eep_add++)
{
EEPROM_Write(eep_add,0x00);
}
}