研究I2C總線多主通信與軟件設(shè)計(jì)
出處:維庫(kù)開(kāi)發(fā)網(wǎng) 發(fā)布于:2011-09-04 14:27:22
I2C(Inter-Integrated Circuit)總線是由PHILIPS公司開(kāi)發(fā)的兩線式串行總線,用于連接微控制器(MCU)及其外圍設(shè)備。是微電子通信控制領(lǐng)域廣泛采用的一種總線標(biāo)準(zhǔn)。它是同步通信的一種特殊形式,具有接口線少,控制方式簡(jiǎn)單,器件封裝形式小,通信速率較高等優(yōu)點(diǎn),現(xiàn)已得到廣泛的應(yīng)用。它除了可以進(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ù)破壞。現(xiàn)在許多微控制器都具有I2C總線接口,能方便地進(jìn)行I2C總線設(shè)計(jì)。對(duì)于沒(méi)有I2C總線接口的MCU,可以采用兩條I/O接口線進(jìn)行模擬。目前,一些介紹模擬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ù)。除此之外,I2C總線系統(tǒng)還有每個(gè)連接到總線的器件都可以通過(guò)的地址和一直存在的簡(jiǎn)單的主機(jī)/從機(jī)關(guān)系軟件設(shè)定地址,主機(jī)可以作為主機(jī)發(fā)送器或主機(jī)接收器;它是一個(gè)真正的多主機(jī)總線,如果兩個(gè)或更多主機(jī)同時(shí)初始化,數(shù)據(jù)傳輸可以通過(guò)沖突檢測(cè)和仲裁防止數(shù)據(jù)被破壞;串行的8 位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá)100kbit/s,快速模式下可達(dá)400kbit/s,高速模式下可達(dá)3.4Mbit/s;連接到相同總線的IC 數(shù)量只受到總線的電容400pF 限制等特征。總線協(xié)議規(guī)定,各主節(jié)點(diǎn)進(jìn)行通信時(shí)都要有起始、結(jié)束、發(fā)送數(shù)據(jù)和應(yīng)答信號(hào)。這些信號(hào)都是通信過(guò)程中的基本單元。總線傳送的每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ù)。由于連接到I2C 總線的器件有不同種類的工藝(CMOS、NMOS、雙極性),邏輯0(低)和邏輯1(高)的電平不是固定的,它由電源VDD的相關(guān)電平?jīng)Q定,每傳輸一個(gè)數(shù)據(jù)位就產(chǎn)生一個(gè)時(shí)鐘脈沖。
I2C總線術(shù)語(yǔ)包括,發(fā)送器:發(fā)送數(shù)據(jù)到總線的器件;接收器:從總線接收數(shù)據(jù)的器件;主機(jī):初始化發(fā)送產(chǎn)生時(shí)鐘信號(hào)和終止發(fā)送的器件;從機(jī):被主機(jī)尋址的器件;多主機(jī):同時(shí)有多于一個(gè)主機(jī)嘗試控制總線但不破壞傳輸;仲裁:是一個(gè)在有多個(gè)主機(jī)同時(shí)嘗試控制總線但只允許其中一個(gè)控制總線并使傳輸不被破壞的過(guò)程;同步:兩個(gè)或多個(gè)器件同步時(shí)鐘信號(hào)的過(guò)程 。
圖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í)序。SCL 線是高電平時(shí),SDA 線從高電平向低電平切換,這個(gè)情況表示起始條件;SCL 線是高電平時(shí),SDA 線由低電平向高電平切換,這個(gè)情況表示停止條件。起始和停止條件一般由主機(jī)產(chǎn)生,總線在起始條件后被認(rèn)為處于忙的狀態(tài)。起始和停止條件,在停止條件的某段時(shí)間后總線被認(rèn)為再次處于空閑狀態(tài)。如果產(chǎn)生重復(fù)起始條件而不產(chǎn)生停止條件,總線會(huì)一直處于忙的狀態(tài),此時(shí)的起始條件(S)和重復(fù)起始條件(Sr)在功能上是一樣的。應(yīng)答信號(hào)是在SCL為高時(shí)SDA為低;非應(yīng)答信號(hào)則與之相反。傳輸數(shù)據(jù)“0”和數(shù)據(jù)“1”與發(fā)送應(yīng)答位和非應(yīng)答位時(shí)序圖是相同的。

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

圖2 完整的數(shù)據(jù)傳送過(guò)程
還有一種為競(jìng)爭(zhēng)發(fā)生時(shí)的時(shí)鐘同步。在I2C總線上傳送信息時(shí)的時(shí)鐘同步信號(hào)是由掛接在SCL線上的所有器件的邏輯“與”完成的。SCL線上由高電平到低電平的跳變將影響到這些器件,一旦某個(gè)器件的時(shí)鐘信號(hào)下跳為低電平,將使SCL線一直保持低電平,使SCL線上的所有器件開(kāi)始低電平期。此時(shí),低電平周期短的器件的時(shí)鐘由低至高的跳變并不能影響SCL線的狀態(tài),于是這些器件將進(jìn)入高電平等待的狀態(tài)。當(dāng)所有器件的時(shí)鐘信號(hào)都上跳為高電平時(shí),低電平期結(jié)束,SCL線被釋放返回高電平,即所有的器件都同時(shí)開(kāi)始它們的高電平期。其后,個(gè)結(jié)束高電平期的器件又將SCL線拉成低電平。這樣就在SCL線上產(chǎn)生一個(gè)同步時(shí)鐘。可見(jiàn),時(shí)鐘低電平時(shí)間由時(shí)鐘低電平期長(zhǎng)的器件確定,而時(shí)鐘高電平時(shí)間由時(shí)鐘高電平期短的器件確定。
2 I2C總線的仲裁
在多主的通信系統(tǒng)中。總線上有多個(gè)節(jié)點(diǎn),他們都有自己的尋址地址,能作為從節(jié)點(diǎn)被別的節(jié)點(diǎn)訪問(wèn),同時(shí)他們都能作為主節(jié)點(diǎn)向其他的節(jié)點(diǎn)發(fā)送控制字節(jié)和傳送數(shù)據(jù)。不過(guò)如果有兩個(gè)或兩個(gè)以上的節(jié)點(diǎn)都向總線上發(fā)送啟動(dòng)信號(hào)并開(kāi)始傳送數(shù)據(jù),這樣就形成了沖突。要解決這種沖突,就要進(jìn)行仲裁的判決,這就是I2C總線上的仲裁。
在以下幾種情況下,I2C總線仲裁會(huì)失敗。
(1)在地址或數(shù)據(jù)發(fā)送周期,當(dāng)主設(shè)備輸出“1”,而SDA被采樣為“0”。
(2)在數(shù)據(jù)接收周期的應(yīng)答位,當(dāng)主設(shè)備輸出“1”,而SDA被采樣為“0”。
(3)當(dāng)總線忙時(shí),企圖有一個(gè)START。
(4)在從模式中,企圖有一個(gè)Repeat START。
(5)檢測(cè)到一個(gè)STOP,而主設(shè)備并沒(méi)有STOP請(qǐng)求。
如果I2C控制器工作在主模式,輸出SDA信號(hào)將會(huì)與輸入SDA信號(hào)進(jìn)行比較以確定總線仲裁是甭失效。在數(shù)據(jù)傳輸過(guò)程中,SDA信號(hào)僅在SCL為高電平的時(shí)被檢查(ACK周期除外),以確保START/STOP不會(huì)在錯(cuò)誤的時(shí)間內(nèi)產(chǎn)生。如果發(fā)現(xiàn)輸出SDA與輸入SDA不同,則總線仲裁失敗,這時(shí)MAL位被置位。同時(shí)CoolRunner-II I2C控制器切換到從模式并復(fù)位MSTA位。
CoolRunner-II fc控制器在總線忙時(shí)不會(huì)產(chǎn)生START,然而如果在總線忙時(shí),uC依然發(fā)出START/Repeat START請(qǐng)求,則MAL位將會(huì)被置位。另外,在主設(shè)備沒(méi)有發(fā)出STOP請(qǐng)求時(shí),MAL仍然因?yàn)镾TOP被檢測(cè)到而置位。這些都被視為仲裁失敗,應(yīng)該避免,并正確處理。
如果仲裁失敗發(fā)生在字節(jié)傳輸過(guò)程中,SOL會(huì)一直產(chǎn)生,直到字節(jié)傳輸完成。
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)在總線上的仲裁過(guò)程。SDA線的仲裁可以保證I2C總線系統(tǒng)在多個(gè)主節(jié)點(diǎn)同時(shí)企圖控制總線時(shí),能夠正常通信并且不丟失數(shù)據(jù)。所以當(dāng)一個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù)時(shí),每發(fā)送一位數(shù)據(jù)后,都需要判斷總線上所呈現(xiàn)的數(shù)據(jù)是否與自己發(fā)送的一致,如果不一致,放棄發(fā)送;否則,繼續(xù)發(fā)送。
圖3是以兩個(gè)節(jié)點(diǎn)為例的仲裁過(guò)程。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ù)不相同,就斷開(kāi)數(shù)據(jù)的輸出級(jí),轉(zhuǎn)為從機(jī)接收狀態(tài)。這樣主節(jié)點(diǎn)2就贏得了總線,而且數(shù)據(jù)沒(méi)有丟失,即總線的數(shù)據(jù)和主節(jié)點(diǎn)2所發(fā)送的數(shù)據(jù)相同,而主節(jié)點(diǎn)1在轉(zhuǎn)為從節(jié)點(diǎn)后繼續(xù)接收數(shù)據(jù),同樣也沒(méi)有丟掉SDA線上的數(shù)據(jù)。因此在仲裁過(guò)程中數(shù)據(jù)沒(méi)有丟失。

圖3 兩個(gè)主節(jié)點(diǎn)的仲裁過(guò)程
3 多主通信的原理及其實(shí)現(xiàn)流程
多主通信就是在總線上有多個(gè)節(jié)點(diǎn)。這些節(jié)點(diǎn)既能作為主節(jié)點(diǎn)訪問(wèn)其他的節(jié)點(diǎn),也能作為從節(jié)點(diǎn)被其他節(jié)點(diǎn)訪問(wèn)。當(dāng)有多個(gè)節(jié)點(diǎn)同時(shí)企圖占用總線時(shí),就需要總線的仲裁。對(duì)于模擬I2C總線系統(tǒng),怎樣去實(shí)現(xiàn)總線的仲裁是目前研究模擬I2C總線系統(tǒng)的難點(diǎn)。有些人提出在系統(tǒng)中增加1根BUSY線,在占用總線之前先檢測(cè)BUSY線,看總線是否被占用。若總線空閑,則設(shè)置BUSY線并向總線上傳送數(shù)據(jù);否則,接收數(shù)據(jù),直到總線空閑時(shí)才占有總線。這種實(shí)現(xiàn)多主通信的方法有兩個(gè)缺點(diǎn):① 因?yàn)镮2C的好處就是接口少、效率高,這樣做不僅增加了使用資源而且減少了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)行比較。如果不同,說(shuō)明總線上同時(shí)還存在其他節(jié)點(diǎn),那么就退出;否則,一直到發(fā)送完數(shù)據(jù)。這種方法既體現(xiàn)了I2C總線的高效性,同時(shí)還具有良好的擴(kuò)展性。

圖4 多主通信流程
圖4給出了基于延時(shí)比較的多主通信流程,其中MCU作為從節(jié)點(diǎn)部分的流程在圖5中給出。在節(jié)點(diǎn)發(fā)送起始信號(hào)之前先要檢測(cè)一下總線上是否為空閑狀態(tài)(BUSY是否為0)。這里使用的檢測(cè)方法是,持續(xù)檢測(cè)一段時(shí)間看總線上的電平是否一直為高,若是說(shuō)明總線上為閑狀態(tài),否則說(shuō)明有其他的節(jié)點(diǎn)正在使用總線,要等一段時(shí)間再發(fā)送。當(dāng)總線空閑時(shí),發(fā)送起始信號(hào),接著發(fā)送要訪問(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ù)不會(huì)丟失,作為從節(jié)點(diǎn)能繼續(xù)接收總線上的數(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目前正在工作,不能完成其他的任務(wù)。在MCU作為從節(jié)點(diǎn)完成接收任務(wù)后,則要將BUSY置為低。MCU在接收到尋址字節(jié)后和自己的地址字節(jié)進(jìn)行比較。如果是訪問(wèn)自己的就進(jìn)入到下面的接收程式,否則跳出。在訪問(wèn)自己的時(shí)候,還要判斷主節(jié)點(diǎn)是讀數(shù)據(jù)還是寫數(shù)據(jù),以便進(jìn)入相應(yīng)的程式。在寫字節(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í)寫字節(jié)子程式的原始碼。由于篇幅有限其他的子程式?jīng)]有列出。
4 部分源代碼
本節(jié)是在微控制器多主通信中的部分原始碼。多主通信的實(shí)現(xiàn)中有幾個(gè)難點(diǎn)和重點(diǎn)。一是在作為主節(jié)點(diǎn)時(shí)的寫字節(jié)子程式,里面要包括發(fā)送的每位數(shù)據(jù)和總線的數(shù)據(jù)進(jìn)行比較并做出判斷。如果數(shù)據(jù)不同,要跳出并進(jìn)入從節(jié)點(diǎn)的狀態(tài)。由于子程式返回主程式時(shí)改動(dòng)的只是PC的值而累加器(ACC)和工作寄存器(Ri)里面的值是不變的,因此微控制器進(jìn)入從機(jī)狀態(tài)后繼續(xù)接收總線剩下的數(shù)據(jù),這樣總線的數(shù)據(jù)并沒(méi)有丟失。二是作為從節(jié)點(diǎn)時(shí)的寫字節(jié)的子程式。由于時(shí)鐘線是由主節(jié)點(diǎn)的微控制器控制的,所以怎樣根據(jù)SCL(串行時(shí)鐘)線來(lái)讀取SDA(串行數(shù)據(jù))線的數(shù)據(jù)是其中的一個(gè)難點(diǎn)。三是在具有子地址的從節(jié)點(diǎn)關(guān)于是寫字節(jié)還是讀字節(jié)時(shí)的判斷。如果是寫字節(jié)時(shí)主節(jié)點(diǎn)會(huì)給出新的起始信號(hào),并再次發(fā)送從節(jié)點(diǎn)的地址數(shù)據(jù)。這時(shí)從節(jié)點(diǎn)需要做出判斷是讀取數(shù)據(jù)還是寫數(shù)據(jù),并進(jìn)入相應(yīng)的子程式。這里給出以上三個(gè)重點(diǎn)和難點(diǎn)的子程式的原始碼,以供讀者參考。這些原始碼經(jīng)實(shí)踐證實(shí)都是正確的。
主節(jié)點(diǎn)的寫字節(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
1
NOP
SCL
NOP
NOP
NOP
NOP
NOP
CLR
SCL
SJMP WLP1
從節(jié)點(diǎn)的寫字節(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)為寫字節(jié)子程序:
SRDBYTE:MOV R0,#08H
SETB 20H;設(shè)置標(biāo)志位判斷是讀還是寫
SETB SDA;釋放總線
RWAITJ: JNB SCL,RWAITJ;等待SCL為高
MOV C,SDA;從總線上讀取數(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é)議中的仲裁原理,提出的基于延時(shí)比較的模擬I2C多主通信的方法,不僅能夠體現(xiàn)了I2C總線的高效性,而且還具有良好的擴(kuò)展性。他使普通不具有I2C接口的MCU能應(yīng)用在多主通信的系統(tǒng)中,既增加了普通MCU的使用范圍,又突破了模擬I2C總線的應(yīng)用局限性,為I2C總線的推廣起到了積極的作用。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開(kāi)發(fā)實(shí)踐指南2026/1/6 10:40:19
- 嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計(jì)實(shí)踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開(kāi)啟異核通信新時(shí)代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識(shí)2025/7/14 16:59:04
- 高速PCB阻抗控制核心實(shí)操規(guī)范
- 高速數(shù)字系統(tǒng)(如DDR、SerDes)中的信號(hào)完整性濾波
- MOSFET在UPS電源中的應(yīng)用解析
- 電源管理IC在物聯(lián)網(wǎng)設(shè)備中的應(yīng)用
- SMT連接器焊接缺陷分析
- MOSFET在汽車電子中的應(yīng)用要求
- 通信設(shè)備電源管理IC應(yīng)用解析
- 通信設(shè)備連接器選型與設(shè)計(jì)
- PCB電磁兼容性(EMC)設(shè)計(jì)核心實(shí)操規(guī)范
- 物聯(lián)網(wǎng)節(jié)點(diǎn)低功耗設(shè)計(jì):信號(hào)鏈中的濾波與功耗管理









