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

I2C讀寫(xiě)時(shí)序分析和實(shí)現(xiàn)思路

I2C協(xié)議以及I2C讀寫(xiě)EEPROM
使用I2C來(lái)對(duì)EEPROM進(jìn)行操作
如何通過(guò)i2c連續(xù)讀寫(xiě)eeprom?
用Verilog HDL實(shí)現(xiàn)I2C總線功能
PIC的一個(gè)讀寫(xiě)I2C程序
用Verilog HDL實(shí)現(xiàn)I2C總線功能

I2C—讀寫(xiě)EEPROM
STM32F10x _硬件I2C讀寫(xiě)EEPROM(標(biāo)準(zhǔn)外設(shè)庫(kù)版本)

STM32學(xué)習(xí)之I2C協(xié)議(讀寫(xiě)EEPROM)

評(píng)論