《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 基于模擬I2C總線(xiàn)多主通信研究與軟件設(shè)計(jì)
基于模擬I2C總線(xiàn)多主通信研究與軟件設(shè)計(jì)
西安電子科技大學(xué) 鄭旭陽(yáng) 李兵兵 黃新平
西安電子科技大學(xué)
摘要: 介紹模擬I2C總線(xiàn)的多主節(jié)點(diǎn)通信原理,,并提出一種新的實(shí)現(xiàn)方法。這種采用延時(shí)接收比較來(lái)實(shí)現(xiàn)仲裁的方法,,可使不具有I2C接口的普通微控制器(MCU)能夠?qū)崿F(xiàn)模擬I2C總線(xiàn)的多主通信,,同時(shí)對(duì)I2C總線(xiàn)的推廣起到了積極作用,。
關(guān)鍵詞: I2C總線(xiàn) 仲裁 多主通信
Abstract:
Key words :

        I2C總線(xiàn)(Inter IC BUS)是PHILIPS公司推出的雙向兩線(xiàn)串行通信標(biāo)準(zhǔn),。由于它具有接口少,、通信效率高等優(yōu)點(diǎn),現(xiàn)已得到廣泛的應(yīng)用\[1~3\],。它除了可以進(jìn)行簡(jiǎn)單的單主節(jié)點(diǎn)通信外,還可以應(yīng)用在多主節(jié)點(diǎn)的通信系統(tǒng)中,。在多主節(jié)點(diǎn)通信系統(tǒng)中,,如果兩個(gè)或者更多的主節(jié)點(diǎn)同時(shí)啟動(dòng)數(shù)據(jù)傳輸,總線(xiàn)具有沖突檢測(cè)和仲裁功能,,保證通信正常進(jìn)行并防止數(shù)據(jù)破壞?,F(xiàn)在許多微控制器(MCU)都具有I2C總線(xiàn)接口,能方便地進(jìn)行I2C總線(xiàn)設(shè)計(jì),。對(duì)于沒(méi)有I2C總線(xiàn)接口的MCU,,可以采用兩條I/O接口線(xiàn)進(jìn)行模擬\[2,3\],。目前,,一些介紹模擬I2C的資料主要講的是在單主節(jié)點(diǎn)系統(tǒng)中進(jìn)行的通信,這使得模擬I2C總線(xiàn)的應(yīng)用具有一定的局限性,。本文根據(jù)總線(xiàn)仲裁的思想,,提出一種多主節(jié)點(diǎn)通信的思想及實(shí)現(xiàn)流程。

      1  I2C總線(xiàn)系統(tǒng)簡(jiǎn)介[1~3]

      I2C總線(xiàn)系統(tǒng)是由SCL(串行時(shí)鐘)和SDA(串行數(shù)據(jù))兩根總線(xiàn)構(gòu)成的,。該總線(xiàn)有嚴(yán)格的時(shí)序要求,,總線(xiàn)工作時(shí),由串行時(shí)鐘線(xiàn)SCL傳送時(shí)鐘脈沖,,由串行數(shù)據(jù)線(xiàn)SDA傳送數(shù)據(jù),。總線(xiàn)協(xié)議規(guī)定,,各主節(jié)點(diǎn)進(jìn)行通信時(shí)都要有起始,、結(jié)束、發(fā)送數(shù)據(jù)和應(yīng)答信號(hào),。這些信號(hào)都是通信過(guò)程中的基本單元,??偩€(xiàn)傳送的每1幀數(shù)據(jù)均是1個(gè)字節(jié),每當(dāng)發(fā)送完1個(gè)字節(jié)后,,接收節(jié)點(diǎn)就相應(yīng)給一應(yīng)答信號(hào),。協(xié)議規(guī)定,在啟動(dòng)總線(xiàn)后的第1個(gè)字節(jié)的高7位是對(duì)從節(jié)點(diǎn)的尋址地址,,第8位為方向位(“0”表示主節(jié)點(diǎn)對(duì)從節(jié)點(diǎn)的寫(xiě)操作,;“1”表示主節(jié)點(diǎn)對(duì)從節(jié)點(diǎn)的讀操作),其余的字節(jié)為操作數(shù)據(jù),。圖1列出I2C總線(xiàn)上幾個(gè)基本信號(hào)的時(shí)序,。

      圖1中包括起始信號(hào)、停止信號(hào),、應(yīng)答信號(hào),、非應(yīng)答信號(hào)以及傳輸數(shù)據(jù)“0”和數(shù)據(jù)“1”的時(shí)序。起始信號(hào)就是在SCL線(xiàn)為高時(shí)SDA線(xiàn)從高變化到低,;停止信號(hào)就是在SCL線(xiàn)為高時(shí)SDA線(xiàn)從低變化到高,;應(yīng)答信號(hào)是在SCL為高時(shí)SDA為低;非應(yīng)答信號(hào)相反,,是在SCL為高時(shí)SDA為高,。傳輸數(shù)據(jù)“0”和數(shù)據(jù)“1”與發(fā)送應(yīng)答位和非應(yīng)答位時(shí)序圖是相同的。

      圖1  I2C總線(xiàn)上基本信號(hào)的時(shí)序

      圖2表示了一個(gè)完整的數(shù)據(jù)傳送過(guò)程,。在I2C總線(xiàn)發(fā)送起始信號(hào)后,,發(fā)送從機(jī)的7位尋址地址和1位表示這次操作性質(zhì)的讀寫(xiě)位,在有應(yīng)答信號(hào)后開(kāi)始傳送數(shù)據(jù),,直到發(fā)送停止信號(hào),。數(shù)據(jù)是以字節(jié)為單位的。發(fā)送節(jié)點(diǎn)每發(fā)送1個(gè)字節(jié)就要檢測(cè)SDA線(xiàn)上有沒(méi)有收到應(yīng)答信號(hào),,有則繼續(xù)發(fā)送,,否則將停止發(fā)送數(shù)據(jù)。

      圖2  一次完整的數(shù)據(jù)傳送過(guò)程

      2  I2C總線(xiàn)的仲裁

      在多主的通信系統(tǒng)中,??偩€(xiàn)上有多個(gè)節(jié)點(diǎn),它們都有自己的尋址地址,,可以作為從節(jié)點(diǎn)被別的節(jié)點(diǎn)訪(fǎng)問(wèn),,同時(shí)它們都可以作為主節(jié)點(diǎn)向其他的節(jié)點(diǎn)發(fā)送控制字節(jié)和傳送數(shù)據(jù)。但是如果有兩個(gè)或兩個(gè)以上的節(jié)點(diǎn)都向總線(xiàn)上發(fā)送啟動(dòng)信號(hào)并開(kāi)始傳送數(shù)據(jù),,這樣就形成了沖突,。要解決這種沖突,就要進(jìn)行仲裁的判決,,這就是I2C總線(xiàn)上的仲裁,。

      I2C總線(xiàn)上的仲裁分兩部分:SCL線(xiàn)的同步和SDA線(xiàn)的仲裁,。SCL同步是由于總線(xiàn)具有線(xiàn)“與”的邏輯功能,即只要有一個(gè)節(jié)點(diǎn)發(fā)送低電平時(shí),,總線(xiàn)上就表現(xiàn)為低電平,。當(dāng)所有的節(jié)點(diǎn)都發(fā)送高電平時(shí),總線(xiàn)才能表現(xiàn)為高電平,。正是由于線(xiàn)“與”邏輯功能的原理,,當(dāng)多個(gè)節(jié)點(diǎn)同時(shí)發(fā)送時(shí)鐘信號(hào)時(shí),在總線(xiàn)上表現(xiàn)的是統(tǒng)一的時(shí)鐘信號(hào),。這就是SCL的同步原理,。

      SDA線(xiàn)的仲裁也是建立在總線(xiàn)具有線(xiàn)“與”邏輯功能的原理上的。節(jié)點(diǎn)在發(fā)送1位數(shù)據(jù)后,,比較總線(xiàn)上所呈現(xiàn)的數(shù)據(jù)與自己發(fā)送的是否一致,。是,繼續(xù)發(fā)送,;否則,,退出競(jìng)爭(zhēng)。圖3中給出了兩個(gè)節(jié)點(diǎn)在總線(xiàn)上的仲裁過(guò)程,。SDA線(xiàn)的仲裁可以保證I2C總線(xiàn)系統(tǒng)在多個(gè)主節(jié)點(diǎn)同時(shí)企圖控制總線(xiàn)時(shí)通信正常進(jìn)行并且數(shù)據(jù)不丟失??偩€(xiàn)系統(tǒng)通過(guò)仲裁只允許一個(gè)主節(jié)點(diǎn)可以繼續(xù)占據(jù)總線(xiàn)[1],。

      圖3是以?xún)蓚€(gè)節(jié)點(diǎn)為例的仲裁過(guò)程。DATA1和DATA2分別是主節(jié)點(diǎn)向總線(xiàn)所發(fā)送的數(shù)據(jù)信號(hào),,SDA為總線(xiàn)上所呈現(xiàn)的數(shù)據(jù)信號(hào),,SCL是總線(xiàn)上所呈現(xiàn)的時(shí)鐘信號(hào)。當(dāng)主節(jié)點(diǎn)1,、2同時(shí)發(fā)送起始信號(hào)時(shí),,兩個(gè)主節(jié)點(diǎn)都發(fā)送了高電平信號(hào)。這時(shí)總線(xiàn)上呈現(xiàn)的信號(hào)為高電平,,兩個(gè)主節(jié)點(diǎn)都檢測(cè)到總線(xiàn)上的信號(hào)與自己發(fā)送的信號(hào)相同,,繼續(xù)發(fā)送數(shù)據(jù)。第2個(gè)時(shí)鐘周期,,2個(gè)主節(jié)點(diǎn)都發(fā)送低電平信號(hào),,在總線(xiàn)上呈現(xiàn)的信號(hào)為低電平,仍繼續(xù)發(fā)送數(shù)據(jù),。在第3個(gè)時(shí)鐘周期,,主節(jié)點(diǎn)1發(fā)送高電平信號(hào),而主節(jié)點(diǎn)2發(fā)送低電平信號(hào),。根據(jù)總線(xiàn)的線(xiàn)“與”的邏輯功能,,總線(xiàn)上的信號(hào)為低電平,,這時(shí)主節(jié)點(diǎn)1檢測(cè)到總線(xiàn)上的數(shù)據(jù)和自己所發(fā)送的數(shù)據(jù)不一樣,就斷開(kāi)數(shù)據(jù)的輸出級(jí),,轉(zhuǎn)為從機(jī)接收狀態(tài),。這樣主節(jié)點(diǎn)2就贏得了總線(xiàn),而且數(shù)據(jù)沒(méi)有丟失,,即總線(xiàn)的數(shù)據(jù)與主節(jié)點(diǎn)2所發(fā)送的數(shù)據(jù)一樣,,而主節(jié)點(diǎn)1在轉(zhuǎn)為從節(jié)點(diǎn)后繼續(xù)接收數(shù)據(jù),同樣也沒(méi)有丟掉SDA線(xiàn)上的數(shù)據(jù),。因此在仲裁過(guò)程中數(shù)據(jù)沒(méi)有丟失,。

      圖3  兩個(gè)主節(jié)點(diǎn)的仲裁過(guò)程

      3  多主通信的原理及其實(shí)現(xiàn)流程

      多主通信就是在總線(xiàn)上有多個(gè)節(jié)點(diǎn)。這些節(jié)點(diǎn)既可以作為主節(jié)點(diǎn)訪(fǎng)問(wèn)其他的節(jié)點(diǎn),,也可以作為從節(jié)點(diǎn)被其他節(jié)點(diǎn)訪(fǎng)問(wèn),。當(dāng)有多個(gè)節(jié)點(diǎn)同時(shí)企圖占用總線(xiàn)時(shí),就需要總線(xiàn)的仲裁,。對(duì)于模擬I2C總線(xiàn)系統(tǒng),,怎樣實(shí)現(xiàn)總線(xiàn)的仲裁是現(xiàn)在研究模擬I2C總線(xiàn)系統(tǒng)的難點(diǎn)。文獻(xiàn)\[4\]提出在系統(tǒng)中增加1根BUSY線(xiàn),,在占用總線(xiàn)之前先檢測(cè)BUSY線(xiàn),,看總線(xiàn)是否被占用。若總線(xiàn)空閑,,則設(shè)置BUSY線(xiàn)并向總線(xiàn)上傳送數(shù)據(jù),;否則,接收數(shù)據(jù),,直到總線(xiàn)空閑時(shí)才占有總線(xiàn),。這種實(shí)現(xiàn)多主通信的方法有兩個(gè)缺點(diǎn):① 因?yàn)镮2C最大的優(yōu)點(diǎn)就是接口少、效率高,,這樣做不僅增加了使用資源而且減少了I2C總線(xiàn)的優(yōu)勢(shì),;② 當(dāng)主節(jié)點(diǎn)數(shù)比較多時(shí),等待時(shí)間比較長(zhǎng),,效率不高,。本設(shè)計(jì)根據(jù)總線(xiàn)的仲裁原理,提出一種基于延時(shí)比較的仲裁方法,。當(dāng)主節(jié)點(diǎn)想要占用總線(xiàn)時(shí),,先檢測(cè)總線(xiàn)上是否空閑,如果總線(xiàn)是空閑的就發(fā)送數(shù)據(jù),。在發(fā)送數(shù)據(jù)的同時(shí),,將總線(xiàn)上的數(shù)據(jù)接收并與發(fā)送的數(shù)據(jù)進(jìn)行比較。如果不同,,說(shuō)明總線(xiàn)上同時(shí)還存在其他節(jié)點(diǎn),,于是就退出,;否則,一直到發(fā)送完數(shù)據(jù),。這種方法既體現(xiàn)了I2C總線(xiàn)的高效性,,同時(shí)還具有良好的擴(kuò)展性。

      圖4  多主通信流程

      圖4給出了基于延時(shí)比較的多主通信流程,,其中MCU作為從節(jié)點(diǎn)部分的流程在圖5中給出,。在節(jié)點(diǎn)發(fā)送起始信號(hào)之前先要檢測(cè)一下總線(xiàn)上是否為空閑狀態(tài)(BUSY是否為0)。這里使用的檢測(cè)方法是,,持續(xù)檢測(cè)一段時(shí)間看總線(xiàn)上的電平是否一直為高,,若是說(shuō)明總線(xiàn)上為閑狀態(tài),否則說(shuō)明有其他的節(jié)點(diǎn)正在使用總線(xiàn),,要等一段時(shí)間再發(fā)送,。當(dāng)總線(xiàn)空閑時(shí),發(fā)送起始信號(hào),,接著發(fā)送要訪(fǎng)問(wèn)的從節(jié)點(diǎn)的地址字節(jié),。每發(fā)送1位數(shù)據(jù)就接收比較1次,看發(fā)送和接收的是否一致,,若是則繼續(xù),,否則跳出到從節(jié)點(diǎn)的接收狀態(tài)。如果沒(méi)有產(chǎn)生沖突,,MCU作為主節(jié)點(diǎn)繼續(xù)發(fā)送數(shù)據(jù),,直到任務(wù)結(jié)束,然后發(fā)送停止信號(hào)并返回,。如果數(shù)據(jù)不一樣,,MCU將跳轉(zhuǎn)到從節(jié)點(diǎn)狀態(tài),。由于在跳轉(zhuǎn)到從節(jié)點(diǎn)接收狀態(tài)的過(guò)程中累加器(ACC)和工作寄存器(Ri)的數(shù)據(jù)沒(méi)有發(fā)生變化,,所以數(shù)據(jù)沒(méi)有丟失,作為從節(jié)點(diǎn)可以繼續(xù)接收總線(xiàn)上的數(shù)據(jù),。這樣整個(gè)通信的過(guò)程沒(méi)有中斷,,數(shù)據(jù)也沒(méi)有丟失。

      圖5  從節(jié)點(diǎn)部分的流程

      圖5給出了從節(jié)點(diǎn)的流程,。進(jìn)入從節(jié)點(diǎn)時(shí),,要將BUSY置為高,說(shuō)明MCU現(xiàn)在正在工作,,不能完成其他的任務(wù),。在MCU作為從節(jié)點(diǎn)完成接收任務(wù)后,要將BUSY置為低,。MCU在接收到尋址字節(jié)后與自己的地址字節(jié)進(jìn)行比較,。如果是訪(fǎng)問(wèn)自己的就進(jìn)入到下面的接收程序,,否則跳出。在訪(fǎng)問(wèn)自己的時(shí)候,,還要判斷主節(jié)點(diǎn)是讀取數(shù)據(jù)還是寫(xiě)數(shù)據(jù),,以便進(jìn)入相應(yīng)的程序。在寫(xiě)字節(jié)的子程序中,,從節(jié)點(diǎn)每發(fā)送1個(gè)字節(jié)的數(shù)據(jù)后都要察看是否有應(yīng)答信號(hào)(ACK),,有則說(shuō)明數(shù)據(jù)接收到了;否則要跳出等待,,重新發(fā)送,。在讀字節(jié)的子程序中,每接收1個(gè)字節(jié)的數(shù)據(jù)就要發(fā)送1個(gè)應(yīng)答信號(hào)(ACK),,以示接收正常,,否則主節(jié)點(diǎn)將停止繼續(xù)發(fā)送。在現(xiàn)有的資料中,,關(guān)于從節(jié)點(diǎn)的原理和源代碼比較少,,這里給出作為從節(jié)點(diǎn)時(shí)寫(xiě)字節(jié)子程序的源代碼。由于篇幅有限其他的子程序沒(méi)有列出,。

  4  部分源代碼

  本節(jié)是在MCU多主通信中的部分源代碼,。多主通信的實(shí)現(xiàn)中有幾個(gè)難點(diǎn)和重點(diǎn)。一是在作為主節(jié)點(diǎn)時(shí)的寫(xiě)字節(jié)子程序,,里面要包括發(fā)送的每位數(shù)據(jù)和總線(xiàn)的數(shù)據(jù)進(jìn)行比較并做出判斷,。如果數(shù)據(jù)不同,要跳出并進(jìn)入從節(jié)點(diǎn)的狀態(tài),。由于子程序返回主程序時(shí)改變的只是PC的值而累加器(ACC)和工作寄存器(Ri)里面的值是不變的,,因此MCU進(jìn)入從機(jī)狀態(tài)后繼續(xù)接收總線(xiàn)剩下的數(shù)據(jù),這樣總線(xiàn)的數(shù)據(jù)并沒(méi)有丟失,。二是作為

        從節(jié)點(diǎn)時(shí)的寫(xiě)字節(jié)的子程序,。由于時(shí)鐘線(xiàn)是由主節(jié)點(diǎn)的MCU控制的,所以怎樣根據(jù)SCL線(xiàn)來(lái)讀取SDA線(xiàn)的數(shù)據(jù)是其中的一個(gè)難點(diǎn),。三是在具有子地址的從節(jié)點(diǎn)關(guān)于是寫(xiě)字節(jié)還是讀字節(jié)時(shí)的判斷,。如果是寫(xiě)字節(jié)時(shí)主節(jié)點(diǎn)會(huì)給出新的起始信號(hào),并再次發(fā)送從節(jié)點(diǎn)的地址數(shù)據(jù),。這時(shí)從節(jié)點(diǎn)需要做出判斷是讀取數(shù)據(jù)還是寫(xiě)數(shù)據(jù),,并進(jìn)入相應(yīng)的子程序。這里給出以上三個(gè)重點(diǎn)和難點(diǎn)的子程序的源代碼,,以供讀者參考,。這些源代碼經(jīng)實(shí)踐證明都是正確的。

   主節(jié)點(diǎn)的寫(xiě)字節(jié)子程序:
        其中的NOP可根據(jù)時(shí)鐘的快慢自己加減
  WRBYTE:MOV R0,#08H
      CLR BUSY;將BUSY值清零
  WLP:  RLC A;取數(shù)據(jù)位
  JC   WR1
      SJMP WR0;判斷數(shù)據(jù)位
  WLP1: DJNZ R0,WLP
      NOP
  OUT1: RET
  WR1:  SETB SDA;發(fā)送1
      NOP
      SETB  SCL
      MOV  C,SDA;判斷是否與發(fā)送的數(shù)據(jù)相同
      JC   GOON
      SETB  BUSY
      AJMP  OUT1
  GOON: NOP
      NOP
      NOP
      CLR SCL
      SJMP WLP1
  WR0:  CLR SDA;發(fā)送0
      NOP
      SCL
      NOP
      NOP
      NOP
      NOP
      NOP
      CLR
      SCL
  SJMP  WLP1
  從節(jié)點(diǎn)的寫(xiě)字節(jié)子程序(返回為ACK):
  SWRBYTE:MOV R0,#08H
  WAGAIN: RRC A
      MOV B,#37H
  WWAIT1: JB SCL,WWAIT1;等待SCL為低
      JC WR1;判斷是發(fā)送“1”還是發(fā)送“0”
      SETB SDA;發(fā)送“1”
      AJMP COM
  WR1:  CLR SDA;發(fā)送“0”
  COM:  DJNZ R0,WWAIT2;判斷是否發(fā)送完畢
  WWAIT3: JNB SCL,WWAIT3;發(fā)送完畢等待應(yīng)答信號(hào)
  WWAIT4: JB SCL,WWAIT4
  WWAIT5: JNB SCL,WWAIT5
      CLR ACK
      JB  SDA,ST0
      SETB ACK
  ST0:  RET;返回
  WWAIT2: JNB SCL,WWAIT2;等待SCL為高
      SJMP WAGAIN
      從節(jié)點(diǎn)的讀字節(jié)同時(shí)判斷是否有起始信號(hào)的子程序。如果有起始信號(hào),,則轉(zhuǎn)為寫(xiě)字節(jié)子程序:
  SRDBYTE:MOV R0,#08H
      SETB 20H;設(shè)置標(biāo)志位判斷是讀還是寫(xiě)
      SETB SDA;釋放總線(xiàn)
  RWAITJ: JNB SCL,RWAITJ;等待SCL為高
      MOV C,SDA;從總線(xiàn)上讀取數(shù)據(jù)
      RRC A;存入累計(jì)器
      DEC R0
      MOV C,ACC.7;判斷是否為起始信號(hào)
      JNC RWAITJ1;為低繼續(xù)讀取數(shù)據(jù)
  REWAIT: JNB SCL,RWAITJ1;開(kāi)始判斷是否為起始信號(hào)
      JB  SDA,REWAIT
      CLR 20H;是,,則清標(biāo)志位并返回
      AJMP SjRDOUT
  RWAITJ1:JB SCL,RWAITJ1;等待SCL為低
  RWAITJ3:JNB SCL,RWAITJ3;等待SCL為高
      MOV C,SDA
      RRC A
      DJNZ R0,RWAITJ2
  SjRDOUT:RET
  RWAITJ2:JB SCL,RWAITJ2;等待SCL為低繼續(xù)讀數(shù)據(jù)
      SJMP RWAITJ3

  5  總結(jié)

  根據(jù)總線(xiàn)協(xié)議中的仲裁原理,提出的基于延時(shí)比較的模擬I2C多主通信的方法,,不僅能夠體現(xiàn)了I2C總線(xiàn)的高效性,,而且還具有良好的擴(kuò)展性。它使普通不具有I2C接口的MCU可以應(yīng)用在多主通信的系統(tǒng)中,,既增加了普通MCU的使用范圍,,又突破了模擬I2C總線(xiàn)的應(yīng)用局限性,為I2C總線(xiàn)的推廣起到了積極的作用,。

  參考文獻(xiàn)

1  The I2CBus SpecificaTIon, Version 2.1. January, 2000. http://www.philips.com/
2  張昆,邱揚(yáng),劉浩. 基于CPLD的系統(tǒng)中I2C總線(xiàn)的設(shè)計(jì). 電子技術(shù)應(yīng)用,,2003(11)
3  何立民. I2C總線(xiàn)應(yīng)用系統(tǒng)設(shè)計(jì). 北京:北京航空航天大學(xué)出版社,1995
4 張冬梅,藩仕彬,何為民. 模擬I2C總線(xiàn)多主通信的通用軟件包. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用, 2003(12)

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。