I2C總線(Inter IC BUS)是PHILIPS公司推出的雙向兩線串行通信標(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ù)傳輸,總線具有沖突檢測(cè)和仲裁功能,保證通信正常進(jìn)行并防止數(shù)據(jù)破壞,F(xiàn)在許多微控制器(MCU)都具有I2C總線接口,能方便地進(jìn)行I2C總線設(shè)計(jì)。對(duì)于沒有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)簡(jiǎn)介
I2C總線系統(tǒng)是由SCL(串行時(shí)鐘)和SDA(串行數(shù)據(jù))兩根總線構(gòu)成的。該總線有嚴(yán)格的時(shí)序要求,總線工作時(shí),由串行時(shí)鐘線SCL傳送時(shí)鐘脈沖,由串行數(shù)據(jù)線SDA傳送數(shù)據(jù)?偩協(xié)議規(guī)定,各主節(jié)點(diǎn)進(jìn)行通信時(shí)都要有起始、結(jié)束、發(fā)送數(shù)據(jù)和應(yīng)答信號(hào)。這些信號(hào)都是通信過程中的基本單元。總線傳送的每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)總線后的第1個(gè)字節(jié)的高7位是對(duì)從節(jié)點(diǎn)的尋址地址,第8位為方向位(“0”表示主節(jié)點(diǎn)對(duì)從節(jié)點(diǎn)的寫操作;“1”表示主節(jié)點(diǎn)對(duì)從節(jié)點(diǎn)的讀操作),其余的字節(jié)為操作數(shù)據(jù)。圖1列出I2C總線上幾個(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線為高時(shí)SDA線從高變化到低;停止信號(hào)就是在SCL線為高時(shí)SDA線從低變化到高;應(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總線上基本信號(hào)的時(shí)序
圖2表示了一個(gè)完整的數(shù)據(jù)傳送過程。在I2C總線發(fā)送起始信號(hào)后,發(fā)送從機(jī)的7位尋址地址和1位表示這次操作性質(zhì)的讀寫位,在有應(yīng)答信號(hào)后開始傳送數(shù)據(jù),直到發(fā)送停止信號(hào)。數(shù)據(jù)是以字節(jié)為單位的。發(fā)送節(jié)點(diǎn)每發(fā)送1個(gè)字節(jié)就要檢測(cè)SDA線上有沒有收到應(yīng)答信號(hào),有則繼續(xù)發(fā)送,否則將停止發(fā)送數(shù)據(jù)。
圖2 一次完整的數(shù)據(jù)傳送過程
2 I2C總線的仲裁
在多主的通信系統(tǒng)中?偩上有多個(gè)節(jié)點(diǎn),它們都有自己的尋址地址,可以作為從節(jié)點(diǎn)被別的節(jié)點(diǎn)訪問,同時(shí)它們都可以作為主節(jié)點(diǎn)向其他的節(jié)點(diǎn)發(fā)送控制字節(jié)和傳送數(shù)據(jù)。但是如果有兩個(gè)或兩個(gè)以上的節(jié)點(diǎn)都向總線上發(fā)送啟動(dòng)信號(hào)并開始傳送數(shù)據(jù),這樣就形成了沖突。要解決這種沖突,就要進(jìn)行仲裁的判決,這就是I2C總線上的仲裁。
I2C總線上的仲裁分兩部分:SCL線的同步和SDA線的仲裁。SCL同步是由于總線具有線“與”的邏輯功能,即只要有一個(gè)節(jié)點(diǎn)發(fā)送低電平時(shí),總線上就表現(xiàn)為低電平。當(dāng)所有的節(jié)點(diǎn)都發(fā)送高電平時(shí),總線才能表現(xiàn)為高電平。正是由于線“與”邏輯功能的原理,當(dāng)多個(gè)節(jié)點(diǎn)同時(shí)發(fā)送時(shí)鐘信號(hào)時(shí),在總線上表現(xiàn)的是統(tǒng)一的時(shí)鐘信號(hào)。這就是SCL的同步原理。
SDA線的仲裁也是建立在總線具有線“與”邏輯功能的原理上的。節(jié)點(diǎn)在發(fā)送1位數(shù)據(jù)后,比較總線上所呈現(xiàn)的數(shù)據(jù)與自己發(fā)送的是否一致。是,繼續(xù)發(fā)送;否則,退出競(jìng)爭(zhēng)。圖3中給出了兩個(gè)節(jié)點(diǎn)在總線上的仲裁過程。SDA線的仲裁可以保證I2C總線系統(tǒng)在多個(gè)主節(jié)點(diǎn)同時(shí)企圖控制總線時(shí)通信正常進(jìn)行并且數(shù)據(jù)不丟失?偩系統(tǒng)通過仲裁只允許一個(gè)主節(jié)點(diǎn)可以繼續(xù)占據(jù)總線[1]。
圖3是以兩個(gè)節(jié)點(diǎn)為例的仲裁過程。DATA1和DATA2分別是主節(jié)點(diǎn)向總線所發(fā)送的數(shù)據(jù)信號(hào),SDA為總線上所呈現(xiàn)的數(shù)據(jù)信號(hào),SCL是總線上所呈現(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)的信號(hào)為高電平,兩個(gè)主節(jié)點(diǎn)都檢測(cè)到總線上的信號(hào)與自己發(fā)送的信號(hào)相同,繼續(xù)發(fā)送數(shù)據(jù)。第2個(gè)時(shí)鐘周期,2個(gè)主節(jié)點(diǎn)都發(fā)送低電平信號(hào),在總線上呈現(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ù)總線的線“與”的邏輯功能,總線上的信號(hào)為低電平,這時(shí)主節(jié)點(diǎn)1檢測(cè)到總線上的數(shù)據(jù)和自己所發(fā)送的數(shù)據(jù)不一樣,就斷開數(shù)據(jù)的輸出級(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 兩個(gè)主節(jié)點(diǎn)的仲裁過程
3 多主通信的原理及其實(shí)現(xiàn)流程
多主通信就是在總線上有多個(gè)節(jié)點(diǎn)。這些節(jié)點(diǎn)既可以作為主節(jié)點(diǎn)訪問其他的節(jié)點(diǎn),也可以作為從節(jié)點(diǎn)被其他節(jié)點(diǎn)訪問。當(dāng)有多個(gè)節(jié)點(diǎn)同時(shí)企圖占用總線時(shí),就需要總線的仲裁。對(duì)于模擬I2C總線系統(tǒng),怎樣實(shí)現(xiàn)總線的仲裁是現(xiàn)在研究模擬I2C總線系統(tǒng)的難點(diǎn)。文獻(xiàn)\[4\]提出在系統(tǒng)中增加1根BUSY線,在占用總線之前先檢測(cè)BUSY線,看總線是否被占用。若總線空閑,則設(shè)置BUSY線并向總線上傳送數(shù)據(jù);否則,接收數(shù)據(jù),直到總線空閑時(shí)才占有總線。這種實(shí)現(xiàn)多主通信的方法有兩個(gè)缺點(diǎn):① 因?yàn)镮2C最大的優(yōu)點(diǎn)就是接口少、效率高,這樣做不僅增加了使用資源而且減少了I2C總線的優(yōu)勢(shì);② 當(dāng)主節(jié)點(diǎn)數(shù)比較多時(shí),等待時(shí)間比較長(zhǎng),效率不高。本設(shè)計(jì)根據(jù)總線的仲裁原理,提出一種基于延時(shí)比較的仲裁方法。當(dāng)主節(jié)點(diǎn)想要占用總線時(shí),先檢測(cè)總線上是否空閑,如果總線是空閑的就發(fā)送數(shù)據(jù)。在發(fā)送數(shù)據(jù)的同時(shí),將總線上的數(shù)據(jù)接收并與發(fā)送的數(shù)據(jù)進(jìn)行比較。如果不同,說明總線上同時(shí)還存在其他節(jié)點(diǎn),于是就退出;否則,一直到發(fā)送完數(shù)據(jù)。這種方法既體現(xiàn)了I2C總線的高效性,同時(shí)還具有良好的擴(kuò)展性。
來源:維庫開發(fā)網(wǎng)