I2C在芯片的配置中應用還是很多的,比如攝像頭、VGA轉HDMI轉換芯片,之前博主分享過一篇I2C協議的基礎學習IIC協議學習筆記,這篇就使用Verilog來實現EEPROM的讀寫,進行一個簡單的I2C實戰應用。
EEPROM
我使用的這個芯片是AT24C32,它手冊上還有一種AT24C64,其實操作都是一樣的,只是內存大小不同,AT24C32是32k(4096x8)AT24C64是64k(8192x8),
SCL設置為頻率200Khz
SCL clk posedge data輸入EEPROM
SCL clk negedge data輸出EEPROM
A2,A1,A0 Device Addr default all 0,只操作一片可懸空引腳。
WP 接地正常讀寫,WP接Vcc寫操作被禁止
字節尋址地址,是由12(AT24C32)或13bit(AT24C64)的地址組成,需要操作16位字地址高3或4位忽略即可。
Device Address 8’hA0寫器件地址,8’hA1讀器件地址
寫字節操作
隨機讀字節操作
我這個芯片是雙字節數據地址,所以在寫數據地址時要寫兩次,先是高字節后是低字節。
開始結束標志
這個I2C總線的時序是一致的。
EEPROM應答
輸出應答sclk的第九個周期給出,低電平應答。如果主機沒有收到應答,需要重新配置。
數據傳輸時序
sda數據線在scl時鐘的下降沿中間變化,可以避免產生誤觸開始結束標志。
I2C Design
i2c_start為高電平有效,傳輸完成后會產生一個i2c_done結束標志,表示操作完成。
I2C狀態轉移圖
I2C寫操作
(1)產生start位
(2)傳送器件地址ID_Address,器件地址的最后一位為數據的傳輸方向位,R/W,低電平0表示主機往從機寫數據(W),1表示主機從從機讀數據(R)。這里按照手冊給出的操作圖,應該是W即低電平。ACK應答,應答是從機發送給主機的應答,這里不用管。
(3)傳送寫入器件寄存器地址,即數據要寫入的位置。同樣ACK應答不用管。
(4)傳送要寫入的數據。ACK應答不用管。
(5)產生stop信號。
I2C讀操作
(1)產生start信號
(2)傳送器件地址(寫ID_Address),這里按照手冊給出的操作圖,最低位是W即低電平。ACK。
(3)傳送字地址(寫REG_Address),ACK。
(4)再次產生start信號
(5)再傳送一次器件地址,這里根據手冊最低位是讀R高電平,ACK。
(6)讀取一個字節的數據,讀數據最后結束前無應答ACK信號。
(7)產生stop信號。
讀寫操作的寫器件地址和寫數據地址操作是一樣的,狀態轉移圖中讀寫操作中這兩部分復用了,根據讀寫標志來判斷。
其他部分沒啥好說的根據時序圖寫就行了,需要注意的一點是我們應該在sclk的高電平的中間采樣數據,在sclk低電平的中間改變數據,當sclk為高電平的時候,sda為出現下降沿為start位, sda出現上升沿為stop位,所以在sclk為高電平的時候sda應該保持穩定不能隨意亂動。這就又回到了數據傳輸有效的條件,只有在sclk為低電平期間,才允許數據變化,在高電平期間,不允許數據變化,否則就會出現起始位或結束位。
EEPROM有個仿真模型,在夏雨聞老師的書里面就有,這個模型默認是200khz的sclk驅動,仿真的時候可以將時間參數改小,我這里也分享出來。
仿真模型代碼點擊閱讀原文可以查看。
根據仿真模型仿真的話基本不會有什么問題,需要注意的是操作的完成標志。從仿真上看到輸入讀寫都沒問題,但是stop標志沒產生好,仿真看到讀寫操作沒問題,但實際還是不行的,需要嚴格按照EEPROM的手冊操作時序進行,差一點就不行。
我最后使用撥碼開關作為讀寫使能,數碼管顯示讀出來的輸出,最后實現了對指定存儲地址讀寫數據。
-
Verilog
+關注
關注
28文章
1351瀏覽量
110298 -
EEPROM
+關注
關注
9文章
1033瀏覽量
81890
原文標題:基于FPGA的I2C讀寫EEPROM
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論