基于Nios II的I2C總線(xiàn)接口的實(shí)現
0引言
本文引用地址:http://dyxdggzs.com/article/82352.htmI2C(Inter-Integrated Circuit)總線(xiàn)是一種由Phil-ips公司開(kāi)發(fā)的兩線(xiàn)式串行總線(xiàn),用于連接微控制器及其外圍設備。由于I2C總線(xiàn)僅用兩根信號線(xiàn),并支持多主控工作方式,所以I2C總線(xiàn)在電子產(chǎn)品設備中應用非常普遍。文獻[1]使用NiosⅡ的PIO接口模擬I2C時(shí)序完成對接口芯片的讀寫(xiě),而目前基于NiosⅡ的IP核越發(fā)豐富?;诖?,本文使用免費的IP核--I2C-Master Core,實(shí)現了對I2C接口芯片的讀寫(xiě)操作,擴充了一種新的設計方法。本文首先介紹了I2C總線(xiàn)結構和工作原理,然后詳細說(shuō)明了基于NiosⅡ的I2C-Master Core的使用方法,最后給出了C語(yǔ)言的編程代碼。
1 I2C總線(xiàn)基本原理
I2C總線(xiàn)是由數據線(xiàn)SDA和時(shí)鐘SCL構成的串行總線(xiàn),可發(fā)送和接收數據。在CPU與被控IC之間、進(jìn)行雙向傳送,最高傳送速度100 kbit/s。
I2C總線(xiàn)在傳送數據的過(guò)程中共有4種基本類(lèi)型信號,分別是:開(kāi)始信號、數據傳輸信號、應答信號和結束信號。
a)開(kāi)始信號:SCL為高電平時(shí),SDA由高電平向低電平跳變,開(kāi)始傳送數據。所有的命令都必須在開(kāi)始條件以后進(jìn)行。
b)結束信號:SCL為低電平時(shí),SDA由低電平向高電平跳變,結束傳送數據。所有的操作都必須在停止條件以前結束??偩€(xiàn)開(kāi)始和停止數據傳送的時(shí)序如圖1所示。
c)數據傳輸信號:在開(kāi)始條件以后,時(shí)鐘信號SCL的高電平周期期問(wèn),當數據線(xiàn)穩定時(shí),數據線(xiàn)SDA的狀態(tài)表示數據有效,即數據可以被讀走,開(kāi)始進(jìn)行讀操作。在時(shí)鐘信號SCL的低電平周期期間,數據線(xiàn)上數據才允許改變。每位數據需要一個(gè)時(shí)鐘脈沖。I2C總線(xiàn)的數據位傳送時(shí)序如圖2所示。
d)應答信號:接收數據的從器件收到8 bit數據后,向發(fā)送數據的主控器件發(fā)出特定的低電平脈沖,表示已收到數據。這要求主器件必須產(chǎn)生一個(gè)與確認位相應的額外時(shí)鐘脈沖(第9個(gè)脈沖)。若主控器件確認失敗,主控器件必須發(fā)送一個(gè)數據結束信號給從器件。這時(shí)從器件必須使SDA線(xiàn)保持高電平,使主控器件能產(chǎn)生停止條件??偩€(xiàn)的應答信號時(shí)序見(jiàn)圖3。
2 I2C接口芯片AT24C01/02工作原理
AT24CXX系列芯片是采用I2C總線(xiàn)標準的常用的串行EEROM芯片。本文以AT24C02為例介紹。AT24C02具有256×8(2 k)bit的存儲容量,即總共32頁(yè),每頁(yè)有8字節的容量。每次寫(xiě)入數據是從主器件發(fā)送來(lái)的片內選擇地址開(kāi)始寫(xiě)人,如果寫(xiě)到頁(yè)末尾,主器件還在繼續發(fā)送的話(huà),不會(huì )自動(dòng)轉到下一頁(yè),而是從該頁(yè)的頭地址開(kāi)始繼續寫(xiě)入,覆蓋該頁(yè)的原有數據,而造成數據丟失。AT24C02工作于從器件方式,它的地址由外圍的3個(gè)引腳A2、A1、A0決定,如圖4所示。在I2C總線(xiàn)上總共可以連接8個(gè)AT24C02接口芯片,每個(gè)器件硬件地址與控制寄存器的地址內容保持一致,就能夠自由地與主控器件進(jìn)行數據傳輸。
1)器件字節寫(xiě)操作
在字節寫(xiě)模式下,發(fā)送器件寫(xiě)控制字,控制字包括4位固定器件碼,3位片選碼,以及一位低電平的寫(xiě)控制位。主器件在收到從器件產(chǎn)生應答信號后,主器件發(fā)送一個(gè)8位字節地址寫(xiě)入AT24C02。主器件在收到從器件的另一個(gè)應答信號后,再發(fā)送數據到被尋址的存儲單元。AT24C02再次應答,并在主器件產(chǎn)生停止信號后開(kāi)始內部數據的擦寫(xiě),在內部擦寫(xiě)過(guò)程中,AT24C02不再應答主器件的任何請求。時(shí)序見(jiàn)圖5。
2)器件隨機地址讀操作
對AT24C02讀操作的初始化方式和寫(xiě)操作時(shí)一樣,僅把R/W位置為1。圖6所示為AT24C02隨機地址讀時(shí)序圖。隨機讀操作允許主器件對寄存器的任意字節進(jìn)行讀操作,主器件首先通過(guò)發(fā)送起始信號、從器件地址和它想讀取的字節數據的地址執行一個(gè)偽寫(xiě)操作。在A(yíng)T24C02應答之后,主器件重新發(fā)送起始信號和從器件地址,此時(shí)R/W位置1,AT24C02響應并發(fā)送應答信號,然后輸出所要求的一個(gè)8位字節數據,主器件不發(fā)送應答信號但產(chǎn)生一個(gè)停止信號。
3 I2C-Master Core工作原理
基于NiosⅡ的IP核應用非常簡(jiǎn)便,因此越發(fā)受到青睞。Altera公司已經(jīng)提供了一些通用的IP核可供使用,但沒(méi)有提供I2C核。文獻[3]提供了免費的I2C-Master Core,經(jīng)筆者的應用與長(cháng)時(shí)間測試,證明該Mas-ter Core使用方便可靠,工作穩定。該Master Core的內部結構如圖7所示,主要由時(shí)鐘發(fā)生器、字節命令控制器、比特命令發(fā)生器和數據移位寄存器4個(gè)模塊組成。其他模塊是一些相關(guān)接口和臨時(shí)數據存儲器。
時(shí)鐘發(fā)生器主要是產(chǎn)生SCL信號,該時(shí)鐘的頻率可由預分頻寄存器設置,控制子計算公式如下:
例如:SCL頻率為100kHz,NiosⅡ工作頻率為50 MHz,則預分頻=99,PRERlo=99,PRERhi=0。
字節命令控制器在字節級連接命令寄存器、狀態(tài)寄存器和比特命令控制器。通過(guò)將表2所示命令寄存器相應的比特位置1,可以產(chǎn)生I2C接口的開(kāi)始、結束、確認等信號,以及讀寫(xiě)控制。這些有效控制通過(guò)字節命令控制器轉送到比特命令控制器,使其發(fā)生作用,在信號產(chǎn)生后,這些比特位自動(dòng)清0。
NiosⅡ向發(fā)送寄存器寫(xiě)數據實(shí)現數據輸出,讀接收寄存器獲取從器件輸出的數據。數據的讀寫(xiě)是否完成可通過(guò)中斷或查詢(xún)方式得知。如采用中斷方式,狀態(tài)寄存器中的IF狀態(tài)位置1;如采用查詢(xún)方式,數據處理過(guò)程中,狀態(tài)位TIP置1,處理完畢后置1。
4應用實(shí)例
筆者在NiosⅡIDE7.1環(huán)境下編寫(xiě)了使用該Mas-ter Core的C語(yǔ)言代碼,現把部分主程序代碼列出。
1)IP-Master Core初始化
完成對預分頻器的設置,確定SCL時(shí)鐘頻率;控制寄存器中I2C-Master Core使能位置1,使其工作。
2)查詢(xún)確認信號
數據收發(fā)是否完成,通過(guò)查詢(xún)TIP狀態(tài)位來(lái)確定。
3)寫(xiě)字節操作
單字節寫(xiě)入按圖5操作流程:
4)隨即地址讀操作
隨即地址讀字節按圖6流程操作:
以上是使用I2C-Master Core的關(guān)鍵代碼,若向地址0xS0寫(xiě)入0x5A,再將其讀出,可按下面寫(xiě)法:
若操作正確,DATA的值應該位為0x5A。
5結束語(yǔ)
本文探討了使用免費I2C-Master Core的方法,方便地實(shí)現了基于Nios Ⅱ的I2C接口芯片的開(kāi)發(fā),為I2C的電子工程設計使用提供了一種簡(jiǎn)單快捷的方法。
分頻器相關(guān)文章:分頻器原理
評論