<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > 零基礎學(xué)FPGA(十)初入江湖之i2c通信

零基礎學(xué)FPGA(十)初入江湖之i2c通信

—— 零基礎學(xué)FPGA(十一)初入江湖之i2c通信
作者: 時(shí)間:2015-01-26 來(lái)源:網(wǎng)絡(luò ) 收藏

  相信學(xué)過(guò)單片機的同學(xué)對I2C總線(xiàn)都不陌生吧,今天我們來(lái)學(xué)習怎么用語(yǔ)言來(lái)實(shí)現它,并在學(xué)習版上顯示。

本文引用地址:http://dyxdggzs.com/article/268628.htm

  總線(xiàn)在近年來(lái)微電子通信控制領(lǐng)域廣泛采用的一種新型的總線(xiàn)標準,他是同步通信的一種特殊方式,具有接口少,控制簡(jiǎn)單,器件封裝形式小,通信速率高等優(yōu)點(diǎn)。在主從通信中,可以有多個(gè)總線(xiàn)器件同時(shí)接到總線(xiàn)上,所有與i2c兼容的器件都有標準的接口,通過(guò)地址來(lái)識別通信對象,使他們可以經(jīng)由i2c總線(xiàn)互相直接通信。

  i2c總線(xiàn)由兩條線(xiàn)控制,一條時(shí)鐘線(xiàn)SCL,一條數據線(xiàn)SDA,這里以E2PROM芯片AT24C08來(lái)介紹i2c通信方式。這是我學(xué)習版上的E2PROM芯片

  

360桌面截圖20140708101550.jpg

 

  下面是AT24系列芯片的器件地址說(shuō)明

  

360桌面截圖20140708101803.jpg

 

  前四位是已經(jīng)默認的地址,接下來(lái)三位是可編程部分,可以自己擬定器件的地址,就像上面的芯片,A0,A1,A2全部接地,所以我的開(kāi)發(fā)板上的E2PROM的地址就為1010_000x,最后一位是讀寫(xiě)標志位,若為1,則表示我要從E2PROM里讀數據,若為0,則表示我要往里面寫(xiě)數據。

  下面是AT24C08的寫(xiě)時(shí)序

  

360桌面截圖20140708102226.jpg

 

  想要理解這段時(shí)序,讓我們來(lái)慢慢將它分解來(lái)看,從上到下,從左到右

  1、SCL

  由芯片的datasheet我們可以知道芯片的工作頻率范圍,一般是100KHZ到400KHZ,這里我們用100KHZ的工作頻率。因為我們的芯片是50MHZ的頻率,所以要用到分頻,周期是20ns,所以計數500次就是10us,也就是100KHZ了,下面是分頻部分的代碼

  

360桌面截圖20140708102827.jpg

 

  

360桌面截圖20140708102910.jpg

 

  由芯片的資料可知,在SCL是低電平器件數據才可以變化,也就是說(shuō),只有在SCL在低電平器件才可以向E2PROM里面寫(xiě)數據,在SCL高電平期間數據穩定,所以我們可以從里面讀數據,所以我們將SCL的一個(gè)時(shí)鐘周期分為四部分,分別是高電平中間時(shí)刻(用于讀數據),下降沿,低電平中間時(shí)刻(用于寫(xiě)數據),上升沿。上升沿和下降沿來(lái)控制SCL的時(shí)序。

  2、START

  開(kāi)始信號,在SCL為高電平期間,SDA有一個(gè)從高電平到低電平的跳變,大家可以參考上傳的源代碼,從一上電開(kāi)始,SCL就按照100KHZ的頻率在變化,我們需要控制的只是SDA即可。

  3、DEVICE-ADDRESS

  器件地址,當開(kāi)始信號作用后,就可以將器件的地址送人數據總線(xiàn)SDA,由于SDA是串行的,所以要一位一位的送,而且要從高位開(kāi)始送,下面是狀態(tài)機尋器件地址部分代碼,注意地址的最后一位是讀寫(xiě)位,這里要送寫(xiě)地址,即1010_0000;

  

360桌面截圖20140708103940.jpg

 

  下面我來(lái)解釋一下上圖的代碼為什么這樣寫(xiě)

  (1)首先在SCL在低電平期間屬于數據穩定期,我們可以向里面寫(xiě)數據。

  (2)進(jìn)入ADD1狀態(tài)后,sda_num就開(kāi)始計數,由于我們用的是非阻塞賦值,所以第一個(gè)時(shí)鐘周期case捕獲的sda_num的值是0而不是1,有些朋友可能不明白這里,總是覺(jué)得case語(yǔ)句上來(lái)不就捕獲了1嘛,在這里給大家講解一下

  (3)這樣一連送8個(gè)時(shí)鐘周期的器件地址,送完之后sda_num清零,并釋放sda總線(xiàn),進(jìn)入下一個(gè)狀態(tài)

  4、ACK

  應答信號,當器件地址發(fā)送完畢后,主機要向從機要一個(gè)應答信號,用來(lái)表示從機已經(jīng)接收到了主機發(fā)送的數據,如果一段時(shí)間內主機沒(méi)有收到從機發(fā)來(lái)的應答信號,則主機默認從機收到的主機發(fā)送的數據。在這里我們利用狀態(tài)機等待一個(gè)時(shí)鐘周期,作為應答等待時(shí)間,并在這個(gè)時(shí)間內給db_r寄存器送數據地址

  5、WORD_ADDRESS

  數據地址,當找到要往哪個(gè)器件里寫(xiě)數據之后,就要開(kāi)始尋址往這個(gè)器件的哪個(gè)地址里寫(xiě)數據了,AT24C08的存儲容量為1024x8,也就是可以寫(xiě)1024個(gè)字節,共有1024個(gè)地址,往哪個(gè)地址里寫(xiě)呢,需要我們自己確定。和上面發(fā)送器件地址一樣,直接將地址數據發(fā)送至SDA總線(xiàn)即可。

  接下來(lái)從機再給主機一個(gè)應答信號,如果此時(shí)我們按下鍵1的話(huà)那么就會(huì )進(jìn)入寫(xiě)狀態(tài),然后我們就可以寫(xiě)數據了,具體代碼和上面尋址的代碼類(lèi)似,直接將數據發(fā)送到數據總線(xiàn)SDA。

  下面是讀時(shí)序

  

360桌面截圖20140708105124.jpg

 

  讀時(shí)序和寫(xiě)時(shí)序的唯一不同點(diǎn)就是當發(fā)送玩數據地址后,接收到應答信號后,如果想要執行讀命令,那還要進(jìn)行一次開(kāi)始信號,即START2,然后再發(fā)送一次器件地址,當再收到應答信號后就可以從里面讀數據了,注意讀數據的時(shí)候我們是在scl的高電平期間,因為這個(gè)時(shí)候數據穩定,而在寫(xiě)數據的時(shí)候,我們是在scl的低電平器件,因為這個(gè)器件數據才允許變化,代碼如下

  

360桌面截圖20140708105456.jpg

 

  還有一點(diǎn)要注意,因為SDA是輸入輸出信號inout,所以為了當數據線(xiàn)作為輸出或者輸入時(shí)不被干擾,這里定義了一個(gè)變量sda_link,來(lái)控制它,當sda作為輸入信號時(shí),我們讓它處于高阻態(tài),當sda作為輸出信號時(shí),將其賦予sda_r的值

  

360桌面截圖20140708105838.jpg

 

  下面是生成的RTL視圖

  

360桌面截圖20140708105928.jpg

 

  下面是狀態(tài)機的模型

  

360桌面截圖20140708110049.jpg

 

  下面是板子上實(shí)驗

  

qq圖片20140708110528.jpg

fpga相關(guān)文章:fpga是什么


數字通信相關(guān)文章:數字通信原理


通信相關(guān)文章:通信原理




關(guān)鍵詞: FPGA i2c verilog

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>