版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
精品文檔-下載后可編輯關(guān)于IIC通信協(xié)議的理解-設(shè)計應(yīng)用前段時間,一直在調(diào)SDRAM與VGA的驅(qū)動,搞了很長一段時間,參考了很多資料,終終于思路理清了,不過鑒于手上沒有相關(guān)的硬件電路,所以暫時擱置了,回歸正題,先來看IIC之間的通信吧。
首先,IIC通信與UART,還有SPI統(tǒng)稱為串行接口通信,不過它們之間還是有區(qū)別的,如UART的負電平邏輯,還有UART通信不需要時鐘,只需要特定的波特率即可,SPI與IIC都可以有一個主機,多個從機的情況,不過IIC適用于短距離傳輸,如片間通信,攝像頭的配置等場景。
要搞定IIC首先來看IIC的硬件接口:
如圖所示,我們知道IIC一個主機可以懸掛多個從機,所以地址線A2,A1,A0可以實行片選的功能,那么WP這個引腳的功能就是當WP懸空或者接地的時候,表示這時的EEPROM既可以讀,也可以寫,當WP接電源時,則只可以讀而不能寫。
SCL與SDL這兩個引腳,必須上拉,否則驅(qū)動能力不夠,無法進行正常的IIC通信。
OK,硬件接口已經(jīng)介紹清楚了,那么我們現(xiàn)在開始來看協(xié)議了。
首先IIC分為字節(jié)讀寫和頁面讀寫,首先來看字節(jié)讀寫的協(xié)議:
如上圖所示,如果我們要向EEPROM中寫入一個字節(jié)的數(shù)據(jù),得有如下幾個步驟:
1.開始信號——在SCLK的高電平器件,拉低SDA的信號(由1變?yōu)?)。
2.控制字節(jié)——即器件地址,就是你操作那一塊EEPROM。
3.ACK信號——由從機發(fā)出,主機為接收,所以在此階段,sda_link必須置為0,即為讀取這個應(yīng)答信號,所以在SCLK的高點平期間。
4.字節(jié)地址——即某一塊EEPROM里面的哪一個地址。
5.ACK信號——與上述相同。
6.數(shù)據(jù)信號——即你往某個地址里面寫入的8位數(shù)據(jù)。
7.ACK信號——上述相同。
8.結(jié)束信號——在SCLK的高電平期間,拉高SDA信號,表示通信結(jié)束。
再來看讀的時序:
由上圖可看出讀時序的前面處理方式與寫相同,不同的時在第三個ACK信號來了之后,如果是讀,那么會又有一個起始信號,緊接著讀器件地址,然后應(yīng)答,再然后讀數(shù)據(jù),再然后在SCLK的低電平期間發(fā)送一個NOACK信號,要記住這個信號由主機發(fā)出,然后緊接著一個結(jié)束信號。
由上述讀寫時序我們可知,通信的起始均在SCLK的高電平期間發(fā)生跳變,這就據(jù)定了我們其他信號跳變均在SCLK的下降沿,SCLK高電平期間數(shù)據(jù)穩(wěn)定,適用于讀(即低電平改變數(shù)據(jù),高電平采集數(shù)據(jù))。
具體過程如下:
首先板子上電來個初始化需要來個延時,具體多少用計數(shù)器自己搞定。
代碼如下:
reg[6:0]hadware_initial_delay;
wirehadware_initial_delay_done;
always@(posedgeclkornegedgerst_n)
if(!rst_n)
hadware_initial_delay=7’d0;
else
if(hadware_initial_delay=7’d49)
hadware_initial_delay=hadware_initial_delay+1;else
hadware_initial_delay=hadware_initial_delay;assignhadware_initial_delay_done=(hadware_initial_delay==7’d50)?1’b1:1’b0;OK,我們要知道IIC的速率一般就幾百KH而我們的系統(tǒng)時鐘為50M,所以需要分頻:
代碼如下:
reg[8:0]sclk_cnt;
always@(posedgeclkornegedgerst_n)
if(!rst_n)
sclk_cnt=9’d0;
else
if(hadware_initial_delay_done)
begin
if(sclk_cnt9’d499)
sclk_cnt=sclk_cnt+1;
else
sclk_cnt=0;
end
assignsclk=(sclk_cnt=9’d249)?1’b1:1’b0;OK,我們知道SCLK高電平期間采集數(shù)據(jù),低電平期間改變數(shù)據(jù),那么當然,這個“期間”肯定時時鐘沿中間啦,畢竟更容易滿足建立時間與保持時間,很穩(wěn)定的。
具體代碼如下:
wiresclk_posedge_middle=(sclk_cnt==9’d124)?1’b1:1’b0;wiresclk_negedge_middle=(sclk_cnt==9’d374)?1’b1:1’b0;OK,讀寫定義了那么多個過程,當然需要狀態(tài)機來搞定啦,定義變量如下:
parameterIDLE=4’d0;
parameterSTART1=4’d1;
parameterADD1=4’d2;
parameterACK1=4’d3;
parameterADD2=4’d4;
parameterACK2=4’d5;
parameterDATA=4’d6;
parameterACK3=4’d7;
parameterSTOP1=4’d8;
parameterSTART2=4’d9;
parameterADD3=4’d10;
parameterACK4=4’d11;
parameterDATA_READ=4’d12;
parameterNO_ACK=4’d13;
parameterSTOP2=4’d14;
OK,再來個宏定義,假設(shè)寫入是這幾個地址,這幾個數(shù)據(jù)。
defineDEVICE_READ8b1010_0001
defineDEVICE_WRITE8’b1010_0000
defineWRITE_DATA8b0001_0001
defineBYTE_ADDR8’b0000_0011
SDA雙向端口,這個記住,一般這樣搞;
regsda_link;
regsda_out_r;
assignsda=sda_link?sda_out_r:1’bz;
當作為輸出時,對吧,使sda_link拉高,作為輸入時,輸入高阻。
各過程如下:
reg[3:0]current_state;
//reg[3:0]next_state;
reg[7:0]db_r;
reg[3:0]num;
reg[7:0]data_out_reg;
always@(posedgeclkornegedgerst_n)
if(!rst_n)
begin
sda_link=0;
db_r=0;
num=0;
current_state=IDLE;
sda_out_r=0;
data_out_reg=8’b0;
end
else
begin
case(current_state)
IDLE:begin
sda_out_r=1;
sda_link=1;
if(!sw1_r||!sw2_r)
current_state=START1;
else
current_state=IDLE;
end
START1:if(sclk_posedge_middle)
begin
sda_out_r=0;
db_r=`DEVICE_WRITE;
current_state=ADD1;
end
else
current_state=START1;
ADD1:
if(sclk_negedge_middle)
begin
if(num==4d8)
begin
sda_link=0;
num=0;
current_state=ACK1;
sda_out_r=1;
end
else
begin
current_state=ADD1;
sda_out_r=db_r[7-num];
num=num+1;
end
end
else
current_state=ADD1;
ACK1:
if(sclk_posedge_middle)
//begin
//if(!sda)
//begin
begin//*/current_state=ADD2;
db_r=`BYTE_ADDR;
end
else
current_state=ACK1;
ADD2:begin
sda_link=1;
if(sclk_negedge_middle)begin
if(num==4d8)
begin
sda_link=0;
current_state=ACK2;
num=4d0;
sda_out_r=1;
end
else
begin
num=num+1;
current_state=ADD2;
sda_out_r=db_r[7-num];
end
end
else
current_state=ADD2;
end
ACK2:
if(sclk_posedge_middle)
////begin
//if(!sda)
begin
begin
if(!sw1_r)
begin
db_r=`WRITE_DATA;
current_state=DATA;
end
else
if(!sw2_r)
begin
current_state=START2;
sda_out_r=1;
end
end
else
current_state=ACK2;
DATA:begin
sda_link=1;
if(sclk_negedge_middle)
begin
if(num==4d8)
begin
num=4d0;
current_state=ACK3;
sda_out_r=1;
sda_link=0;
end
else
begin
num=num+1;
current_state=DATA;
sda_out_r=db_r[7-num];
end
end
else
current_state=DATA;
end
ACK3:if(sclk_posedge_middle)
//begin
//if(!sda)
current_state=STOP1;
//end
STOP1:
begin
sda_link=1;
sda_out_r=0;
if(sclk_posedge_middle)
begin
sda_out_r=1;
if(sw1_r)
//你要是不等它松開才恢復(fù)初始狀態(tài),那么你一旦恢復(fù)初始狀態(tài)SW1_r就為低電平,他又開始寫了,所以為了避免重復(fù)寫入數(shù)據(jù)。
current_state=IDLE;
else
current_state=STOP1;
end
else
current_state=STOP1;
end
START2:begin
sda_link=1;
if(sclk_posedge_middle)
begin
sda_out_r=0;
sda_link=1;
db_r=`DEVICE_READ;
current_state=ADD3;
end
end
ADD3:begin
if(sclk_negedge_middle)
begin
if(num==4d8)
begin
num=0;
sda_link=0;
sda_out_r=1;
current_state=ACK4;
end
else
begin
num=num+1;
sda_out_r=db_r[7-num];
current_state=ADD3;
end
end
else
current_state=ADD3;
end
ACK4:
if(sclk_posedge_middle)
//begin
//if(!sda)
current_state=DATA_READ;
else
current_state=ACK4;
//end
DATA_READ:
begin
sda_link=0;
if(sclk_posedge_middle)
begin
if(num==4d8)
begin
sda_link=1;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電機與電氣控制技術(shù) 課件 項目5 交流電機控制電路的安裝、設(shè)計與調(diào)試
- 《GBT 21374-2008知識產(chǎn)權(quán)文獻與信息 基本詞匯》專題研究報告
- 《GBT 9984-2008工業(yè)三聚磷酸鈉試驗方法》專題研究報告
- 2026年甘肅慶陽市高職單招語文試題含答案
- 2026年廣東省廣州市輔警考試真題及答案
- 迪士尼施工安全培訓(xùn)課件
- 返工返崗安全培訓(xùn)內(nèi)容課件
- 食品衛(wèi)生知識試題及答案
- 車險知識課件演講
- 內(nèi)科主治醫(yī)師專項練習(xí)試題及答案
- 2025檢驗科個人年終工作總結(jié)
- 救護車急救護理查房
- 工程竣工移交單(移交甲方、物業(yè))
- 交熟食技術(shù)協(xié)議書
- 靜脈采血不良事件分析與改進
- JJF 2216-2025電磁流量計在線校準規(guī)范
- 2024-2025學(xué)年廣東省深圳市福田區(qū)六年級(上)期末數(shù)學(xué)試卷
- 發(fā)改價格〔2007〕670號建設(shè)工程監(jiān)理與相關(guān)服務(wù)收費標準
- 道岔滾輪作用原理講解信號設(shè)備檢修作業(yè)課件
- 小學(xué)師徒結(jié)對師傅工作總結(jié)
- 廉潔征兵培訓(xùn)課件
評論
0/150
提交評論