• 正文
    • 1I²C讀寫(xiě)EEPROM基礎(chǔ)原理
    • 2EEPROM底層驅(qū)動(dòng)
    • 3I²C選擇硬件、軟件?
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

嵌入式開(kāi)發(fā) | EEPROM驅(qū)動(dòng)代碼常見(jiàn)操作

2022/03/02
383
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

相信很多讀者都使用過(guò)類(lèi)似AT24C0x這種使用I²C讀寫(xiě)的EEPROM,在項(xiàng)目中,使用不當(dāng)就容易導(dǎo)致數(shù)據(jù)丟失,或者異常的情況。

今天就來(lái)講講關(guān)于EEPROM的內(nèi)容。

1I²C讀寫(xiě)EEPROM基礎(chǔ)原理

市面上大部分使用I2C通信的EEPROM,控制時(shí)序和讀寫(xiě)流程都基本相同。

I²C通信原理,說(shuō)簡(jiǎn)單不簡(jiǎn)單,但說(shuō)難也不難,主要理解基礎(chǔ)原理和時(shí)序即可。

可以參看我分享的文章:通信教程 | I²C基礎(chǔ)原理及通信協(xié)議通信教程 | 詳述I²C總線時(shí)序通信教程 | I²C幾種速度及區(qū)別

2EEPROM底層驅(qū)動(dòng)

真正實(shí)際做過(guò)項(xiàng)目的人都知道,好的底層驅(qū)動(dòng),會(huì)給上層應(yīng)用開(kāi)發(fā)帶來(lái)很大便利,節(jié)省開(kāi)發(fā)時(shí)間,以及減少bug發(fā)生率。

而大部分初學(xué)者,或者應(yīng)屆畢業(yè)生從事相關(guān)開(kāi)發(fā),一般很少考慮代碼的移植性,復(fù)用性,或者說(shuō)容錯(cuò)處理等問(wèn)題。

下面,我簡(jiǎn)單列兩點(diǎn)我在項(xiàng)目中,對(duì)EEPROM常用的幾項(xiàng)操作。

1.寫(xiě),再讀,驗(yàn)證寫(xiě)入成功

這種方法很好理解:寫(xiě)入之后,再次讀去這部分?jǐn)?shù)據(jù),進(jìn)行一一匹配,驗(yàn)證是否與寫(xiě)入數(shù)據(jù)一致。

一般我是會(huì)重復(fù)操作3次,也就是說(shuō):寫(xiě)入,再讀取,如果超過(guò)3次都還失敗,那么我則放棄寫(xiě)入,認(rèn)為寫(xiě)入失敗,或芯片異常。

這個(gè)方法可以簡(jiǎn)單解決因異常導(dǎo)致寫(xiě)入失敗的問(wèn)題。

2.添加校驗(yàn)信息

在上面一層讀驗(yàn)證基礎(chǔ)上,對(duì)保存一些參數(shù),我一般還會(huì):在參數(shù)末尾添加類(lèi)似“和校驗(yàn)”,或“CRC校驗(yàn)”。

假如你連續(xù)存儲(chǔ)一個(gè)有10字節(jié)的參數(shù)(數(shù)據(jù)結(jié)構(gòu)),如果因異常修改了中間某一個(gè)字節(jié)參數(shù),你讀出來(lái)進(jìn)行校驗(yàn),發(fā)現(xiàn)不對(duì),則認(rèn)為這個(gè)參數(shù)無(wú)效。

添加這個(gè)校驗(yàn)的目的相信從上面我舉例已經(jīng)明白,就是解決多字節(jié)參數(shù)中某個(gè)字節(jié)被惡意修改,導(dǎo)致這個(gè)參數(shù)無(wú)效的問(wèn)題。

3.EEPROM在多任務(wù)中添加互斥鎖

使用過(guò)操作系統(tǒng)的朋友都知道,多線程訪問(wèn)一個(gè)資源,一般都存在互斥的關(guān)系。簡(jiǎn)單的說(shuō):一個(gè)資源,在同一時(shí)刻,只能被一個(gè)線程操作。

那EEPROM舉例:線程A在網(wǎng)EEPROM寫(xiě)10字節(jié)數(shù)據(jù),剛6個(gè)字節(jié)時(shí),線程B想要搶占,往EEPROM寫(xiě)入數(shù)據(jù)。你覺(jué)得線程A應(yīng)不應(yīng)該放棄I2C總線,讓線程B寫(xiě)入呢?

答案肯定是不允許的,所以,就有了互斥鎖這么一說(shuō)。也就是等先占用I2C總線的線程操作完,才釋放總線,讓其他線程進(jìn)行操作。

這三點(diǎn)應(yīng)該是我比較常用了,網(wǎng)上還有其他一些相關(guān)的容錯(cuò)處理機(jī)制,感興趣的不妨搜索一下。

我這里就不貼代碼了,因芯片型號(hào)不同,應(yīng)用不同,代碼就存在差異。但我們目的:在保證滿足應(yīng)用的同時(shí),需考慮代碼的移植、復(fù)用、以及容錯(cuò)。

3I²C選擇硬件、軟件?

我們代碼應(yīng)該使用硬件I2C?還是軟件模擬I2C?

這個(gè)問(wèn)題有許多朋友都在問(wèn),說(shuō)句實(shí)話,遇到這類(lèi)有爭(zhēng)議的問(wèn)題,一般來(lái)說(shuō),需要結(jié)合項(xiàng)目實(shí)際情況,比如速度、實(shí)時(shí)性、移植性等。

我遇到這類(lèi)問(wèn)題,一般會(huì)根據(jù)實(shí)際情況而定。比如:你的I2C產(chǎn)品要提供給一些不同平臺(tái)用戶,進(jìn)行二次開(kāi)發(fā),我覺(jué)得軟件IO模擬比較好,方便用戶嘛。

假如你們公司開(kāi)發(fā)的產(chǎn)品都使用STM32這家公司芯片開(kāi)發(fā)I2C產(chǎn)品,我覺(jué)得,你代碼可以使用硬件I2C。

作者 | strongerHuang

微信公眾號(hào) | strongerHuang

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫(xiě)文章/發(fā)需求
立即登錄

作者黃工,從事嵌入式軟件開(kāi)發(fā)工作8年有余,高級(jí)嵌入式軟件工程師,業(yè)余維護(hù)公眾號(hào)『strongerHuang』,分享嵌入式軟硬件、單片機(jī)、物聯(lián)網(wǎng)等內(nèi)容。