新聞中心

EEPW首頁 > 手機(jī)與無線通信 > 設(shè)計應(yīng)用 > 模擬I2C總線多主節(jié)點(diǎn)通信原理及實(shí)現(xiàn)方法

模擬I2C總線多主節(jié)點(diǎn)通信原理及實(shí)現(xiàn)方法

作者: 時間:2010-12-14 來源:網(wǎng)絡(luò) 收藏

摘要 介紹的多主,并提出一種新的。這種采用延時接收比較來仲裁的,可使不具有接口的普通微控制器(MCU)能夠的多主,同時對I2C的推廣起到了積極作用。

本文引用地址:http://m.butianyuan.cn/article/156877.htm

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

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

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

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


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

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


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

  2 I2C總線的仲裁

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

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

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

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


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

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

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


  圖4 多主通信流程

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


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


上一頁 1 2 3 下一頁

評論


相關(guān)推薦

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

關(guān)閉