AVR內部EEPROM數據丟失問(wèn)題的原因與解決方案
1.Mega168EEPROM512字節,把EEPROM分為兩個(gè)區,每個(gè)區256個(gè)字節,然后以8個(gè)字節為一個(gè)段,那么每個(gè)區就有32段。
數據區:0x000-0x0FF
0段:0x000-0x007
1段:0x008-0x00F
……
31段:0x0F8-0x0FF
備份區:0x100-0x1FF
每個(gè)段8個(gè)字節,其中前6個(gè)字節為有效數據,后2個(gè)字節為CRC16校驗,數據格式下圖所示:
2.EEPROM讀寫(xiě)操作
EEPROM的操作以段為單位,
段寫(xiě)入函數:寫(xiě)數據到數據區時(shí),先計算數據CRC16校驗,然后同時(shí)把數據寫(xiě)入到數據區和備份區;
段讀取函數:讀取數據時(shí),同時(shí)讀取數據區以及備份區,如果數據區校驗有誤,備份區數據校驗正確,就用備份區數據恢復數據區數據;
如果備份區數據有誤,數據區數據正確,那么數據寫(xiě)入備份區重新備份;如果數據區備份區數據都有誤,那么返回讀取失敗。
3.數據區與備份區的對應關(guān)系
數據讀寫(xiě)操作以段進(jìn)行,內部的數據區與備份區怎么映射呢?為了防治數據與備份同時(shí)被意外修改,那么數據與備份地址空間相隔不能太
近,并且數據與備份的地址,應該盡量不同。假設數據地址為Data_Addr,備份地址為Bakup_Addr,我使用下面的函數映射地址:
Bakup_Addr=(Data_Addr+0x100)^0x03F
加0x100是把地址定義到備份區,與0x03F異或,是把低6bits取反,這樣處理,數據與備份的地址空間較遠,并且地址有7bits的不同。
例如,第3段的地址:0x018-0x01F,
對應的備份區為:0x127-0x120
如下圖所示:
4.讀寫(xiě)函數加入寫(xiě)保護判斷,在讀寫(xiě)EEPROM前關(guān)閉寫(xiě)保護,讀寫(xiě)完畢后,立即開(kāi)啟寫(xiě)保護,這樣可以有效防止程序跑飛造成的EEPROM意外修改
。
5.第0塊建議禁止使用。
評論