新聞中心

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

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

        —— 零基礎學FPGA(十一)初入江湖之i2c通信
        作者: 時間:2015-01-26 來源:網絡 收藏

          相信學過單片機的同學對I2C總線都不陌生吧,今天我們來學習怎么用語言來實現它,并在學習版上顯示。

        本文引用地址:http://www.104case.com/article/268628.htm

          總線在近年來微電子通信控制領域廣泛采用的一種新型的總線標準,他是同步通信的一種特殊方式,具有接口少,控制簡單,器件封裝形式小,通信速率高等優點。在主從通信中,可以有多個總線器件同時接到總線上,所有與i2c兼容的器件都有標準的接口,通過地址來識別通信對象,使他們可以經由i2c總線互相直接通信。

          i2c總線由兩條線控制,一條時鐘線SCL,一條數據線SDA,這里以E2PROM芯片AT24C08來介紹i2c通信方式。這是我學習版上的E2PROM芯片

          

        360桌面截圖20140708101550.jpg

         

          下面是AT24系列芯片的器件地址說明

          

        360桌面截圖20140708101803.jpg

         

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

          下面是AT24C08的寫時序

          

        360桌面截圖20140708102226.jpg

         

          想要理解這段時序,讓我們來慢慢將它分解來看,從上到下,從左到右

          1、SCL

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

          

        360桌面截圖20140708102827.jpg

         

          

        360桌面截圖20140708102910.jpg

         

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

          2、START

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

          3、DEVICE-ADDRESS

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

          

        360桌面截圖20140708103940.jpg

         

          下面我來解釋一下上圖的代碼為什么這樣寫

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

          (2)進入ADD1狀態后,sda_num就開始計數,由于我們用的是非阻塞賦值,所以第一個時鐘周期case捕獲的sda_num的值是0而不是1,有些朋友可能不明白這里,總是覺得case語句上來不就捕獲了1嘛,在這里給大家講解一下

          (3)這樣一連送8個時鐘周期的器件地址,送完之后sda_num清零,并釋放sda總線,進入下一個狀態

          4、ACK

          應答信號,當器件地址發送完畢后,主機要向從機要一個應答信號,用來表示從機已經接收到了主機發送的數據,如果一段時間內主機沒有收到從機發來的應答信號,則主機默認從機收到的主機發送的數據。在這里我們利用狀態機等待一個時鐘周期,作為應答等待時間,并在這個時間內給db_r寄存器送數據地址

          5、WORD_ADDRESS

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

          接下來從機再給主機一個應答信號,如果此時我們按下鍵1的話那么就會進入寫狀態,然后我們就可以寫數據了,具體代碼和上面尋址的代碼類似,直接將數據發送到數據總線SDA。

          下面是讀時序

          

        360桌面截圖20140708105124.jpg

         

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

          

        360桌面截圖20140708105456.jpg

         

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

          

        360桌面截圖20140708105838.jpg

         

          下面是生成的RTL視圖

          

        360桌面截圖20140708105928.jpg

         

          下面是狀態機的模型

          

        360桌面截圖20140708110049.jpg

         

          下面是板子上實驗

          

        qq圖片20140708110528.jpg

        fpga相關文章:fpga是什么


        數字通信相關文章:數字通信原理


        通信相關文章:通信原理




        關鍵詞: FPGA i2c verilog

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 鲁甸县| 安远县| 渭源县| 长沙市| 昌乐县| 江西省| 福贡县| 凤城市| 长岛县| 犍为县| 镇原县| 宾阳县| 洛扎县| 塔河县| 瑞金市| 黄山市| 阜阳市| 汶上县| 乌拉特前旗| 隆德县| 察隅县| 苗栗市| 剑阁县| 南召县| 沽源县| 明星| 灵川县| 闽侯县| 商洛市| 汝南县| 台北市| 井冈山市| 井陉县| 巨野县| 合阳县| 天气| 海宁市| 江津市| 曲靖市| 哈巴河县| 宝鸡市|