《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 模擬I²C總線多主通信研究與軟件設計
模擬I²C總線多主通信研究與軟件設計
摘要: 介紹模擬I2C總線的多主節(jié)點通信原理,,并提出一種新的實現方法,。這種采用延時接收比較來實現仲裁的方法,,可使不具有I2C接口的普通微控制器(MCU)能夠實現模擬I2C總線的多主通信,,同時對I2C總線的推廣起到了積極作用。
Abstract:
Key words :

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

  1  I2C總線系統(tǒng)簡介[1~3]

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

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


  圖1  I2C總線上基本信號的時序

  圖2表示了一個完整的數據傳送過程。在I2C總線發(fā)送起始信號后,,發(fā)送從機的7位尋址地址和1位表示這次操作性質的讀寫位,,在有應答信號后開始傳送數據,直到發(fā)送停止信號,。數據是以字節(jié)為單位的,。發(fā)送節(jié)點每發(fā)送1個字節(jié)就要檢測SDA線上有沒有收到應答信號,有則繼續(xù)發(fā)送,,否則將停止發(fā)送數據,。


  圖2  一次完整的數據傳送過程

  2  I2C總線的仲裁

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

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

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

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


  圖3  兩個主節(jié)點的仲裁過程

  3  多主通信的原理及其實現流程

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

  圖4  多主通信流程

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


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

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

  4  部分源代碼

  本節(jié)是在MCU多主通信中的部分源代碼,。多主通信的實現中有幾個難點和重點,。一是在作為主節(jié)點時的寫字節(jié)子程序,里面要包括發(fā)送的每位數據和總線的數據進行比較并做出判斷,。如果數據不同,,要跳出并進入從節(jié)點的狀態(tài)。由于子程序返回主程序時改變的只是PC的值而累加器(ACC)和工作寄存器(Ri)里面的值是不變的,,因此MCU進入從機狀態(tài)后繼續(xù)接收總線剩下的數據,,這樣總線的數據并沒有丟失。二是作為從節(jié)點時的寫字節(jié)的子程序,。由于時鐘線是由主節(jié)點的MCU控制的,,所以怎樣根據SCL線來讀取SDA線的數據是其中的一個難點。三是在具有子地址的從節(jié)點關于是寫字節(jié)還是讀字節(jié)時的判斷,。如果是寫字節(jié)時主節(jié)點會給出新的起始信號,,并再次發(fā)送從節(jié)點的地址數據。這時從節(jié)點需要做出判斷是讀取數據還是寫數據,,并進入相應的子程序,。這里給出以上三個重點和難點的子程序的源代碼,以供讀者參考,。這些源代碼經實踐證明都是正確的,。

  主節(jié)點的寫字節(jié)子程序:

  ;其中的NOP可根據時鐘的快慢自己加減

  WRBYTE:MOV R0,#08H

  CLR BUSY;將BUSY值清零

  WLP:  RLC A;取數據位

  JC   WR1

  SJMP WR0;判斷數據位

  WLP1: DJNZ R0,WLP

  NOP

  OUT1: RET

  WR1:  SETB SDA;發(fā)送1

  NOP

  SETB  SCL

  MOV  C,SDA;判斷是否與發(fā)送的數據相同

  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é)點的寫字節(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ā)送完畢等待應答信號

  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é)點的讀字節(jié)同時判斷是否有起始信號的子程序。如果有起始信號,,則轉為寫字節(jié)子程序:

  SRDBYTE:MOV R0,#08H

  SETB 20H;設置標志位判斷是讀還是寫

  SETB SDA;釋放總線

  RWAITJ: JNB SCL,RWAITJ;等待SCL為高

  MOV C,SDA;從總線上讀取數據

  RRC A;存入累計器

  DEC R0

  MOV C,ACC.7;判斷是否為起始信號

  JNC RWAITJ1;為低繼續(xù)讀取數據

  REWAIT: JNB SCL,RWAITJ1;開始判斷是否為起始信號

  JB  SDA,REWAIT

  CLR 20H;是,,則清標志位并返回

  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ù)讀數據

  SJMP RWAITJ3

  5  總結

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

此內容為AET網站原創(chuàng),,未經授權禁止轉載。