<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > avr EEPROM 數據丟失問(wèn)題 原因與解決方案

avr EEPROM 數據丟失問(wèn)題 原因與解決方案

作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò ) 收藏
總結一下引起AVR內部EEPROM數據丟失的原因:


1.程序問(wèn)題;
2.程序跑飛;
3.EEPROM相關(guān)寄存器因強磁場(chǎng)、高壓靜電等外部干擾出錯所產(chǎn)生的寫(xiě)入動(dòng)作;
4.系統有很大的感性負載,在斷電的時(shí)候會(huì )產(chǎn)生一個(gè)反向高壓,EEPROM有可能會(huì )自擦除。
……(還有什么原因,歡迎大家繼續列舉,以便完善及想辦法解決)

針對問(wèn)題1,程序問(wèn)題不再該文討論范圍內。

針對問(wèn)題2,程序跑飛,這個(gè)因該是引起EEPROM數據丟失的主要原因。但是引起程序跑飛的原因卻是多方面的。

第一.電壓不正常,工作不穩定,程序跑飛。針對這個(gè)問(wèn)題,可以開(kāi)啟內部BOD、或者外加復位芯片解決,在低功耗場(chǎng)合,外部復位是有必

要的,畢竟BOD功耗太高。

第二,晶體振蕩受干擾,頻率不穩定,程序跑飛。針對這個(gè)問(wèn)題,建議晶體使用全幅振蕩,并且走線(xiàn)的時(shí)候盡量短,并且使用地線(xiàn)隔離。

第三系統受外界環(huán)境干擾,修改了PC等寄存器,程序跑飛。針對這個(gè)干擾問(wèn)題,這個(gè)引起程序跑飛的可能性應該不大,如果環(huán)境實(shí)在惡劣

,那么就應該想到做電磁屏蔽,ESD保護等,如果還不行,那么只能建議換換別的單片機試試看了。

針對問(wèn)題3,我們只能優(yōu)化電路設置,盡量避免,比如加屏蔽罩,加ESD保護,加TVS保護,電源加電容退耦等等。

針對問(wèn)題4,如果系統真的具有很大的感性負載,那么請注意加續流二極管、濾波電容等做保護,不要讓這種反向高壓產(chǎn)生,無(wú)論如何,這

種因為感性負載突然斷電自激產(chǎn)生的高壓,不僅僅會(huì )對EEPROM有影響,而是對整個(gè)系統都存在威脅。

本文引用地址:http://dyxdggzs.com/article/201611/323304.htm

==============================================================================================================

經(jīng)過(guò)上面硬件上的一些處理,雖然EEPROM數據丟

失的可能已經(jīng)很小了,但是我們仍然不能保證EEPROM數據就不會(huì )丟失了。這時(shí)EEPROM數據的可*性,那就得從軟件上去考慮了,接著(zhù)我們從

軟件的方面繼續討論。

我的做法是,數據分塊,分區,校驗,備份。當然這里講的處理方法,僅僅是提供一種想法,你可以做不同數據長(cháng)度的分塊,不同大小的

分區,采用不同的地址映射方法,以及采用更多次的數據備份。下面以Mega168為例繼續討論。

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塊建議禁止使用。



關(guān)鍵詞: avrEEPROM數據丟

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>