微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 治标治本,彻底解决AVR单片机EEPROM数据丢失问题

治标治本,彻底解决AVR单片机EEPROM数据丢失问题

时间:12-01 来源:互联网 点击:

size包括数据长度和校验码字节

*输入参数:pdata:数组指针;packsize:数据长度

*返回参数:数据是否有效,有效:VALID,无效:INVALID

*编写作者:my_avr

*编写时间:2007年8月21日

*相关说明:

********************************************************************/

unsigned char EepromCheck(unsigned char *pdata,unsigned char packsize)

{

unsigned char i,j;

unsigned int crc,ref_crc;

crc = 0;

ref_crc = 0;

for (i = 0; i < (packsize - 2); i ++)

{

crc = crc ^ ((uint16_t) EepromReadByte(pdata) < 8);

for (j = 0; j < 8; j++)

{

if (crc & 0x8000)

{

crc = (crc < 1) ^ 0x1021;

}

else

{

crc = crc < 1;

}

}

pdata ++;

}

ref_crc = (uint16_t) EepromReadByte(pdata);

ref_crc = ref_crc<8;

pdata ++;

ref_crc |= (uint16_t) EepromReadByte(pdata);

if (crc == ref_crc)

{

return VALID;

}

else

{

return INVALID;

}

}

/*******************************************************************

*函数名称:unsigned char CheckWriteCRC(unsigned char *pdata,unsigned char packsize)

*函数功能:为EEPROM数据写CRC校验码

*输入参数:pdata:数组指针;packsize:数据长度

*返回参数:操作成功否?,成功:VALID,失败:INVALID

*编写作者:my_avr

*编写时间:2007年8月21日

*相关说明:

********************************************************************/

unsigned char CheckWriteCRC(unsigned char *pdata,unsigned char packsize)

{

unsigned char i,j;

unsigned int crc;

crc = 0;

for (i = 0; i < (packsize - 2); i ++)

{

crc = crc ^ ((uint16_t) EepromReadByte(pdata) < 8);

for (j = 0; j < 8; j++)

{

if (crc & 0x8000)

{

crc = (crc < 1) ^ 0x1021;

}

else

{

crc = crc < 1;

}

}

pdata ++;

}

EepromWriteByte(pdata,(uint8_t) (crc>>8));

pdata ++;

EepromWriteByte(pdata,(uint8_t) crc);

pdata ++;

if (EepromCheck((pdata - packsize),packsize))

{

return VALID;

}

else

{

return INVALID;

}

}

/********************************************************************

*函数名称:unsigned char CheckAllPage(void)

*函数功能:检查EEPROM数据是否有效,检查三个备份

*输入参数:无

*返回参数:操作成功否?,成功:VALID,失败:INVALID

*编写作者:my_avr

*编写时间:2007年8月21日

*相关说明:

********************************************************************/

uint8_t CheckAllPage(void)

{

if ((EepromCheck((unsigned char *)EepromPage1Add,EepromPageSize) == VALID)

&&(EepromCheck((unsigned char *)EepromPage2Add,EepromPageSize) == VALID)

&&(EepromCheck((unsigned char *)EepromPage3Add,EepromPageSize) == VALID))

{

return VALID;

}

return INVALID;

}

/*******************************************************************

*函数名称:unsigned char DataRecover(void)

*函数功能:检查EEPROM数据是否被破坏,如果被破坏了,作数据恢复

*输入参数:无

*返回参数:操作成功否?,成功:VALID,失败:INVALID

*编写作者:my_avr

*编写时间:2007年8月21日

*相关说明:

********************************************************************/

uint8_t DataRecover(void)

{

unsigned char i;

unsigned char temp;

unsigned char page;

unsigned int invalidpage[3];

unsigned int validpage;

invalidpage[0] = 0;

invalidpage[1] = 0;

invalidpage[2] = 0;

validpage = 0;

temp = 0;

page = 0;

if (EepromCheck((uint8_t *)EepromPage1Add,EepromPageSize) == VALID)

{

validpage = EepromPage1Add;

}

else

{

invalidpage = EepromPage1Add;

page ++;

}

if (EepromCheck((uint8_t *)EepromPage2Add,EepromPageSize) == VALID)

{

validpage = EepromPage2Add;

}

else

{

invalidpage = EepromPage2Add;

page ++;

}

if (EepromCheck((uint8_t *)EepromPage3Add,EepromPageSize) == VALID)

{

validpage = EepromPage3Add;

}

else

{

invalidpage = EepromPage3Add;

page ++;

}

if (page == 3) //三个备份都被破坏了

{

return INVALID; //数据完全无效了

}

while ((page--) > 0) //数据恢复

{

for (i = 0; i < EepromPageSize; i ++)

{

temp = EepromReadByte((uint8_t *) (validpage + i));

EepromWriteByte((uint8_t *) (invalidpage + i),temp);

}

}

if (CheckAllPage() == VALID)

{

return VALID;

}

return INVALID;

}

使用方法(三

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top