<pre name="code" class="cpp">/*
中颖EEPROM,使用比较方便,但有个注意点,就是每次无论你写入
什么数据或者在哪个地址写数据,都需要将对 对应的块擦除,擦
除后才能写入成功。
*/
#define SSPWriteFlag 0x5A
#define SSPEraseFlag 0xA5
//数据区 扇形区1
#define ADDR_START1 (uint16)0x100 //数据存储区起始地址
#define ADDR_START2 (uint16)0x200 //数据存储区起始地址
//数据区 扇形区2
#define Addr1UserHave (uint16)0x101 //用户地址1
#define Addr2UserHave (uint16)0x102 //用户地址2
uint8 Ssp_Flag = 0 ;
//*************************************
// 函数名称:Ssp_Write
// 函数功能:SSP擦除某块的地址
// 入口参数:被写数据的地址 数据
// 出口参数:无
//***************************************
void Ssp_EraseBlock(uint16 addr)
{
CY=EA;
EA=0;
IB_CON1 = 0xE6;
IB_CON2 = 0x05;
IB_CON3 = 0x0A;
IB_CON4 = 0x09;
if(Ssp_Flag != SSPEraseFlag)
{
IB_CON2=0;
goto Erase_Err;
}
XPAGE = (addr>>8) & 0x07;
FLASHCON=1;
IB_CON5 = 0x06;
_nop_();
_nop_();
_nop_();
Erase_Err:
Ssp_Flag=0;
FLASHCON=0;
XPAGE=0;
EA = CY;
}
//**************************************
// 函数名称:Ssp_Write
// 函数功能:SSP向某地址写一字节数据
// 入口参数:被写数据的地址 数据
// 出口参数:无
//***************************************
void Ssp_WriteByte(uint16 addr,uint8 dat)
{
CY=EA;
EA=0;
IB_DATA = dat;
IB_OFFSET = addr&0xff; //取被编程的低8位地址
IB_CON1 = 0x6E;
IB_CON2 = 0x05;
IB_CON3 = 0x0A;
IB_CON4 = 0x09;
if(Ssp_Flag != SSPWriteFlag)
{
IB_CON2=0;
goto Write_Err;
}
XPAGE = ((addr>>8) & 7); //被编程的扇形区0-3
FLASHCON=1; //对类EPROM编程开始
IB_CON5 = 0x06;
_nop_();
_nop_();
_nop_();
_nop_();
Write_Err:
Ssp_Flag=0;
FLASHCON=0;
XPAGE=0;
EA = CY;
}
//*************************************
// 函数名称:Read_Flash
// 函数功能:读数据 向FLASH
// 入口参数:读数据的地址
// 出口参数:无
//***************************************
uint8 Read_FlashByte(uint16 addr)
{
uint8 temp;
FLASHCON=1;
temp=*(uint8 code *)(addr);
FLASHCON=0;
return(temp);
}
//应用实例:
Ssp_EraseBlock(ADDR_START1);//擦除块1
Ssp_WriteByte(Addr1UserHave,0x88);//在地址Addr1UserHave中写入0x88
R_Data = Read_FlashByte(Addr1UserHave);//读地址Addr1UserHave的值纯手写wcf代码,wcf入门,wcf基础教程,布布扣,bubuko.com
原文:http://blog.csdn.net/pigkeli/article/details/29814777