|
发表于 2006-4-4 23:01:31
|
显示全部楼层
我觉得对于3中取2的问题,分成3个区域进行操作比“连续3个单元”更合理,例如以下的程序片段:
//定义内部 EEPROM 的地址分配
//MEGA16内部有512字节EEP,地址范围 0x0000 - 0x01FF
// 输出映像为 0x0011 - 0x0080 (112BYTE)
// 备份1 0x0081 - 0x00F0
// 备份2 0x00F1 - 0x0160
//3个区域互为备份
#define EEpModuleId 0x0011 //modbus模块地址编号
#define EEpWdtComp 0x0012 //看门狗门值
#define EEpWdtAct 0x0013 //看门狗动作类型
#define EEpIAPAct 0x0014 //升级标志 55H有效
#define EEpOffLineStat 0x0015 //离线标志
……
这样在定义EEP地址时,可以连续排列,而不需要注意以3为模的问题,以下是读写函数:
/* ***************************************************************
**函数名称: ApEepRead()
**函数功能: 读出数据 字节方式
**入口参数: wAddr 操作地址
**出口参数: 经过3中取2的数据
**备 注: 若有需要,自动更新备份文件
*************************************************************** */
uint8 ApEepRead(uint16 wAddr)
{
uint8 temp1,temp2,temp3;
temp1 = eeprom_read_byte(wAddr);
temp2 = eeprom_read_byte(wAddr + 0x70);
temp3 = eeprom_read_byte(wAddr + 0xF0);
if ((temp1 == temp2) && (temp2 == temp3))
{
return temp1;
}
else if ((temp1 == temp2) || (temp1 == temp3))
{
ApEepWrite(wAddr, temp1);
return temp1;
}
else if (temp2 == temp3)
{
ApEepWrite(wAddr, temp2);
return temp2;
}
else
{
ApEepWrite(wAddr, 0); //如果3个都不同的处理
return 0;
}
}
/* ***************************************************************
**函数名称: ApEepWrite()
**函数功能: 写入数据 字节方式
**入口参数: wAddr 待写入的地址 wDate 待写入的数据
**出口参数:
**备 注: 自动写备份文件
*************************************************************** */
void ApEepWrite(uint16 wAddr, uint8 wDate)
{
/* 先读出数据,如果一致就不需要再次写入 */
……
/* 写3次数据 */
eeprom_write_byte (wAddr, wDate);DelayNMs(10);
eeprom_write_byte (wAddr + 0x70, wDate);DelayNMs(10);
eeprom_write_byte (wAddr + 0xF0, wDate);DelayNMs(10);
}
以前在使用24Cxx时,总觉得3个数据连续挨着受破坏的概率要大于分散在3个不同的区域,测试的结果好象也映证了这一点。AVR的内部EEP没有经过这方面的测试
-----此内容被xrb3115于2006-04-04,23:08:17编辑过
-----此内容被xrb3115于2006-04-04,23:21:43编辑过 |
|