類似AT24C0x這類使用I2C讀寫的EEPROM,相信很多人都使用過(guò)。但后臺(tái)還是有很多相關(guān)的問(wèn)題,今天寫點(diǎn)相關(guān)內(nèi)容給大家。
1I2C讀寫EEPROM基礎(chǔ)原理
市面上大部分使用I2C通信的EEPROM,控制時(shí)序和讀寫流程都相同,或類似。我們最常見(jiàn)的就是AT24C0x這類EEPROM。
I2C通信原理,這個(gè)問(wèn)題關(guān)注我較早的朋友看過(guò)我分享的內(nèi)容,應(yīng)該很多使用MCU進(jìn)行底層開(kāi)發(fā),或者學(xué)習(xí)底層的朋友都知道I2C通信原理。
如果還有不明白I2C通信基礎(chǔ)的朋友,可以回看一下我之前分享的文章:
2.STM32F10x_硬件I2C讀寫EEPROM
以前寫文章沒(méi)怎么注重排版,閱讀體驗(yàn)不是很好,但內(nèi)容應(yīng)該還是寫到位了。
還有,文中的參考代碼在我“底部菜單”下載區(qū)可以找到。
2
EEPROM底層驅(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.寫,再讀,驗(yàn)證寫入成功
這種方法很好理解:寫入之后,再次讀去這部分?jǐn)?shù)據(jù),進(jìn)行一一匹配,驗(yàn)證是否與寫入數(shù)據(jù)一致。
一般我是會(huì)重復(fù)操作3次,也就是說(shuō):寫入,再讀取,如果超過(guò)3次都還失敗,那么我則放棄寫入,認(rèn)為寫入失敗,或芯片異常。
這個(gè)方法可以簡(jiǎn)單解決因異常導(dǎo)致寫入失敗的問(wèn)題。
2.添加校驗(yàn)信息
在上面一層讀驗(yàn)證基礎(chǔ)上,對(duì)保存一些參數(shù),我一般還會(huì):在參數(shù)末尾添加類似“和校驗(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寫10字節(jié)數(shù)據(jù),剛6個(gè)字節(jié)時(shí),線程B想要搶占,往EEPROM寫入數(shù)據(jù)。你覺(jué)得線程A應(yīng)不應(yīng)該放棄I2C總線,讓線程B寫入呢?
答案肯定是不允許的,所以,就有了互斥鎖這么一說(shuō)。也就是等先占用I2C總線的線程操作完,才釋放總線,讓其他線程進(jìn)行操作。
這三點(diǎn)應(yīng)該是我比較常用了,網(wǎng)上還有其他一些相關(guān)的容錯(cuò)處理機(jī)制,感興趣的不妨搜索一下。
我這里就不貼代碼了,因芯片型號(hào)不同,應(yīng)用不同,代碼就存在差異。但我們目的:在保證滿足應(yīng)用的同時(shí),需考慮代碼的移植、復(fù)用、以及容錯(cuò)。
3
硬件、軟件I2C
我們代碼應(yīng)該使用硬件I2C? 還是軟件模擬I2C?
這個(gè)問(wèn)題有許多朋友都在問(wèn),說(shuō)句實(shí)話,遇到這類有爭(zhēng)議的問(wèn)題,我一般還是保持中立。
我遇到這類問(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。
4
STM32硬件I2C問(wèn)題
相信很多朋友都知道這個(gè)問(wèn)題,在官網(wǎng)也能找到相關(guān)說(shuō)明,這里再描述一下吧。
問(wèn)題描述
如果沒(méi)有在傳輸當(dāng)前字節(jié)之前處理EV7、 EV7_1、 EV6_1、 EV2、 EV8和EV3事件,有可能產(chǎn)生問(wèn)題,如收到一個(gè)額外的字節(jié)、兩次讀到相同的數(shù)據(jù)或丟失數(shù)據(jù)。
暫時(shí)解決辦法
當(dāng)不能在傳輸當(dāng)前字節(jié)之前和當(dāng)改變ACK控制位送出相應(yīng)脈沖之前,處理EV7、EV7_1、EV6_1、EV2、EV8和EV3事件時(shí),建議如下操作:
1.使用I2C的DMA模式,除非作為主設(shè)備時(shí)只接收一個(gè)字節(jié)。
2.使用I2C的中斷并把它的優(yōu)先級(jí)設(shè)為最高級(jí)別,使得它不能被中斷。
-
EEPROM
+關(guān)注
關(guān)注
9文章
1033瀏覽量
81960 -
I2C
+關(guān)注
關(guān)注
28文章
1495瀏覽量
124599 -
字節(jié)
+關(guān)注
關(guān)注
0文章
41瀏覽量
13806
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
mark點(diǎn)定位的一般原理與步驟
軌到軌運(yùn)放與一般運(yùn)放的區(qū)別
安規(guī)一般測(cè)試幾項(xiàng)?
![安規(guī)<b class='flag-5'>一般</b>測(cè)試<b class='flag-5'>幾項(xiàng)</b>?](https://file1.elecfans.com/web3/M00/05/07/wKgZO2d7nB-Abi6EAAAthVoIbAQ338.png)
光譜傳感器的一般原理
請(qǐng)問(wèn)為ADC選Driver主要要看哪幾項(xiàng)技術(shù)指標(biāo)呢?
退耦電容一般用多大
eeprom存儲(chǔ)原理、存儲(chǔ)結(jié)構(gòu)及讀寫操作
差動(dòng)變壓器與一般變壓器的異同
請(qǐng)問(wèn)如何獲取當(dāng)前項(xiàng)目中所選的MCU設(shè)備?
PLC的工作電源一般是多少
PCBA加工報(bào)價(jià)一般的周期是多久
![PCBA加工報(bào)價(jià)<b class='flag-5'>一般</b>的周期是多久](https://file1.elecfans.com/web2/M00/B9/7A/wKgaomWLhGyALKYuAAGVqYhF96Q193.png)
通過(guò)Example創(chuàng)建我的項(xiàng)目時(shí)出現(xiàn)文件缺失的原因?
FLASH、EEPROM的區(qū)別和擴(kuò)展【硬件干貨】
![FLASH、<b class='flag-5'>EEPROM</b>的區(qū)別和擴(kuò)展【硬件干貨】](https://file1.elecfans.com/web2/M00/C3/41/wKgaomXhqmGAAJbEAABnDcLQGeM058.png)
評(píng)論