<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