问题:用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功能
}