音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

研究I2C總線多主通信與軟件設計

出處:維庫開發(fā)網(wǎng) 發(fā)布于:2011-09-04 14:27:22

   

    I2C(Inter-Integrated Circuit)總線是由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器MCU)及其外圍設備。是微電子通信控制領域廣泛采用的一種總線標準。它是同步通信的一種特殊形式,具有接口線少,控制方式簡單,器件封裝形式小,通信速率較高等優(yōu)點,現(xiàn)已得到廣泛的應用。它除了可以進行簡單的單主節(jié)點通信外,還可以應用在多主節(jié)點的通信系統(tǒng)中。在多主節(jié)點通信系統(tǒng)中,如果兩個或者更多的主節(jié)點同時啟動數(shù)據(jù)傳輸,總線具有沖突檢測和仲裁功能,保證通信正常進行并防止數(shù)據(jù)破壞。現(xiàn)在許多微控制器都具有I2C總線接口,能方便地進行I2C總線設計。對于沒有I2C總線接口的MCU,可以采用兩條I/O接口線進行模擬。目前,一些介紹模擬I2C的資料主要講的是在單主節(jié)點系統(tǒng)中進行的通信,這使得模擬I2C總線的應用具有一定的局限性。本文根據(jù)總線仲裁的思想,提出一種多主節(jié)點通信的思想及實現(xiàn)流程。


1 I2C總線系統(tǒng)簡介

     I2C總線系統(tǒng)是由SCL(串行時鐘)和SDA(串行數(shù)據(jù))兩根總線構成的。該總線有嚴格的時序要求,總線工作時,由串行時鐘線SCL傳送時鐘脈沖,由串行數(shù)據(jù)線SDA傳送數(shù)據(jù)。除此之外,I2C總線系統(tǒng)還有每個連接到總線的器件都可以通過的地址和一直存在的簡單的主機/從機關系軟件設定地址,主機可以作為主機發(fā)送器或主機接收器;它是一個真正的多主機總線,如果兩個或更多主機同時初始化,數(shù)據(jù)傳輸可以通過沖突檢測和仲裁防止數(shù)據(jù)被破壞;串行的8 位雙向數(shù)據(jù)傳輸位速率在標準模式下可達100kbit/s,快速模式下可達400kbit/s,高速模式下可達3.4Mbit/s;連接到相同總線的IC 數(shù)量只受到總線的電容400pF 限制等特征??偩€協(xié)議規(guī)定,各主節(jié)點進行通信時都要有起始、結(jié)束、發(fā)送數(shù)據(jù)和應答信號。這些信號都是通信過程中的基本單元??偩€傳送的每1幀數(shù)據(jù)均是1個字節(jié),每當發(fā)送完1個字節(jié)后,接收節(jié)點就相應給一應答信號。協(xié)議規(guī)定,在啟動總線后的第1個字節(jié)的高7位是對從節(jié)點的尋址地址,第8位為方向位(“0”表示主節(jié)點對從節(jié)點的寫操作;“1”表示主節(jié)點對從節(jié)點的讀操作),其余的字節(jié)為操作數(shù)據(jù)。由于連接到I2C 總線的器件有不同種類的工藝(CMOS、NMOS、雙極性),邏輯0(低)和邏輯1(高)的電平不是固定的,它由電源VDD的相關電平?jīng)Q定,每傳輸一個數(shù)據(jù)位就產(chǎn)生一個時鐘脈沖。

  I2C總線術語包括,發(fā)送器:發(fā)送數(shù)據(jù)到總線的器件;接收器:從總線接收數(shù)據(jù)的器件;主機:初始化發(fā)送產(chǎn)生時鐘信號和終止發(fā)送的器件;從機:被主機尋址的器件;多主機:同時有多于一個主機嘗試控制總線但不破壞傳輸;仲裁:是一個在有多個主機同時嘗試控制總線但只允許其中一個控制總線并使傳輸不被破壞的過程;同步:兩個或多個器件同步時鐘信號的過程 。

  圖1列出I2C總線上幾個基本信號的時序。圖1中包括起始信號、停止信號、應答信號、非應答信號以及傳輸數(shù)據(jù)“0”和數(shù)據(jù)“1”的時序。SCL 線是高電平時,SDA 線從高電平向低電平切換,這個情況表示起始條件;SCL 線是高電平時,SDA 線由低電平向高電平切換,這個情況表示停止條件。起始和停止條件一般由主機產(chǎn)生,總線在起始條件后被認為處于忙的狀態(tài)。起始和停止條件,在停止條件的某段時間后總線被認為再次處于空閑狀態(tài)。如果產(chǎn)生重復起始條件而不產(chǎn)生停止條件,總線會一直處于忙的狀態(tài),此時的起始條件(S)和重復起始條件(Sr)在功能上是一樣的。應答信號是在SCL為高時SDA為低;非應答信號則與之相反。傳輸數(shù)據(jù)“0”和數(shù)據(jù)“1”與發(fā)送應答位和非應答位時序圖是相同的。


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

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


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

     還有一種為競爭發(fā)生時的時鐘同步。在I2C總線上傳送信息時的時鐘同步信號是由掛接在SCL線上的所有器件的邏輯“與”完成的。SCL線上由高電平到低電平的跳變將影響到這些器件,一旦某個器件的時鐘信號下跳為低電平,將使SCL線一直保持低電平,使SCL線上的所有器件開始低電平期。此時,低電平周期短的器件的時鐘由低至高的跳變并不能影響SCL線的狀態(tài),于是這些器件將進入高電平等待的狀態(tài)。當所有器件的時鐘信號都上跳為高電平時,低電平期結(jié)束,SCL線被釋放返回高電平,即所有的器件都同時開始它們的高電平期。其后,個結(jié)束高電平期的器件又將SCL線拉成低電平。這樣就在SCL線上產(chǎn)生一個同步時鐘??梢?,時鐘低電平時間由時鐘低電平期長的器件確定,而時鐘高電平時間由時鐘高電平期短的器件確定。

2 I2C總線的仲裁

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

  在以下幾種情況下,I2C總線仲裁會失敗。

 ?。?)在地址或數(shù)據(jù)發(fā)送周期,當主設備輸出“1”,而SDA被采樣為“0”。

 ?。?)在數(shù)據(jù)接收周期的應答位,當主設備輸出“1”,而SDA被采樣為“0”。

 ?。?)當總線忙時,企圖有一個START。

 ?。?)在從模式中,企圖有一個Repeat START。

 ?。?)檢測到一個STOP,而主設備并沒有STOP請求。

  如果I2C控制器工作在主模式,輸出SDA信號將會與輸入SDA信號進行比較以確定總線仲裁是甭失效。在數(shù)據(jù)傳輸過程中,SDA信號僅在SCL為高電平的時被檢查(ACK周期除外),以確保START/STOP不會在錯誤的時間內(nèi)產(chǎn)生。如果發(fā)現(xiàn)輸出SDA與輸入SDA不同,則總線仲裁失敗,這時MAL位被置位。同時CoolRunner-II I2C控制器切換到從模式并復位MSTA位。

  CoolRunner-II fc控制器在總線忙時不會產(chǎn)生START,然而如果在總線忙時,uC依然發(fā)出START/Repeat START請求,則MAL位將會被置位。另外,在主設備沒有發(fā)出STOP請求時,MAL仍然因為STOP被檢測到而置位。這些都被視為仲裁失敗,應該避免,并正確處理。

  如果仲裁失敗發(fā)生在字節(jié)傳輸過程中,SOL會一直產(chǎn)生,直到字節(jié)傳輸完成。

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

  SDA線的仲裁也是建立在總線具有線“和”邏輯功能的原理上的。節(jié)點在發(fā)送1位數(shù)據(jù)后,比較總線上所呈現(xiàn)的數(shù)據(jù)和自己發(fā)送的是否一致。是,繼續(xù)發(fā)送;否則,退出競爭。圖3中給出了兩個節(jié)點在總線上的仲裁過程。SDA線的仲裁可以保證I2C總線系統(tǒng)在多個主節(jié)點同時企圖控制總線時,能夠正常通信并且不丟失數(shù)據(jù)。所以當一個節(jié)點發(fā)送數(shù)據(jù)時,每發(fā)送一位數(shù)據(jù)后,都需要判斷總線上所呈現(xiàn)的數(shù)據(jù)是否與自己發(fā)送的一致,如果不一致,放棄發(fā)送;否則,繼續(xù)發(fā)送。

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


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


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

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



圖4 多主通信流程

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



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

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

4 部分源代碼

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

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

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

  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

  1

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

  SRDBYTE:MOV R0,#08H

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

  SETB SDA;釋放總線

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

  MOV C,SDA;從總線上讀取數(shù)據(jù)

  RRC A;存入累計器

  DEC R0

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

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

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

  SJMP RWAITJ3

  5 總結(jié)

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



  
關鍵詞:I2C總線通信總線

版權與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。

如涉及作品內(nèi)容、版權等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關權利。

OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務:
賣家服務:
技術客服:

0571-85317607

網(wǎng)站技術支持

13606545031

客服在線時間周一至周五
9:00-17:30

關注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!