????????EEPROM 是一種掉電后數據不丟失的存儲器,常用來存儲一些配置信息,以便系統重新上電的時候加載之。 EEPOM 芯片最常用的通訊方式就是 I2C 協議,本小節以 EEPROM的讀寫實 驗為大家講解 STM32 的 I2C 使用方法。實驗中 STM32 的 I2C 外設采用主模式,分別用作主發送器和主接收器, 通過查詢事件的方式來確保正常通訊。
1 硬件設計
圖 1?EEPROM 硬件連接圖
????????本實驗板中的 EEPROM 芯片(型號: AT24C02)的 SCL 及 SDA 引腳連接到了 STM32 對應的 I2C 引腳中,結合上拉電阻,構成了 I2C 通訊總線,它們通過 I2C 總線交互。
????????EEPROM 芯片 的設備地址一共有 7 位,其中高 4 位固定為: 1010 b,低 3 位則由 A0/A1/A2信號線的電平決定,見圖 3,圖中的 R/W 是讀寫方向位,與地址無關。
圖 2 EEPROM 設備地址
????????按照我們此處的連接, A0/A1/A2 均為 0,所以 EEPROM 的 7 位設備地址是: 1010000b ,即 0x50。
????????由于 I2C 通訊時常常是地址跟讀寫方向連在一起構成一個 8 位數,且當R/W 位為 0 時,表示寫方向,所以加上 7 位地址,其值為“0xA0”,常稱該值為 I2C 設備的“寫地址”;當 R/W 位為 1 時,表示讀方向,加上 7 位地址,其值為“0xA1”,常稱該值為“讀地址”。
????????EEPROM 芯片中還有一個 WP 引腳,具有寫保護功能,當該引腳電平為高時,禁止寫入數據,當引腳為低電平時,可寫入數據,我們直接接地,不使用寫保護功能。
2 軟件設計
????????為了使工程更加有條理,我們把讀寫 EEPROM 相關的代碼獨立分開存儲,方便以后移植。在“工程模板”之上新建“bsp_i2c_ee.c”及“bsp_i2c_ee.h”文件,這些文件的命名不屬于 STM32 標準庫的內容,是由我們自己根據應用需要編寫的。
????????編程要點
????????(1) 配置通訊使用的目標引腳為開漏模式;
????????(2) 使能 I2C 外設的時鐘;
????????(3) 配置 I2C 外設的模式、地址、速率等參數并使能 I2C 外設;
????????(4) 編寫基本 I2C 按字節收發的函數;
????????(5) 編寫讀寫 EEPROM 存儲內容的函數;
????????(6) 編寫測試程序,對讀寫數據進行校驗。 以ByteWrite過程舉例(其余根據時序圖去編寫即可)
圖3 EEPROM 單字節寫入時序
????????產生I2C起始信號
????????設置超時等待時間
????????檢測 EV5 事件并清除標志(并設置超時等待)
????????發送 EEPROM 設備地址
????????檢測 EV6 事件并清除標志(并設置超時等待)
????????發送要寫入的 EEPROM 內部地址(即 EEPROM 內部存儲器的地址)
????????檢測 EV8 事件并清除標志(并設置超時等待)
????????發送一字節要寫入的數據
????????檢測 EV8 事件并清除標志(并設置超時等待)
????????發送停止信號
I2C 硬件相關宏定義
把 I2C 硬件相關的配置都以宏的形式定義到 “bsp-i2c-ee.h”文件中。
‘bsp-i2c-ee.h’
‘bsp-i2c-ee.c’
????????在 I2C 通訊的很多過程,都需要檢測事件,當檢測到某事件后才能繼續下一步的操作,但有時通訊錯誤或者 I2C 總線被占用,我們不能無休止地等待下去,所以我們設定每個事件檢測 都有等待的時間上限,若超過這個時間,我們就調用 I2C_TIMEOUT_UserCallback 函數輸出調試信息(或可以自己加其它操作),并終止 I2C通訊。
’main.c‘