相信很多小伙伴都使用過類似AT24C0x這種使用I2C讀寫的EEPROM,在項目中,使用不當就容易導致數據丟失,或者異常的情況。
今天,我們就來講講關于EEPROM的內容。
1I2C讀寫EEPROM基礎原理
市面上大部分使用I2C通信的EEPROM,控制時序和讀寫流程都基本相同。
I2C通信原理,說簡單不簡單,但說難也不難,主要理解基礎原理和時序即可。
可以參看我分享的文章:
I2C基礎原理及通信協議
詳述I2C總線時序
I2C幾種速度及區別
2EEPROM底層驅動
真正實際做過項目的人都知道,好的底層驅動,會給上層應用開發帶來很大便利,節省開發時間,以及減少bug發生率。
而大部分初學者,或者應屆畢業生從事相關開發,一般很少考慮代碼的移植性,復用性,或者說容錯處理等問題。
下面,我簡單列兩點我在項目中,對EEPROM常用的幾項操作。
1、先寫再讀,驗證寫入成功
這種方法很好理解:寫入之后,再次讀去這部分數據,進行一一匹配,驗證是否與寫入數據一致。
一般我是會重復操作3次,也就是說:寫入,再讀取,如果超過3次都還失敗,那么我則放棄寫入,認為寫入失敗,或芯片異常。
這個方法可以簡單解決因異常導致寫入失敗的問題。
2、添加校驗信息
在上面一層讀驗證基礎上,對保存一些參數,我一般還會:在參數末尾添加類似“和校驗”,或“CRC校驗”。
假如你連續存儲一個有10字節的參數(數據結構),如果因異常修改了中間某一個字節參數,你讀出來進行校驗,發現不對,則認為這個參數無效。
添加這個校驗的目的相信從上面我舉例已經明白,就是解決多字節參數中某個字節被惡意修改,導致這個參數無效的問題。
3、EEPROM在多任務中添加互斥鎖
使用過操作系統的朋友都知道,多線程訪問一個資源,一般都存在互斥的關系。簡單的說:一個資源,在同一時刻,只能被一個線程操作。
拿EEPROM舉例:線程A在往EEPROM寫10字節數據,剛6個字節時,線程B想要搶占,往EEPROM寫入數據。你覺得線程A應不應該放棄I2C總線,讓線程B寫入呢?
答案肯定是不允許的,所以,就有了互斥鎖這么一說。也就是等先占用I2C總線的線程操作完,才釋放總線,讓其他線程進行操作。
這三點應該是我比較常用了,網上還有其他一些相關的容錯處理機制,感興趣的不妨搜索一下。
我這里就不貼代碼了,因芯片型號不同,應用不同,代碼就存在差異。但我們目的:在保證滿足應用的同時,需考慮代碼的移植、復用、以及容錯。
3I2C選擇硬件、軟件?
我們代碼應該使用硬件I2C,還是軟件模擬I2C?
這個問題有許多朋友都在問,說句實話,遇到這類有爭議的問題,一般來說,需要結合項目實際情況,比如速度、實時性、移植性等。我遇到這類問題,一般會根據實際情況而定。比如:你的I2C產品要提供給一些不同平臺用戶,進行二次開發,我覺得軟件IO模擬比較好,方便用戶嘛。假如你們公司開發的產品都使用STM32這家公司芯片開發I2C產品,我覺得,你代碼可以使用硬件I2C。
審核編輯 :李倩
-
EEPROM
+關注
關注
9文章
1082瀏覽量
83305 -
I2C
+關注
關注
28文章
1535瀏覽量
127069 -
驅動代碼
+關注
關注
2文章
15瀏覽量
7720
原文標題:EEPROM驅動代碼常見操作有哪些?
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
請問可以將EEPROM和FPGA連接到FX3 I2C線路上嗎?
Cyusb3014接一塊I2C eeprom的情況下,A0、A1、A2的地址要設置嗎?
I2C EEPROM編程失敗的原因?
【RA-Eco-RA4M2開發板評測】I2C讀取EEPROM(二)
基于APM32F407如何制作I2C EEPROM(AT24C02型號)的MDK-Keil下載算法

EEPROM輕量級的簡易類文件的數據讀寫庫:EEPROMFS

TLV320AIC3263 i2c無法進行通信,通過i2c的讀寫函數,讀寫寄存器失敗怎么解決?
PCM1863為什么通過I2C無法讀取到寄存器值?
EEPROM讀寫程序詳解
eeprom存儲原理、存儲結構及讀寫操作
CYUSB3014通過I2C EEPROM啟動時,收到了I2C EEPROM編程失敗的錯誤信息怎么解決?
請問LED Drivber MAX25014 (I2C Control )是否內建EEPROM?
玩轉STM32和EV24C MCU + EEPROM ST + EVASH
【GD32F303紅楓派開發板使用手冊】第二十一講 I2C-EEPROM讀寫實驗

評論