STC 模拟eeprom数据丢失

问题:用stc的flash模拟eeprom,发现某些位置的数据会莫名其妙的丢失

原因:结果发现flash数据是以页为单位保存的,stc官方的库函数在擦写数据时是将flash整页擦除的,在我写某个字节的数据时,将整个页的数据都擦除了,后面都找不到数据了。

解决:在写数据时先将模拟eeprom的数据全部读出来,然后再将数据逐个的写入。

#include "main.h"
#include <stdlib.h>
#define MAX              255             //随机数最大值  
#define MIN              1              //随机数最小值 

#define IDCRC_INIT  0xEC

u8 data MachineIDaddress1,MachineIDaddress2;

/*********************************************************
关闭IAP
*********************************************************/
void IapIdle()
{
	IAP_CONTR			=0;					//关闭IAP功能
	IAP_CMD				=0;					//清除命令寄存器
	IAP_TRIG			=0;					//清除触发寄存器
	IAP_ADDRH			=0x80;			//将地址设置到非IAP区域
	IAP_ADDRL			=0;
}
/*********************************************************
从ISP/IAP/EEPROM区域读一字节
*********************************************************/
u8 IapReadByte(u16 addr)
{
	u8 dat;
	IAP_CONTR		=ENABLE_IAP;	//使能IAP
	IAP_CMD			=CMD_READ;		//设置IAP命令
	IAP_ADDRL		=addr;				//设置IAP低地址
	IAP_ADDRH		=addr>>8;			//设置IAP高地址
	IAP_TRIG		=0x5a;				//写触发命令(0x5a)
	IAP_TRIG		=0xa5;				//写触发命令(0xa5)
	_nop_();									//等待ISP/IAP/EEPROM操作完成
	dat=IAP_DATA;							//读ISP/IAP/EEPROM数据
	IapIdle();								//关闭IAP功能
	
	return dat;								//返回
}
/*********************************************************
从一字节数据到ISP/IAP/EEPROM区域
*********************************************************/
void IapProgramByte(u16 addr,u8 dat)
{
	IAP_CONTR		=ENABLE_IAP;		//使能IAP
	IAP_CMD			=CMD_PROGAM;		//设置IAP命令
	IAP_ADDRL		=addr;					//设置IAP低地址
	IAP_ADDRH		=addr>>8;				//设置IAP高地址
	IAP_DATA		=dat;						//写ISP/IAP/EEPROM数据
	IAP_TRIG		=0x5a;					//写触发命令(0x5a)
	IAP_TRIG		=0xa5;					//写触发命令(0xa5)
	_nop_();										//等待ISP/IAP/EEPROM操作完成
	IapIdle();									//关闭IAP功能
}
/*********************************************************
扇区擦除
*********************************************************/
void IapEraseSector(u16 addr)
{
	IAP_CONTR		=ENABLE_IAP;		//使能IAP
	IAP_CMD			=CMD_ERASE;		//设置IAP命令
	IAP_ADDRL		=addr;					//设置IAP低地址
	IAP_ADDRH		=addr>>8;				//设置IAP高地址
	IAP_TRIG		=0x5a;					//写触发命令(0x5a)
	IAP_TRIG		=0xa5;					//写触发命令(0xa5)
	_nop_();										//等待ISP/IAP/EEPROM操作完成
	IapIdle();									//关闭IAP功能
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值