I2C總線深入淺出
IIC總線,是INTER-IC串行總線的縮寫。INTER-IC原文大意是用于相互作用的集成電路,這種集成電路主要由雙向串行時(shí)鐘線SCL和雙向串行數(shù)據(jù)線SDA兩條線路組成,由荷蘭菲利浦公司于80年代研制開發(fā)成功。
本文引用地址:http://www.ex-cimer.com/article/201612/330487.htmIIC總線在傳送數(shù)據(jù)時(shí)其速率可達(dá)100kbps,最高速率時(shí)可達(dá)400kbps,總線上允許連接的設(shè)備數(shù)主要決定于總線上的電容量,一般設(shè)定為400pF以下。I2C總線主要在微處理器的控制之下,因此通常稱微處理器是I2C總線的主機(jī)。習(xí)慣上總稱受控設(shè)備及功能電路為I2C總線的從機(jī)。這種主機(jī)與從機(jī)之間的連接通常是在總線的輸出端,而輸出端的電路結(jié)構(gòu)為IIC總線的從機(jī)。這種主機(jī)與從機(jī)之間的連接通常是在總線的輸出端,而輸出端的電路結(jié)構(gòu)又總是開漏輸出或集電極開路輸出。 通常數(shù)據(jù)傳送要由主機(jī)發(fā)出啟動(dòng)信號(hào)和時(shí)鐘信號(hào),向所控從機(jī)發(fā)出一個(gè)地址、一個(gè)讀寫位和一個(gè)應(yīng)答位,其中地址位為7位數(shù)據(jù),在實(shí)際控制中,一般一次只能傳送一個(gè)8位數(shù)據(jù),并以一個(gè)停止位結(jié)束。
在實(shí)際應(yīng)用中,往往被傳送的數(shù)據(jù)位數(shù)會(huì)超過8位,也就是說總會(huì)有多字節(jié)傳送,這時(shí)必須在傳送數(shù)據(jù)地址結(jié)束后再傳送一個(gè)副地址。因此,被傳送的字節(jié)沒有限制,但每一個(gè)字節(jié)后面必須有一位應(yīng)答位。應(yīng)答位通常被設(shè)定在低電平,當(dāng)應(yīng)答位處于高電平時(shí),指示被傳送的數(shù)據(jù)已結(jié)束。
I2C總線在空閑狀態(tài)時(shí),也就是不在進(jìn)行任何操作控制時(shí),數(shù)據(jù)線SDA和時(shí)鐘線SCL總是處于高電平輸出狀態(tài)。當(dāng)操作控制系統(tǒng)時(shí),I2C總線的主機(jī)將發(fā)出啟動(dòng)信號(hào),使數(shù)據(jù)線SDA由高電平變?yōu)榈碗娖?,同時(shí)時(shí)鐘線SCL也發(fā)出時(shí)鐘信號(hào)。
I2C總線在傳送數(shù)據(jù)時(shí),總是將最高位數(shù)碼放在前面作為其特有的傳送順序。在數(shù)據(jù)傳送過程中,如果從機(jī)在完成某一操作之前不能接收下一個(gè)字節(jié)數(shù)據(jù),即數(shù)據(jù)中斷,這時(shí)時(shí)鐘線SCL將被位至低電平,從而迫使發(fā)送器主機(jī)進(jìn)入等待狀態(tài),當(dāng)接收器從機(jī)準(zhǔn)備好接收下一個(gè)字節(jié)時(shí)再釋放時(shí)鐘線SCL,繼續(xù)傳送數(shù)據(jù)。
在I2C總線的控制系統(tǒng)中,有時(shí)從機(jī)也可以是多臺(tái)微處理器,在多臺(tái)微機(jī)同時(shí)工作時(shí),它們對(duì)總線的控制也由相似于時(shí)鐘的同步方式進(jìn)行仲裁,也就是說時(shí)鐘的同步與仲裁過程是同時(shí)進(jìn)行的,不存在因是主機(jī)而有優(yōu)先權(quán)次序。不同速度的從機(jī)可以接在同一I2C總線上完成相互間數(shù)據(jù)的傳送。高速方式芯片和普通芯片可以混合于同一I2C總線上。
I2C總線的特點(diǎn)與特性
I2C總線與傳統(tǒng)的PWM調(diào)寬脈沖相比較,其最大的特點(diǎn)是串行數(shù)據(jù)線和時(shí)鐘線都是雙向傳輸線。I2C總線在實(shí)際電路的應(yīng)用中,兩根線各自通過一個(gè)上拉電阻連接到電源電壓的正極端,當(dāng)總線空閑時(shí),數(shù)據(jù)線SDA和時(shí)鐘線SCL必須保持高電平,同時(shí)各接口電路的輸出又必須是開路漏極或開路集電極,因此I2C總線的最大特性是在地址信息傳輸過程中,即可以是主控器也可以是被控器,或既可以是發(fā)射器又可以是接收器,從而為掛在總線上的各集成電路或功能模塊完成各自的功能提供了極大方便。
如果I2C總線用作主控器電路即微處理電路,則在總線上將提供時(shí)鐘傳送及初始化的數(shù)據(jù)傳輸,而控制數(shù)據(jù)信息傳送的對(duì)象、方向及傳送的終止也由主控器來決定。在I2C總線上被主控器所尋址的集成電路或功能模塊,稱之為被控器。在I2C總線上,被控器每接收一個(gè)“數(shù)碼”后都要在數(shù)據(jù)線上給主控器發(fā)送一個(gè)識(shí)別應(yīng)答信號(hào),以示完成一個(gè)控制功能。因此,I2C總線具有十分靈活的運(yùn)用性。并且還具有多重主控的能力,如多個(gè)作為主控器去控制占用總線的電路,都可以根據(jù)在I2C總線上進(jìn)行數(shù)據(jù)傳送的工作狀態(tài),被分為主控發(fā)送器、主控接收器、被控發(fā)射器、被控接收器。在多重主控能力中,由于總線的仲裁過程,I2C總線的時(shí)鐘信號(hào)將是各試力占用總線的各主控器的時(shí)鐘信號(hào)的同步組合。所謂仲裁是在多個(gè)主控器試圖同時(shí)控制總線時(shí)一個(gè)裁決過程,它只允許其中的一個(gè)主控器繼續(xù)占用總線,并保證在整個(gè)過程中總線上的數(shù)據(jù)不會(huì)被丟失或出錯(cuò)誤;所謂同步是將兩個(gè)或多個(gè)器件的時(shí)鐘信號(hào)進(jìn)行處理。
I2C總線上的時(shí)鐘信號(hào)是由主控器產(chǎn)生,每個(gè)主控器在占用總線傳送數(shù)據(jù)期間都有自已的時(shí)鐘,因此,在應(yīng)用中,由一個(gè)主控器產(chǎn)生的I2C總線時(shí)鐘信號(hào)只可能被一個(gè)低速的被控器或另一個(gè)主控器改變。然而,一個(gè)低速的被控器可將串行時(shí)鐘線保持低電平,以延長總線時(shí)鐘信號(hào)的低電平周期,使高速的主控器和低速的被控器達(dá)到同步,因此,當(dāng)總線上正在進(jìn)行仲裁時(shí),另一個(gè)主控器也能改變總線的時(shí)鐘周期。
I2C總線的控制技術(shù)
由于在I2C總線中的多主控器的控制權(quán)總是相互競(jìng)爭(zhēng),并且在相互競(jìng)爭(zhēng)中進(jìn)行尋址和數(shù)據(jù)發(fā)送,因此總線上沒有中央微處理器,也沒有任何優(yōu)先級(jí)。在I2C總線上進(jìn)行數(shù)據(jù)傳輸時(shí),所有的主控器都會(huì)在串行時(shí)鐘線上產(chǎn)生自己的時(shí)鐘信號(hào),而且只有當(dāng)時(shí)鐘線上的信號(hào)處于高電平時(shí),數(shù)據(jù)線上的數(shù)據(jù)才是有效的。因此,當(dāng)各主控器向總線上輸出各不相同的時(shí)鐘頻率時(shí),只有通過仲裁過程,才可使總線上有一個(gè)統(tǒng)一的時(shí)鐘信號(hào)。只有總線上的時(shí)鐘線上的一種“線與”連接和雙向傳輸特性來實(shí)現(xiàn)的。因此,I2C總線的控制基礎(chǔ)主要是仲裁過程和時(shí)鐘同步。
在總線的仲裁過程中,一旦有一主控器輸出一個(gè)低電平時(shí)鐘信號(hào),則串行時(shí)鐘線將由此變?yōu)榈碗娖?,直到該主控器時(shí)鐘信號(hào)的高電平狀態(tài)到來,數(shù)據(jù)信號(hào)才開始傳送。在總線上這個(gè)時(shí)鐘線的電平轉(zhuǎn)換,將影響所有主控器的時(shí)鐘信號(hào)低電平周期的計(jì)時(shí)。事實(shí)上,當(dāng)一個(gè)主控器的時(shí)鐘信號(hào)由低電平向高電平轉(zhuǎn)換時(shí),它可能并不會(huì)改變串行時(shí)鐘線的低電平狀態(tài),因?yàn)榇藭r(shí)可能有另一個(gè)主控器仍然處于時(shí)鐘低電平周期。也就是說,在I2C總線控制中,時(shí)鐘線將由時(shí)鐘低電平周期最長的主要控器保持為低電平狀態(tài),而其他時(shí)鐘低電平周期較短的主控器則將相繼進(jìn)入時(shí)鐘高電平等待狀態(tài)。只有當(dāng)總線上的所有主控器都結(jié)束了時(shí)鐘低電平周期的計(jì)時(shí)后,時(shí)鐘線才被完全釋放,即時(shí)鐘線的狀態(tài)達(dá)到一致高電平狀態(tài)。
當(dāng)所有主控器時(shí)鐘信號(hào)都進(jìn)入高電平狀態(tài)后,便開始了各自的時(shí)鐘信號(hào)高電平周期計(jì)時(shí)。當(dāng)有一個(gè)主控器的時(shí)鐘高電平狀態(tài)計(jì)時(shí)結(jié)束時(shí),這個(gè)主控器將再次使I2C總線上的時(shí)鐘線SCL處于低電平狀態(tài)。從而,在總線的仲裁過程中,使時(shí)鐘線通過各主控的時(shí)鐘輸出產(chǎn)生一個(gè)統(tǒng)一的時(shí)鐘同步信號(hào)成為現(xiàn)實(shí)。
簡(jiǎn)言之,在多重主控器的I2C總線上,時(shí)鐘線信號(hào)的低電平周期由時(shí)鐘信號(hào)低電平周期最長的主控器決定,而時(shí)鐘線信號(hào)的高電平周期則由時(shí)鐘信號(hào)高電平周期最短的主控器決定。
在I2C總線中,具有主控能力的器件的數(shù)據(jù)傳輸和尋址也是在仲裁中進(jìn)行的。當(dāng)有多個(gè)主控器企圖同時(shí)占用總線傳輸數(shù)據(jù)時(shí),根據(jù)I2C總線的規(guī)約它們之間會(huì)有一個(gè)促裁過程,以決定誰將占用總線。促裁是在時(shí)鐘線SCL為高電平時(shí),根據(jù)數(shù)據(jù)線SDA的狀態(tài)進(jìn)行的。因此,仲裁過程和時(shí)鐘電平、數(shù)據(jù)線狀態(tài)是相輔相成的。也正是這種相輔相成的機(jī)制,使在總線仲裁過程中,當(dāng)有其他主控器在數(shù)據(jù)線上傳送低電平時(shí),發(fā)送高電平的主控器將會(huì)發(fā)現(xiàn)此時(shí)數(shù)據(jù)線上的電平與其輸出電平不一致,從而被裁決失去總線的主控權(quán),并立即關(guān)閉其數(shù)據(jù)輸出。仲裁過程可以持續(xù)詐多位,以對(duì)多個(gè)主控器正在企圖尋址同一電路的事件進(jìn)行判決。如果一個(gè)主控器在發(fā)送某一字節(jié)期間被裁決失去主控權(quán),則它的時(shí)鐘信號(hào)可繼續(xù)輸出,直到整個(gè)字節(jié)發(fā)送結(jié)束為止。如果主控器在其尋址階段被仲裁決定失去主控權(quán),則該主控器必須立刻進(jìn)入被控接收器狀態(tài),以判決被仲裁決定獲得主控權(quán)的主控器是否正在對(duì)它進(jìn)行尋址。產(chǎn)生數(shù)據(jù)的主控器一旦發(fā)現(xiàn)內(nèi)部數(shù)據(jù)電平與數(shù)據(jù)總線的實(shí)際電平之間有差異,則它的輸出將被立即關(guān)閉,隨即在總線上輸出一個(gè)高電平(釋放總線),這就不會(huì)影響獲得主控權(quán)的主控器所進(jìn)行的數(shù)據(jù)傳輸,總線上的尋址和數(shù)據(jù)傳輸?shù)茸√幰膊粫?huì)丟失。因此,I2C總線的仲裁過程使I2C總線上的數(shù)據(jù)傳輸?shù)靡皂樌M(jìn)行,為多種控制功能的實(shí)施奠定了良好的基礎(chǔ)。
I2C總線的傳輸
I2C總線的傳輸是一個(gè)比較復(fù)雜的數(shù)碼傳輸,它主要是以8bit的字節(jié)進(jìn)行數(shù)據(jù)傳輸,而傳輸時(shí)又總有一個(gè)時(shí)鐘脈沖相對(duì)應(yīng),因此,I2C總線的數(shù)據(jù)傳送實(shí)質(zhì)上是個(gè)脈沖串的傳輸,其傳輸格式如圖1-14所示。圖中1為字節(jié)傳送完成接收器內(nèi)產(chǎn)生中斷信號(hào),2為當(dāng)處理中斷服務(wù)時(shí)時(shí)鐘線保持低電平。
在I2C總線上,每一個(gè)數(shù)據(jù)中,邏輯“0”和邏輯“1”的信號(hào)電平取決于相應(yīng)的正端電壓。I2C總線在進(jìn)行傳送時(shí),在時(shí)鐘信號(hào)為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時(shí)鐘線上的信號(hào)為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。這就保持了數(shù)據(jù)傳輸?shù)挠行浴?/p>
在時(shí)鐘線保持高電平期間,由于數(shù)據(jù)線由高電平向低電平的變化是一種穩(wěn)定的狀態(tài),所以就將其狀態(tài)規(guī)定為起始條件;而當(dāng)時(shí)鐘線保持高電平期間,數(shù)據(jù)線是由低電平向高電平變化,則規(guī)定為停止條件。只有I2C總線中主控器產(chǎn)生起始條件和停止條件兩個(gè)信號(hào)時(shí),總線才會(huì)被認(rèn)為處于“忙”態(tài)或“閑”態(tài),從而準(zhǔn)確控制了比特位的傳送。
在I2C總線上,比特位傳送字節(jié)的后面都必須跟隨一位確認(rèn)位,或稱跟隨一位應(yīng)答位。并且數(shù)據(jù)是以最高有效位首先發(fā)出。但是,當(dāng)正在進(jìn)行數(shù)據(jù)傳輸?shù)慕邮掌魇盏酵暾囊粋€(gè)數(shù)據(jù)字節(jié)后,有可能還要完成一些其他的工和,如處理一個(gè)內(nèi)部中斷服務(wù)等。在這種情況下就有可能無法立刻接收另一字節(jié)的數(shù)據(jù),因而,此時(shí)接收器可以通過總線上的時(shí)鐘保持為低電平,從而使發(fā)送器進(jìn)入等待狀態(tài),直到接收器準(zhǔn)備好接收新的數(shù)據(jù),而接收器通過釋放時(shí)鐘線使數(shù)據(jù)傳輸繼續(xù)進(jìn)行,正是I2C總線能允許其他總線的數(shù)據(jù)格式進(jìn)行傳輸,才有一個(gè)特殊尋址開始的信息傳輸,以及通過對(duì)總線產(chǎn)生一個(gè)停止信號(hào)進(jìn)行停止。
當(dāng)一個(gè)字節(jié)的數(shù)據(jù)能夠被總線上的一個(gè)已被尋址的接收器接收后,總線上的一般要產(chǎn)生一個(gè)確認(rèn)信號(hào),并在這一位時(shí)鐘信號(hào)的整個(gè)高電平期間,使數(shù)據(jù)保持穩(wěn)定的低電平狀態(tài),從而完成應(yīng)答確認(rèn)信號(hào)的輸出。確認(rèn)信號(hào)通常是指起始信號(hào)和停止信號(hào),如果這個(gè)信息是一個(gè)起始字節(jié),或是總線尋址,則總線上不允許有應(yīng)答信號(hào)產(chǎn)生。如果因某種特殊情況,被控器不對(duì)應(yīng)的被控尋址進(jìn)行確認(rèn)回答,則必須將數(shù)據(jù)線置于高電平,然后主控器可以通過產(chǎn)一個(gè)停止信號(hào)來結(jié)束總線的數(shù)據(jù)傳輸。如果被控接收器對(duì)被控尋址做出了確認(rèn)應(yīng)答,但在數(shù)據(jù)傳輸?shù)囊欢螘r(shí)間以后,又無法繼續(xù)接收更多的數(shù)據(jù),則主控器也將停止數(shù)據(jù)的繼續(xù)傳送。因此,被控接收器可以通過對(duì)無法接收的第一個(gè)數(shù)據(jù)字節(jié)不產(chǎn)生確認(rèn)應(yīng)答信號(hào)來通知主控器,即在相應(yīng)的應(yīng)答信號(hào)時(shí)鐘位上將數(shù)據(jù)線置于高電平,主控器則在總線上產(chǎn)生停止信號(hào),從而結(jié)束數(shù)據(jù)的傳送。
注:1-7 為地址位;8為讀/寫位;9為應(yīng)答位
在I2C總線上,它的數(shù)據(jù)傳輸總有一些規(guī)約要求,例如,起始信號(hào)的后面總有一個(gè)被控器的地址。被控器的地址一般規(guī)定為7bit的數(shù)據(jù),數(shù)碼中的第8比特是數(shù)據(jù)的傳輸方向位,即讀/寫位。一個(gè)完整的I2C總線傳輸格式如圖1-15所示?!?/p>
在讀/寫位中,如果是“0”,則表示主控器發(fā)送數(shù)據(jù),也就是執(zhí)行“寫”的功能;如果是“1”,則表示主控器接收數(shù)據(jù),也就是執(zhí)行“讀”的功能。而數(shù)據(jù)的每次傳輸總是隨主控器產(chǎn)生的停止信號(hào)而結(jié)束。而I2C總線中,有時(shí)主控器希望總占用總線,并不斷進(jìn)行數(shù)據(jù)傳輸,因此,在設(shè)定規(guī)約時(shí),可以在不首先產(chǎn)生信號(hào)的情況下,再次發(fā)出起始信號(hào)對(duì)另一被控器進(jìn)行尋址。為解決這一問題,可以采用多種讀/寫組合形式來進(jìn)行總線的一次數(shù)據(jù)傳輸。在多種讀/寫組合形式中,主要有三種措施,其中:
1.主控發(fā)送器向被接收器發(fā)送數(shù)據(jù),數(shù)據(jù)傳輸方向在整個(gè)傳輸過程中不變。
2.主控器在第一個(gè)字節(jié)后立即從被控制器讀數(shù)據(jù),在首位確認(rèn)應(yīng)答信號(hào)產(chǎn)生后,主控發(fā)送器變成主控接收器,而被接收器變成被控發(fā)送器,同時(shí)首位應(yīng)答信號(hào)仍由被控器產(chǎn)生,使停止信號(hào)總是由主控器產(chǎn)生。
3.數(shù)據(jù)傳輸過程中的復(fù)合格式需要改變傳送方向時(shí),起始信號(hào)和被控器地址都會(huì)被重復(fù)產(chǎn)生一次,但兩次的讀/寫方向正好反相。
總之在I2C總線上,通過接口電路收到起始信號(hào)后,必須復(fù)位它們的總線邏輯,以使被控制器地址的傳輸?shù)靡灶A(yù)處理,從而完成對(duì)各不相同功能電路的控制
評(píng)論