<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > I2C串行總線在單片機(jī)8031應(yīng)用系統(tǒng)中的設(shè)計(jì)與實(shí)現(xiàn)

          I2C串行總線在單片機(jī)8031應(yīng)用系統(tǒng)中的設(shè)計(jì)與實(shí)現(xiàn)

          作者: 時(shí)間:2012-01-30 來源:網(wǎng)絡(luò) 收藏

          1 概述

            I2C (inter IC bus)總線是由Philips公司提出的串行通信規(guī)范,常見的中文譯名有“集成電路間總線”或“內(nèi)部集成電路總線”。它使用兩條線:串行數(shù)據(jù)線(SDA)和串行時(shí)鐘線(SCL),使連接到該總線上可訪問的器件之間傳送信息,屬于多主控制總線??偩€上的每個(gè)器件均可設(shè)置唯一的地址,從而可實(shí)現(xiàn)器件的有效訪問。自Philips公司推出后,Philips公司及其他公司紛紛相繼推出了許多產(chǎn)品,如各種微處理器、存儲器(PCF8571/8570,128/256 字節(jié))、A/D(PCF8591)、D/A(TDA8442/8444)轉(zhuǎn)換器、E2PROM及各種I2C總線電路(PCF8584)等。由于I2C總線的使用可以簡化電路,省掉了很多常規(guī)電路中的器件,提高產(chǎn)品的可靠性,在許多領(lǐng)域尤其在目前使用的IC卡獲得了廣泛的應(yīng)用,國際標(biāo)準(zhǔn)ISO7816-2規(guī)定了IC卡與讀寫設(shè)備信息傳輸是基于I2C總線傳輸協(xié)議的。不僅如此,I2C總線在家電方面也有較廣泛的應(yīng)用,如國產(chǎn)長虹NC-3機(jī)芯彩電,東芝火箭炮等。盡管Philips公司推出帶有I2C 總線接口的80C31系列,如:8XC528、8XC552、8XC562、8XC751等,但在組成的智能化儀表和測控系統(tǒng)中,乃有相當(dāng)比例數(shù)量使用的是MCS51、AT89C5X系列,如8031、8751、AT89C51、AT89C52等,它們不具有I2C串行總線接口。本文將結(jié)合筆者在開發(fā)智能化產(chǎn)品用到的E2PROM,介紹在不具有I2C串行總線接口的單片機(jī)8031應(yīng)用系統(tǒng)中實(shí)現(xiàn)I2C總線接口的方法和軟件設(shè)計(jì)。

          2 I2C總線的組成及I2C總線性能

          2.1 I2C總線的特點(diǎn)

            由于I2C總線僅用二條線來傳達(dá)信息,因而具有獨(dú)特的優(yōu)點(diǎn):
           ?、?可最大限度地簡化結(jié)構(gòu);可實(shí)現(xiàn)電路系統(tǒng)的模塊化、標(biāo)準(zhǔn)化設(shè)計(jì)。
           ?、?標(biāo)準(zhǔn)I2C總線模塊的組合開發(fā)方式大大地縮短了新產(chǎn)品的開發(fā)周期。
           ?、?I2C總線系統(tǒng)具有很大的靈活性;I2C總線各節(jié)點(diǎn)具有獨(dú)立的電氣特性。
           ?、?I2C總線系統(tǒng)可方便地對某一節(jié)點(diǎn)電路故障進(jìn)行診斷與跟蹤,有很好的可維護(hù)性。

          2.2 I2C總線的組成

            I2C總線是芯片間串行傳輸總線,與SPI,MICROWIRE/PLUS接口不同,它以一根串行數(shù)據(jù)線和一根串行時(shí)鐘線組成,如圖1所示,它是全雙工雙向數(shù)據(jù)傳輸線,核心是主控CPU,被控器的SDA,SCL要相應(yīng)地接到I2C總線的SDA,SCL上,可以方便地構(gòu)成多機(jī)系統(tǒng)和外圍器件擴(kuò)展系統(tǒng)。I2C總線采用了器件地址的硬件設(shè)置方法,從而使硬件系統(tǒng)具有簡單而靈活的擴(kuò)展方法。按照I2C總線的規(guī)定,其SDA、SCL各要通過上拉電阻接到電源VCC上。

          I2C串行總線在單片機(jī)8031應(yīng)用系統(tǒng)中的設(shè)計(jì)與實(shí)現(xiàn)

          圖1 I2C總線的組成

          2.3 I2C總線協(xié)議

            任何總線的推出及應(yīng)用都有其特有的規(guī)定,其總線時(shí)序圖如圖2所示。

          I2C串行總線在單片機(jī)8031應(yīng)用系統(tǒng)中的設(shè)計(jì)與實(shí)現(xiàn)

          圖2 I2C總線時(shí)序圖

            I2C總線一般須滿足如下協(xié)議:

           ?、?只有當(dāng)總線不忙時(shí),數(shù)據(jù)傳送才能開始;
           ?、?數(shù)據(jù)傳送期間,無論何時(shí)時(shí)鐘線為高,數(shù)據(jù)線必須保持穩(wěn)定。當(dāng)時(shí)鐘線為高時(shí),數(shù)據(jù)線的變化將認(rèn)為是傳送的開始或停止;
           ?、?當(dāng)時(shí)鐘線為高時(shí),數(shù)據(jù)線由高到低的變化決定開始條件;
           ?、?當(dāng)時(shí)鐘線為高時(shí),數(shù)據(jù)線由低到高的變化決定停止條件;
           ?、?在開始條件后,SCL低電平期間,SDA允許變化,每位數(shù)據(jù)需一個(gè)時(shí)鐘脈沖,當(dāng)SCL為高時(shí),SDA必須穩(wěn)定;
           ?、?主控器在應(yīng)答時(shí)鐘脈沖高電平期間釋放SDA線高,轉(zhuǎn)由接收器控制。受控器在應(yīng)答時(shí)鐘脈沖高電平期間必須拉低SDA線,以使之為穩(wěn)定的低電平作為有效應(yīng)答;
           ?、?總線不忙時(shí),數(shù)據(jù)線和時(shí)鐘線保持為高電平。

          2.4 I2C總線上的數(shù)據(jù)傳輸方式

            圖3為I2C 總線數(shù)據(jù)傳輸格式示意圖,第一部分為數(shù)據(jù)傳輸起始信號,即由此開始進(jìn)行數(shù)據(jù)傳送;第二部分為受控IC的地址,用來選擇向哪一個(gè)受控IC傳送數(shù)據(jù);第三部分為讀/寫位,它指示出受控IC的工作方式;第四部分為應(yīng)答信號,它是被CPU選中的受控IC向CPU傳回的確認(rèn)信號;第五部分為傳送的數(shù)據(jù);第六部分為停止位。在I2C總線上掛接的所有被控IC都要有一個(gè)自己的地址,CPU在發(fā)送數(shù)據(jù)時(shí),I2C總線上的所有被控IC都會將CPU發(fā)出位于起始信號后面的受控電路地址與自己的地址相比較,如果兩者相同,則該被控IC認(rèn)為自己被CPU選中,然后按照讀/寫位規(guī)定的工作方式接收或發(fā)送數(shù)據(jù)。

          起始被控IC地址讀/寫控制位應(yīng)答位數(shù)據(jù)停止

          圖3 I2C總線數(shù)據(jù)傳輸格式

          3 I2C總線在單片機(jī)8031中的實(shí)現(xiàn)

            因?yàn)?031單片機(jī)不帶有I2C總線硬件接口,只能靠編寫軟件來模擬I2C總線時(shí)序。這里以單片機(jī)應(yīng)用系統(tǒng)中較為常見的E2PROM中AT24C02為例,給出了在8031上利用I/O線實(shí)現(xiàn)I2C串行總線的方法和軟件設(shè)計(jì)。根據(jù)I2C總線時(shí)序圖和I2C總線的數(shù)據(jù)傳輸規(guī)范,給出詳細(xì)的AT24C02起始、停止、發(fā)送和接收R7個(gè)字節(jié)的驅(qū)動程序清單。

          I2C串行總線在單片機(jī)8031應(yīng)用系統(tǒng)中的設(shè)計(jì)與實(shí)現(xiàn)

          圖4 I2C總線接口原理圖

           ORG  ××××      ??;程序開始地址。
           SCL  EQU P1.1   ??;選擇P1.1作時(shí)鐘線。
           SDA  EQU P1.0   ??;選擇P1.0作數(shù)據(jù)線。
            功能:WRITE是寫入程序。將R1指示的R7個(gè)片內(nèi)字節(jié)寫入AT24C02中,寫入首址由R0指示。
           WRITE:ACALL STAR   ??;發(fā)出起始信號。
               MOV A,#0A0H  ??;發(fā)出寫命令。
               ACALL OUTB
               JC WBE     ??;無回答,結(jié)束操作。
               MOV A,R0   ??;發(fā)出E2PROM首址。
               ACALL OUTB
               JC WBE     ??;無回答,結(jié)束操作。
           WR1: MOV A,@R1    ;取一字節(jié)內(nèi)容。
               ACALL OUTB   ??;寫入E2PROM中。
               JC WBE     ??;無回答,結(jié)束操作。
               INC R1     ??;指向下一字節(jié)。
               DJNZ R7,WR1   ;寫完全部字節(jié)。
           WBE: AJMP STOP   ??;發(fā)出結(jié)束信號。
            功能:READ是讀出程序。將R1指示的R7個(gè)E2PROM字節(jié)讀入片內(nèi)RAM中,首址由R0指示。
           READ: ACALL STAR   ??;發(fā)出起始信號。
               MOV A,#0A0H  ?。话l(fā)出寫命令。
               ACALL OUTB
               JC RDE     ??;無回答,結(jié)束操作。
               MOV A,R1   ??;發(fā)出E2PROM首址。
               ACALL OUTB
               JC RDE     ??;無回答,結(jié)束操作。
               ACALL STOP    ;發(fā)出結(jié)束信號。
               NOP      ??;延時(shí)。
               NOP
               ACALL STAR   ??;再次發(fā)出起始信號。
               MOV A,#0A1H  ??;發(fā)出讀命令。
               ACALL OUTB
               JC RDE     ?。粺o回答,結(jié)束操作。
           RD1: MOV B,#08H  ??;每移出8位組成一字節(jié)。
           RD2: CLR SCL    ??;移出一個(gè)時(shí)鐘脈沖。
               NOP
               SETB SCL    ??;時(shí)鐘脈沖上升沿。
               NOP
               MOV C,SDA    ;讀入一位。
               RLC A     ??;拼裝到累加器中。
               NOP
               DJNZ B,RD2   ;拼完一字節(jié)。
               MOV @R0,A   ??;存入片內(nèi)。
               INC R0     ??;指向下一地址。
               CLR SCL    ??;時(shí)鐘脈沖下降沿。
               CJNE R7,#1,RD3 ;是最后一個(gè)字節(jié)嗎?
               SETB SDA     ;最后一個(gè)字節(jié)不給回答信號。
               SJMP RD4
           RD3: CLR SDA    ??;準(zhǔn)備好回答信號。
           RD4: NOP
               SETB SCL    ??;時(shí)鐘脈沖上升沿。
               NOP      ??;等待E2PROM讀取回答信號
               NOP
               CLR SCL    ?。换卮鹜戤?。
               SETB SDA     ;準(zhǔn)備讀入下一字節(jié)。
               DJNZ R7,RD1   ;讀完全部字節(jié)。
               CLR C
           RDE: AJMP STOP   ??;發(fā)出結(jié)束信號。
            功能:OUTB是向E2PROM發(fā)出一字節(jié)信息的子程序。
           OUTB: MOV B,#08H  ??;一字節(jié)8位。
           OUT1: CLR SCL    ??;將時(shí)鐘線拉低。
               RLC A     ??;移出一位。
               MOV SDA,C    ;放到數(shù)據(jù)線上。
               SETB SCL     ;將時(shí)鐘線升高。
               NOP      ??;等待一位信息送入E2PROM中。
               DJNZ B,OUT1   ;發(fā)送完8位。
               CLR SCL    ??;將時(shí)鐘線拉低。
               SETB SDA     ;準(zhǔn)備接收回答信號。
               SETB SCL     ;將時(shí)鐘線升高。
               NOPMOV C,SDA ??;接收回答信號。
               CLR SCL    ??;將時(shí)鐘線拉低。
               RET
            功能:STAR是起始信號。
           STAR: SETB SDA     ;將數(shù)據(jù)線升高。
               SETB SCL     ;將時(shí)鐘線升高。
               NOP      ??;延時(shí)。
               CLR SDA    ?。粚?shù)據(jù)線拉低,發(fā)出起始信號。
               NOP      ??;延時(shí)。
               CLR SCL    ??;將時(shí)鐘線拉低。
               RET
            功能:STOP是結(jié)束信號。
           STOP: CLR SCL     ;將時(shí)鐘線拉低。
               CLR SDA    ??;將數(shù)據(jù)線拉低。
               NOP
               SETB SCL     ;將時(shí)鐘線升高。
               NOP
               SETB SDA     ;將數(shù)據(jù)線升高,發(fā)出結(jié)束信號。
               RET
               END

          4 結(jié)束語

            本文給出了用8031匯編語言模擬I2C總線的時(shí)序的起始、停止及主控器向I2C總線的發(fā)送和接收R7字節(jié)的程序,讀者也可根據(jù)I2C總線的操作時(shí)序在ATMEL89系列、68HC05系列等單片機(jī)及其外設(shè)接口如8255、8155或74LS377上實(shí)現(xiàn)I2C總線的操作,具有一定的通用性,且易于嵌入移植。

          參考文獻(xiàn)
           1 Atmel Integrated Circuit Date Book,1994
           2 武漢力源公司.CMOS串行EEPROM原理及應(yīng)用
           3 王卓人,鄧晉鈞,劉宗祥.IC卡的技術(shù)與應(yīng)用.北京:電子工業(yè)出版社,1999.2



          關(guān)鍵詞: 單片機(jī) I2C總線 接口

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();