《基于FPGA 的 IIC設(shè)計(jì)》
設(shè)計(jì)背景:
IIC 簡(jiǎn)單來(lái)說(shuō),就是一種串行通信協(xié)議,IIC 的通信協(xié)議和通信接口在很多工程中有廣泛的應(yīng)用,如數(shù)據(jù)采集領(lǐng)域的串行 AD,圖像處理領(lǐng)域的攝像頭配置,工業(yè)控制領(lǐng)域的 X 射線(xiàn)管配置等等。除此之外,由于 IIC 協(xié)議占用的 IO 資源特別少,連接方便,所以工程中也常選用 IIC 接口做為不同芯片間的通信協(xié)議。
設(shè)計(jì)原理:
IIC 電路原理圖如下:

24LC64 各引腳定義:
1、A0,A1,A2 為 24LC64 的片選信號(hào),由于 IIC 總線(xiàn)可以?huà)燧d多個(gè) IIC 接口器件,所以每個(gè)器件都應(yīng)該有自己的“身份標(biāo)識(shí)”,通過(guò)對(duì) A0,A1,A2 輸入不同的高低電平,就可以設(shè)置該 EEPROM 的片選信號(hào)。
2、WP 為讀寫(xiě)使能信號(hào),當(dāng) WP 懸空或者接地,EEPROM 可讀可寫(xiě),當(dāng) WP 接電源,EEPROM 只能讀不能寫(xiě)。
3、SCL 為 IIC 接口的時(shí)鐘線(xiàn)。
4、SDA 為 IIC 接口的數(shù)據(jù)線(xiàn)。
IIC 接口的讀寫(xiě)時(shí)序:
IIC 接口讀寫(xiě)時(shí)序分為隨機(jī)讀寫(xiě)(單字節(jié)讀寫(xiě))和頁(yè)面讀寫(xiě)(多字節(jié)讀寫(xiě)),先分析隨機(jī)讀寫(xiě)(Byte Write/Read)時(shí)序。Byte Write 時(shí)序如下:

時(shí)序解讀:如果我們要向 EEPROM 寫(xiě)入一個(gè)字節(jié),那么必須經(jīng)過(guò)以下步驟:
1. 發(fā)送啟動(dòng)信號(hào)
2. 發(fā)送控制字
3. 接收并檢測(cè) EEPROM 發(fā)來(lái)的應(yīng)答信號(hào) ACK
4. 發(fā)送高字節(jié)地址位
5. 接收并檢測(cè) EEPROM 發(fā)來(lái)的應(yīng)答信號(hào) ACK
6. 發(fā)送低字節(jié)地址位
7. 接收并檢測(cè) EEPROM 發(fā)來(lái)的應(yīng)答信號(hào) ACK
8. 發(fā)送 8bit 有效數(shù)據(jù)
9. 接收并檢測(cè) EEPROM 發(fā)來(lái)的應(yīng)答信號(hào) ACK
10.發(fā)送停止信號(hào)
Byte Read 時(shí)序如下:

時(shí)序解讀:如果我們要從 EEPROM 讀出一個(gè)字節(jié),那么必須經(jīng)過(guò)以下步驟:
1. 發(fā)送啟動(dòng)信號(hào)
2. 發(fā)送控制字 1010_A2A1A0_0
3. 接收并檢測(cè) EEPROM 發(fā)來(lái)的應(yīng)答信號(hào) ACK
4. 發(fā)送高字節(jié)地址位
5. 接收并檢測(cè) EEPROM 發(fā)來(lái)的應(yīng)答信號(hào) ACK
6. 發(fā)送低字節(jié)地址位
7. 接收并檢測(cè) EEPROM 發(fā)來(lái)的應(yīng)答信號(hào) ACK
8. 發(fā)送啟動(dòng)信號(hào)
9. 發(fā)送控制字 1010_A2A1A0_1
10. 接收并檢測(cè) EEPROM 發(fā)來(lái)的應(yīng)答信號(hào) ACK
11. 讀取一個(gè)字節(jié)數(shù)據(jù)
12. 發(fā)送 NO ACK 信號(hào)
13. 發(fā)送停止信號(hào)
接下來(lái)則需要分析各步驟具體意義:
1.啟動(dòng)信號(hào)

在 SCL 保持高電平期間,如果 SDA 出現(xiàn)由高到低的跳變沿,代表啟動(dòng)信號(hào)
2. 控制字
我們的控制字為 1010_0000,其中 1010 為 EEPROM 的型號(hào)標(biāo)識(shí),為一組固定的序列,緊接著 A2,A1,A0 就是我們的片選信號(hào),最后一位為讀寫(xiě)控制位,低電平代表寫(xiě),高電平代表讀,我們這里首先需要對(duì) EEPROM 寫(xiě)入地址位,所以我們最后一位為 0。
3. 高/低位地址
由于 24LC64 有 64Kbit 的存儲(chǔ)空間,所以我們需要 13 位的地址位寬才能尋址所有的存儲(chǔ)空間,由于 IIC 協(xié)議規(guī)定只能以字節(jié)形式寫(xiě)入,所以必須將 13 位的地址擴(kuò)展為 16 位的地址,分為高八位和低八位,多出來(lái)的前三位填充任意數(shù)據(jù)即可,對(duì)我們的尋址地址沒(méi)有影響。
3. 停止信號(hào)
4. 應(yīng)答信號(hào) ACK
應(yīng)答信號(hào)是由數(shù)據(jù)接收方發(fā)出的,當(dāng) SCL 為高電平期間,如果監(jiān)測(cè)到 SDA 為低電平,說(shuō)明有應(yīng)答信號(hào)。
5. 非應(yīng)答信號(hào) NO ACK
非應(yīng)答信號(hào)也是由數(shù)據(jù)接收方發(fā)出的,當(dāng) SCL 為高電平期間,如果 SDA 為高電平,說(shuō)明有非應(yīng)答信號(hào)。
說(shuō)明:由于 IIC 總線(xiàn)協(xié)議啟動(dòng)和停止信號(hào)都是在 SCL 高電平期間發(fā)生跳變,這就決定了我們其他數(shù)據(jù)的改變只能發(fā)生在 SCL 低電平期間,在 SCL 為高電平期間,數(shù)據(jù)必須保持穩(wěn)定。即在 SCL 低電平改變數(shù)據(jù),在 SCL 高電平采集數(shù)據(jù)。相比于單字節(jié)讀寫(xiě),頁(yè)面讀寫(xiě)只是增加了幾個(gè)狀態(tài),具體時(shí)序如下,這里和后面的設(shè)計(jì)代碼不做詳細(xì)論述。
Page Write 時(shí)序如下:

Page Read 時(shí)序如下:

設(shè)計(jì)架構(gòu)圖:
本設(shè)計(jì)用兩個(gè)按鍵控制 EEPROM 讀寫(xiě),當(dāng)寫(xiě)按鍵按下時(shí),向EEPROM 某一固定地址寫(xiě)入一個(gè)字節(jié)數(shù)據(jù),當(dāng)讀按鍵按下時(shí),將該地址數(shù)據(jù)讀出,并顯示到數(shù)碼管,LED 燈是一個(gè)標(biāo)志信號(hào),LED 亮說(shuō)明數(shù)據(jù)寫(xiě)入完畢。設(shè)計(jì)架構(gòu)如下:

設(shè)計(jì)代碼:
iic_wr 模塊代碼:負(fù)責(zé)進(jìn)行 IIC 數(shù)據(jù)的讀寫(xiě)
seg7_lut 模塊代碼,負(fù)責(zé)數(shù)碼管顯示
IIC 頂層模塊代碼:
tb 頂層測(cè)試模塊代碼:
仿真圖:
隨機(jī)讀寫(xiě),仿真寫(xiě)時(shí)序:
隨機(jī)讀寫(xiě),仿真讀時(shí)序:
在仿真時(shí),需要將檢測(cè)應(yīng)答的狀態(tài)跳過(guò),直接向下一狀態(tài)跳轉(zhuǎn),觀(guān)察讀寫(xiě)時(shí)序,當(dāng)讀寫(xiě)按鍵按下時(shí),都會(huì)產(chǎn)生對(duì)應(yīng)的動(dòng)作。
責(zé)任編輯:lq
-
FPGA
+關(guān)注
關(guān)注
1660文章
22427瀏覽量
636818 -
IIC
+關(guān)注
關(guān)注
11文章
309瀏覽量
40664 -
工業(yè)控制
+關(guān)注
關(guān)注
38文章
1666瀏覽量
91610
原文標(biāo)題:FPGA入門(mén)課程《基于 FPGA 的 IIC設(shè)計(jì)》
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
IIC的正確用法
【瑞薩RA × Zephyr開(kāi)發(fā)板評(píng)測(cè)】+模擬IIC實(shí)現(xiàn)OLED輸出(與硬件IIC輸出的失敗經(jīng)驗(yàn))
RA MCU眾測(cè)寶典 | IIC之【RA2E1】IIC通信的OLED顯示
通信協(xié)議IIC與SPI最全對(duì)比分析
英諾達(dá)亮相IIC Shenzhen 2025
基于hbirdv2-sdk的iic 0.96寸lcd調(diào)試
請(qǐng)問(wèn)IIC的設(shè)備驅(qū)動(dòng)兼容SMbus協(xié)議嗎?
智多晶FPGA設(shè)計(jì)工具HqFpga接入DeepSeek大模型
如何從FX2LP設(shè)備的EEPROM讀取固件(.iic)?
用IIC接口的IIC_SCL和IIC_SDA引腳做普通GPIO,程序啟動(dòng)不起來(lái)怎么解決?
ZYNQ FPGA的PS端IIC設(shè)備接口使用
《基于FPGA的IIC設(shè)計(jì)》
評(píng)論