FPGA基礎(chǔ)知識之IIC協(xié)議讀寫解析_第1頁
FPGA基礎(chǔ)知識之IIC協(xié)議讀寫解析_第2頁
FPGA基礎(chǔ)知識之IIC協(xié)議讀寫解析_第3頁
FPGA基礎(chǔ)知識之IIC協(xié)議讀寫解析_第4頁
FPGA基礎(chǔ)知識之IIC協(xié)議讀寫解析_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

FPGA基礎(chǔ)知識之IIC協(xié)議讀寫解析很多數(shù)字傳感器、數(shù)字控制的芯片(DDS、串行ADC、串行DAC)都是通過IIC總線來和控制器通信的。不過IIC協(xié)議仍然是一種慢速的通信方式,標(biāo)準(zhǔn)IIC速率為100kbit/s,快速模式速率為400kbit/s。本文致力于講述如何用計數(shù)器控制和分頻時鐘控制兩種方式完成IIC的讀寫操作。IIC協(xié)議IIC協(xié)議是一種多機通訊,由SDA數(shù)據(jù)線和SCL時鐘線構(gòu)成串行總線,所有的IIC設(shè)備都可以掛載到總線上,但每個設(shè)備都有唯一的設(shè)備讀地址和設(shè)備寫地址。在使用IIC作為數(shù)字接口的芯片datasheet中都可以看到該設(shè)備的設(shè)備讀/寫地址情況,并可以查找到相應(yīng)的讀寫時序,以及對速率的要求。下圖是一個通用的IIC協(xié)議時序:我們可以總結(jié)出五種IIC協(xié)議的時序狀態(tài):

??1.空閑狀態(tài),當(dāng)SDA和SCL兩條信號線都處于高電平時總線處于空閑狀態(tài)。

??2.開始信號,SCL為高電平期間SDA信號線上產(chǎn)生了下降沿標(biāo)志著的一次數(shù)據(jù)傳輸?shù)拈_始。開始信號應(yīng)當(dāng)由主機發(fā)起。

??3.數(shù)據(jù)傳輸,在SCL同步控制下SDA串行的傳送每一位,因此傳送8bits的數(shù)據(jù)需要8個SCL時鐘。SCL為高電平時期SDA電平狀態(tài)必須穩(wěn)定;SCL為低電平期間才允許SDA改變狀態(tài)。

??4.應(yīng)答信號,IIC總線上每傳送一個8位字節(jié),第9個脈沖期間便會釋放總線,由接收器發(fā)出一個應(yīng)答信號,反饋有沒有成功接收。

??5.停止信號,在SCL保持高電平期間,將SDA信號線釋放恢復(fù)到高電平,標(biāo)志一次數(shù)據(jù)傳輸?shù)慕Y(jié)束,IIC總線也重新回到了空閑狀態(tài)。計數(shù)器控制IIC讀寫在“FPGA基礎(chǔ)設(shè)計(三):UART串口通信”中已經(jīng)接觸到了使用計數(shù)器控制時序的方法,這個方法在控制IIC通信時同樣實用。一次完整的寫入操作如下所示:case(i)0://iicStartbeginisOut《=1;//SDA端口輸出if(C1==0)rSCL《=1‘b1;elseif(C1==200)rSCL《=1’b0;//SCL由高變低if(C1==0)rSDA《=1‘b1;elseif(C1==100)rSDA《=1’b0;//SDA先由高變低if(C1==250-1)beginC1《=9‘d0;i《=i+1’b1;endelseC1《=C1+1‘b1;end1://WriteDeviceAddrbeginrData《={4’b1010,3‘b000,1’b0};i《=5‘d7;Go《=i+1’b1;end2://WirteWordAddrbeginrData《=Addr_Sig;i《=5‘d7;Go《=i+1’b1;end3://WriteDatabeginrData《=WrData;i《=5‘d7;Go《=i+1’b1;end4://iicStopbeginisOut《=1‘b1;if(C1==0)rSCL《=1’b0;elseif(C1==50)rSCL《=1‘b1;//SCL先由低變高if(C1==0)rSDA《=1’b0;elseif(C1==150)rSDA《=1‘b1;//SDA由低變高if(C1==250-1)beginC1《=9’d0;i《=i+1‘b1;endelseC1《=C1+1’b1;end5:beginisDone《=1‘b1;i《=i+1’b1;end//寫I2C結(jié)束6:beginisDone《=1‘b0;i《=5’d0;end7,8,9,10,11,12,13,14://發(fā)送DeviceAddr/WordAddr/WriteDatabeginisOut《=1‘b1;rSDA《=rData[14-i];//高位先發(fā)送if(C1==0)rSCL《=1’b0;elseif(C1==50)rSCL《=1‘b1;elseif(C1==150)rSCL《=1’b0;if(C1==F250K-1)beginC1《=9‘d0;i《=i+1’b1;endelseC1《=C1+1‘b1;end15://waitingforacknowledgebeginisOut《=1’b0;//SDA端口改為輸入if(C1==100)isAck《=SDA;if(C1==0)rSCL《=1‘b0;elseif(C1==50)rSCL《=1’b1;elseif(C1==150)rSCL《=1‘b0;if(C1==F250K-1)beginC1《=9’d0;i《=i+1‘b1;endelseC1《=C1+1’b1;end16:if(isAck!=0)i《=5‘d0;elsei《=Go;endcase向IIC總線寫數(shù)據(jù)時,需要依次寫入待寫入的設(shè)備寫地址、設(shè)備中的寫地址和待寫入的數(shù)據(jù)共3個8bits字節(jié)數(shù)據(jù)。i代表總線上不同的狀態(tài),通過計數(shù)器來控制狀態(tài)之間的跳轉(zhuǎn)。i為0時發(fā)出開始信號;i為7~14時控制8bits數(shù)據(jù)的發(fā)送;i為1、2、3時分別為設(shè)備地址、字節(jié)地址和數(shù)據(jù),依次調(diào)用7-14完成數(shù)據(jù)的傳輸;其余還有停止位、應(yīng)答位、IIC通信完成置位等狀態(tài)。從器件中讀取數(shù)據(jù)的方法與此一樣,只不過通常都需要先向IIC總線寫入待讀取的設(shè)備地址和器件地址,之后再讀數(shù)據(jù)。讀數(shù)據(jù)整體過程比寫數(shù)據(jù)要麻煩一點,但只要控制好狀態(tài)之間跳轉(zhuǎn)的過程即可。分頻時鐘控制IIC讀寫由計數(shù)器控制通信時序的方法優(yōu)點是很靈活,幾乎所有的時序方法都可以用這種方法完成;缺點就是太麻煩,需要控制好狀態(tài)之間的跳轉(zhuǎn),時序越復(fù)雜使用越麻煩,其實在“FPGA采集-傳輸-顯示系統(tǒng)(二):基于FPGA的溫度采集和以太網(wǎng)傳輸”中,我對DS18B20的時序控制就是采用計數(shù)器控制的方法。DS18B20的時序要求較多,因此其中的狀態(tài)跳轉(zhuǎn)已經(jīng)相當(dāng)復(fù)雜。其實在控制IIC這種時鐘速率固定的串行協(xié)議時,還可以在外部分頻或PLL生成一個低頻的通信時鐘,用這個時鐘來控制數(shù)據(jù)傳輸過程。如下所示:always@(posedgeclock_i2c)beginif(reset_n==1’b0)begintr_end《=0;ack1《=1;ack2《=1;ack3《=1;sclk《=1;reg_sdat《=1;endelsecase(cyc_count)0:beginack1《=1;ack2《=1;tr_end《=0;sclk《=1;reg_sdat《=1;end1:reg_sdat《=0;//開始傳輸2:sclk《=0;3:reg_sdat《=i2c_data[23];4:reg_sdat《=i2c_data[22];5:reg_sdat《=i2c_data[21];6:reg_sdat《=i2c_data[20];7:reg_sdat《=i2c_data[19];8:reg_sdat《=i2c_data[18];9:reg_sdat《=i2c_data[17];10:reg_sdat《=i2c_data[16];11:reg_sdat《=1;//應(yīng)答信號12:beginreg_sdat《=i2c_data[15];ack1《=i2c_sdat;end13:reg_sdat《=i2c_data[14];14:reg_sdat《=i2c_data[13];15:reg_sdat《=i2c_data[12];16:reg_sdat《=i2c_data[11];17:reg_sdat《=i2c_data[10];18:reg_sdat《=i2c_data[9];19:reg_sdat《=i2c_data[8];20:reg_sdat《=1;//應(yīng)答信號21:beginreg_sdat《=i2c_data[7];ack2《=i2c_sdat;end22:reg_sdat《=i2c_data[6];23:reg_sdat《=i2c_data[5];24:reg_sdat《=i2c_data[4];25:reg_sdat《=i2c_data[3];26:reg_sdat《=i2c_data[2];27:reg_sdat《=i2c_data[1];28:reg_sdat《=i2c_data[0];29:reg_sdat《=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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論