Verilog IIC通信實驗筆記
Write by Gianttank
我實驗的是 AT24C08的單字節讀,單字節寫,頁讀和頁寫,在高於3.3V系統中他的通信速率最高400KHZ的,我實驗里用的是100KHZ的速率。圖1是硬件原理圖
圖1
圖2
圖2是器件地址,我的原理圖是A2接高。
IIC通信協議中要注意的地方:
1. 當時鍾線SCL 高電平時,如果把數據線SDA 從高電平拉到低電平,則表示通信開始(START);如果把數據線SDA 從低電平拉到高電平,則表示通信結束(STOP)。SDA數據不變,視為數據采樣。
2. 前一個STOP 結束后。與下一個START開始要保證5ms的間隔。
3. 頁寫有字節限制,而頁讀沒有,可以一次讀出所有的數據。
4. SDA信號在FPGA為接受方時要設置為高阻態。
5. 應答信號永遠是接收方發送的,這個很重要,我就是卡在這里幾天沒找到原因。FPGA在讀數據的時候,第9個周期是FPGA發低電平給EEPROM的。
圖3
引腳定義
信號名稱 |
方向 |
描述 |
clk |
50M的主時鍾 |
|
rst_n |
input |
復位信號 |
sw1 |
input |
|
sw2 |
input |
按鍵2 低電平有效 按下執行字節讀 |
sw3 |
input |
|
sw4 |
input |
按鍵4 低電平有效 按下執行頁寫 |
SDA |
inout |
IIC數據端口 |
SCL |
IIC時鍾端口 |
|
leddata |
output |
數碼管段選 |
ledcom |
output |
數碼管位選 |
代碼中分了兩個模塊,iic_com 模塊除了執行和I2C 通信有關的代碼設計外,還有按鍵檢測部分,而ledshow 模塊只是驅動數碼管顯示讀出的數據。對於這個通信的過程,內部使用了一段式狀態機進行設計。圖4是狀態機的狀態圖。具體每個狀態見程序。
圖4
1.字節寫
圖5
藍色為sda數據線高阻態,fpga接受eeprom應答。寫入數據88h。
2.字節讀
圖6
3.頁寫
圖7
因為我只有8個數碼管,所以我程序里的頁寫,頁讀都只有4個數據。
可以看到寫入數據位21h,43h,65h,87h。
4.頁讀
圖8
Modelsim后仿真的圖
這里就是 應答是fpga應答給eeprom的。
最后希望這篇文檔能幫助對IIC協議還不夠了解的同學。
源程序在下一篇文章中。