治標(biāo)治本,徹底解決AVR單片機(jī)EEPROM數(shù)據(jù)丟失問題
/*******************************************************************
*函數(shù)名稱:EepromWriteBlock()
*函數(shù)功能:將緩沖區(qū)中的n個數(shù)據(jù)寫進(jìn)EEPROM
*輸入?yún)?shù):address:地址;data:數(shù)據(jù)
*返回參數(shù):
*編寫作者:my_avr
*編寫時(shí)間:2007年8月13日
*相關(guān)說明:
********************************************************************/
void EepromWriteBlock(unsigned char *buff,unsigned char *address,unsigned char n)
{
unsigned char i;
for (i = 0; i < n; i++)
{
EepromWriteByte((unsigned char *)(address + i),*buff);
buff++;
}
}
/******************************************************************
*函數(shù)名稱:unsigned char EepromCheck(unsigned char *pdata,unsigned char packsize)
*函數(shù)功能:檢查EEPROM的數(shù)據(jù)是否有效,采用CRC16校驗(yàn)技術(shù)。
一次校驗(yàn)?zāi)J(rèn)最后兩個字節(jié)為校驗(yàn)碼,
需要注意,packsize包括數(shù)據(jù)長度和校驗(yàn)碼字節(jié)
*輸入?yún)?shù):pdata:數(shù)組指針;packsize:數(shù)據(jù)長度
*返回參數(shù):數(shù)據(jù)是否有效,有效:VALID,無效:INVALID
*編寫作者:my_avr
*編寫時(shí)間:2007年8月21日
*相關(guān)說明:
********************************************************************/
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;
}
}
/*******************************************************************
*函數(shù)名稱:unsigned char CheckWriteCRC(unsigned char *pdata,unsigned char packsize)
*函數(shù)功能:為EEPROM數(shù)據(jù)寫CRC校驗(yàn)碼
*輸入?yún)?shù):pdata:數(shù)組指針;packsize:數(shù)據(jù)長度
*返回參數(shù):操作成功否?,成功:VALID,失?。篒NVALID
*編寫作者:my_avr
*編寫時(shí)間:2007年8月21日
*相關(guān)說明:
********************************************************************/
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;
}
}
/********************************************************************
*函數(shù)名稱:unsigned char CheckAllPage(void)
*函數(shù)功能:檢查EEPROM數(shù)據(jù)是否有效,檢查三個備份
*輸入?yún)?shù):無
*返回參數(shù):操作成功否?,成功:VALID,失?。篒NVALID
*編寫作者:my_avr
*編寫時(shí)間:2007年8月21日
*相關(guān)說明:
********************************************************************/
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;
}
關(guān)鍵詞:
AVR單片機(jī)EEPROM數(shù)據(jù)丟
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號放大器
評論