1.24C02介紹
24C02 現(xiàn)在基本是開(kāi)發(fā)板的標(biāo)配,對(duì)于需要掉電存儲(chǔ)的應(yīng)用來(lái)說(shuō)確是不二選擇。現(xiàn)在單片機(jī)因?yàn)閮?nèi)部集成了Flash存儲(chǔ)器,一般也都支持?jǐn)?shù)據(jù)的掉電保存,但相對(duì)于 24C02 這種 EEPROM 來(lái)說(shuō),使用單片機(jī)內(nèi)部的 Flash 有一些需要注意的問(wèn)題:
a.Flash 寫(xiě)入數(shù)據(jù)之前需要先執(zhí)行擦除操作,而且擦除以扇區(qū)為單位。
b.Flash讀寫(xiě)次數(shù)比 EEPROM 少很多。
c.容易誤操作,把 Flash 內(nèi)部的代碼擦除掉。
d.影響中斷的響應(yīng)時(shí)間。
24C02 有 256 字節(jié)的數(shù)據(jù),一般說(shuō)來(lái)也夠用了。它的地址是可以通過(guò)引腳配置的,這樣一條 I2C 總線上就可以掛多個(gè) 24C02。如下:
我們把 A2,A1,A0 都接地,這樣地址為 A0。然后 SCL,SDA 腳接 MCU 的 PB8 和 PB9。需要注意 SCL,和 SDA 需要加上拉電阻。
2.代碼
下面我們?cè)谝粋€(gè) I2C 例程上面修改代碼來(lái)實(shí)現(xiàn) 24C02 的讀寫(xiě)。大家可以看到使用庫(kù)函數(shù)的好處,基本上不用看 STM32F030 的手冊(cè),很快就能實(shí)現(xiàn)我們想要實(shí)現(xiàn)的功能。我們用 Keil 打開(kāi)下面這個(gè)工程:
STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\I2C\I2C_TwoBoards_ComPolling\MDK-ARM\Project.uvprojx
Step 1, 把 I2C 地址改為跟我們硬件一致:
Step 2, 根據(jù)實(shí)際使用的 I2C 模塊和引腳進(jìn)行配置:
Step 3, 把地址模式改為 7BIT:
Step 4, 操作EEPROM,我們不使用例子中的 HAL_I2C_Master_Transmit 和 HAL_I2C_Master_Receive,這兩個(gè)函數(shù)適用于兩個(gè) I2C 器件之間進(jìn)行數(shù)據(jù)傳輸。我們這里要用的是下面這兩個(gè)函數(shù):
在此我們寫(xiě)入數(shù)據(jù)用的 24C02 的 Page Write 命令,每次寫(xiě)入 8個(gè)字節(jié)的數(shù)據(jù),然后存儲(chǔ)器寫(xiě)入地址加 8。要注意每次執(zhí)行完寫(xiě)入命令后,需要有一個(gè)延時(shí),等待 EEPROM 內(nèi)部處理完該指令后才能繼續(xù)寫(xiě)入。這個(gè)延時(shí)要查手冊(cè),不同的廠家可能有不同的數(shù)值。讀出時(shí)可以連續(xù)的讀出數(shù)據(jù),無(wú)需等待。
下面是寫(xiě)入數(shù)據(jù)的波形,0xA0 是器件地址,0x28 是 24C02 內(nèi)部存儲(chǔ)器地址,之后是 8個(gè)字節(jié)數(shù)據(jù)。
讀出數(shù)據(jù)的波形:
注意:
在使用硬件 I2C 操作時(shí),有時(shí)候會(huì)遇到死鎖問(wèn)題。在此情況下,可以把 SCL,SDA 引腳初始化為 GPIO,如此例中的 PB8, PB9 然后連續(xù)翻轉(zhuǎn) SCL 引腳送出 9 個(gè)時(shí)鐘脈沖,既可以使 I2C 從死鎖的狀態(tài)復(fù)位。然后再重新初始化 I2C 模塊,進(jìn)入正常 I2C 操作。
審核編輯:劉清
-
EEPROM
+關(guān)注
關(guān)注
9文章
1027瀏覽量
81770 -
Flash存儲(chǔ)器
+關(guān)注
關(guān)注
3文章
105瀏覽量
25804 -
GPIO
+關(guān)注
關(guān)注
16文章
1215瀏覽量
52224 -
STM32F030
+關(guān)注
關(guān)注
1文章
33瀏覽量
6696
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論