一、I2C協(xié)議概述
I2C 是Inter-Integrated Circuit的縮寫,發(fā)音為'eye-squared cee' or 'eye-two-cee' , 它是一種兩線接口。
I2C 只是用兩條雙向的線,一條 Serial Data Line (SDA) ,另一條Serial Clock (SCL)。
SCL:上升沿將數(shù)據(jù)輸入到每個EEPROM器件中;下降沿驅(qū)動EEPROM器件輸出數(shù)據(jù)。(邊沿觸發(fā))
SDA:雙向數(shù)據(jù)線,為OD門,與其它任意數(shù)量的OD與OC門成'線與'關(guān)系。
輸出級
每一個I2C總線器件內(nèi)部的SDA、SCL引腳電路結(jié)構(gòu)都是一樣的,引腳的輸出驅(qū)動與輸入緩沖連在一起。其中輸出為漏極開路的場效應(yīng)管,輸入緩沖為一只高輸入阻抗的同相器,這種電路具有兩個特點:
1)由于SDA、SCL為漏極開路結(jié)構(gòu)(OD),因此它們必須接有上拉電阻,阻值的大小常為 1k8, 4k7 and 10k ,但1k8 時性能最好;當總線空閑時,兩根線均為高電平。連到總線上的任一器件輸出的低電平,都將使總線的信號變低,即各器件的SDA及SCL都是線'與'關(guān)系。
2)引腳在輸出信號的同時還將引腳上的電平進行檢測,檢測是否與剛才輸出一致,為'時鐘同步'和'總線仲裁'提供了硬件基礎(chǔ)。
主設(shè)備與從設(shè)備
系統(tǒng)中的所有外圍器件都具有一個7位的'從器件專用地址碼',其中高4位為器件類型,由生產(chǎn)廠家制定,低3位為器件引腳定義地址,由使用者定義。主控器件通過地址碼建立多機通信的機制,因此I2C總線省去了外圍器件的片選線,這樣無論總線上掛接多少個器件,其系統(tǒng)仍然為簡約的二線結(jié)構(gòu)。終端掛載在總線上,有主端和從端之分,主端必須是帶有CPU的邏輯模塊,在同一總線上同一時刻使能有一個主端,可以有多個從端,從端的數(shù)量受地址空間和總線的最大電容 400pF的限制?! ?/p>
二者都可以傳輸數(shù)據(jù),但是從設(shè)備不能發(fā)起傳輸,且傳輸是受到主設(shè)備控制的。
4.速率:
普通模式:100kHz;
快速模式:400kHz;
高速模式:3.4MHz;
二、協(xié)議解析
對于嵌入式開發(fā)的朋友來說,I2C協(xié)議實在是再熟悉不過了,有太多的器件,采用的都是通過I2C來進行相應(yīng)的設(shè)置。
I2C協(xié)議中最重要的一點是I2C地址。這個地址有7位和10位兩種形式。7位能夠表示127個地址,而在實際使用中基本上不會掛載如此多的設(shè)置,所以很多設(shè)備的地址都采用7位,所以本文接下來的說明都是基于此。
I2C還有一個很重要的概念,就是“主—從”。對于從設(shè)備來說,它是啥都不干的,更不會自動發(fā)送數(shù)據(jù);而主設(shè)備,則是起到控制作用,一切都是從它開始。
除了GND以外,I2C有兩根線,分別是SDA和SCL,所有的設(shè)備都是接到這兩根線上。那么,這些設(shè)備如何知道數(shù)據(jù)是發(fā)送給它們呢?這就得依靠前面所說到的地址了。設(shè)備I2C的地址是固定的,比如0x50,0x60等等。因為只能有127個地址,地址沖突是很常見的,所以一般設(shè)備都會有一個地址選擇PIN,比如拉高時候為0x50,接地為0x60。如果無論拉高還是接地,都和別的芯片有沖突,那該怎么辦呢?答案是:只能換芯片了。
我們來看I2C協(xié)議中的數(shù)據(jù)傳輸時序圖:
SCL是時鐘,SDA承載的是數(shù)據(jù)。當SDA從1變動到0,而SCL還是1時,表示開始數(shù)據(jù)傳輸。接下來的7位,就是設(shè)備的地址。緊接著的是讀寫標志,其為1時是讀取,為0則是寫。如果I2C總線上存在著和請求的地址相對應(yīng)的設(shè)備,則從設(shè)備會發(fā)送一個ACK信號通知主設(shè)備,可以發(fā)送數(shù)據(jù)了。接到ACK信號后,主設(shè)備則發(fā)送一個8位的數(shù)據(jù)。當傳輸完畢之后,SCL保持為1,SDA從0變換到1時,標明傳輸結(jié)束。
從這個時序圖中可以看到,SCL很重要,并且哪個時鐘沿是干嘛的,都是確定好的。比如,前面7個必定是地址,第8個是讀寫標志,數(shù)據(jù)傳輸必須是8位,必須接個ACK信號等等。
前面的時序圖并沒有標明數(shù)據(jù)傳輸?shù)姆较颍覀儸F(xiàn)在看看寫操作的數(shù)據(jù)流向:
網(wǎng)格的是主設(shè)備發(fā)送的,白色格子是從設(shè)備發(fā)送的。從圖示中可以看到,對于寫操作,從設(shè)備都只是發(fā)送ACK進行確認而已。
而讀操作的數(shù)據(jù)流向,就有所不同,如圖:
這時候,從設(shè)備除了發(fā)送ACK以外,緊跟著的還有數(shù)據(jù)。我們用示波器來查看波形圖,以便于理解。
將示波器的X和Y分別接到SDA和SCL,得到波形并分析如圖:
從圖中可知時序如下:
由主機發(fā)起,在SCL為高電平時,SDA由高到低切變,形成開始信號;
接著是7位地址和一位讀寫標志,這里7位地址為0111100,即0x3c,正是我們代碼中設(shè)置的地址ID;最后一位為0表示寫操作;
接著在下一個時鐘,主機以高電平狀態(tài)釋放SDA,這時從機響應(yīng),將SDA拉低了;
接著是兩個8位數(shù)據(jù)00101110與響應(yīng),即0x2E,正是“.”號的ASCII碼,符合預(yù)期輸出;
還有其它數(shù)據(jù)和最后的停止位,圖中被截掉了。
從圖中可知,縱向一格是200mV,則SDA和SCL的電平大概就是350mV;由于信號筆上設(shè)置了信號x10,因此實際電平應(yīng)該大概是3.5V(理論上應(yīng)該是3.3V)。橫向一格是25us,10個時鐘周期大概用了4格,即4x25us=100us,平均每個時鐘周期是10us,可算出傳輸頻率為1/10us=100,000/s,即100k bps。
既有讀又有寫的波形圖:
I2C是由2根線進行操作的,一個是主控時序SCL,另一根主控數(shù)據(jù)SDA
對于操作主要分成讀寫,讀寫的兩個操作有部分是相似的
而時序的操作主要分為:START,DATA,ACK,STOP,NOACK
寫的時序用到的時序為:STRAR,DATA,ACK,STOP
時序如圖所示:
讀時序用到的時序有:START,DATA,ACK,STOP,NOACK
時序如圖所示:
下面對時序的說明:
IDLE:空閑的時候,盡量將SDA和SCL拉到高電平
START:保持SCL為高電平,然后SDA由H->L
DATA:數(shù)據(jù)是當SCL為高電平的時候采集的數(shù)據(jù)才是有效的數(shù)據(jù).
ACK:在發(fā)完數(shù)據(jù)后,從設(shè)備會將SDA拉到L
NOACK:在發(fā)送完數(shù)據(jù)后,從設(shè)備不會將SDA拉低
STOP:保持SCL為高電平,然后SDA由L->H
好了,說一下時序的流程和時序圖:
寫時序的流程是:START –>
從設(shè)備的寫地址 –> ACK –>
從設(shè)備的寄存器地址 –> ACK –>
寫入的數(shù)據(jù) –> ACK –>
STOP
寫時序圖:
讀時序的流程是:START –>
從設(shè)備的寫地址 –> ACK –>
從設(shè)備的寄存器地址 –> ACK –>
從設(shè)備的讀地址 –> ACK ->
讀出的數(shù)據(jù) –> NOACK –>
STOP
讀時序圖:
其中要注意的是I2C的2根線上都必須接上拉電阻,阻值一般是4.7K
在獲得ACK的時候,一般將SDA輸出一個高阻,然后再讀入ACK,好讓從設(shè)備拉低SDA。
2、I2C與SMBus的區(qū)別
關(guān)于I2C與SMBus,許多人很少去談?wù)撆c了解兩者的細節(jié)差異,包括很多國外的簡報,文章也經(jīng)常將兩者混寫、交雜描述、交替運用。確實,在一般運用下,I2C Bus與SMBus沒有太大的差別,從實際接線上看也幾乎無差異,甚至兩者直接相連多半也能相安無誤地正確互通并運作。不過若真要仔細探究,其實還是有諸多不同,如果電子設(shè)計工程師不能明辨兩者的真實差異,那么在日后的開發(fā)設(shè)計的驗證糾錯階段必然會產(chǎn)生困擾,為此本文將從各層面來說明I2CBus與SMBus的細微區(qū)別,期望能為各位帶來些許幫助。首先從規(guī)格的制訂背景開始,I2C是在設(shè)計電視應(yīng)用時所研發(fā)的界面,首版于1992 年發(fā)表;而SMBus(System Management Bus)則是Intel與Duracell(金頂電池)共同制訂筆記本電腦所用的智能型電池(Smart Battery)時所研發(fā)的接口,首版于1995 年發(fā)表,不過SMBus文件中也提及,SMBus確實是參考自I2C,并以I2C為基礎(chǔ)所衍生成。I2C起源于電視設(shè)計,但之后朝通用路線發(fā)展,各種電子設(shè)計都有機會用到I2C;而SMBus則在之后為PC所制訂的先進組態(tài)與電源管理接口(AdvancedConfiguration & Power Interface;ACPI)規(guī)范中成為基礎(chǔ)的管理訊息傳遞接口、控制傳遞接口。雖然I2C與SMBus先后制訂時間不同,但都在2000年左右進入成熟化改版,I2C的過程改版以加速為主要訴求,而SMBus以更切合Smart Battery及ACPI的需求為多。電氣特性差異:邏輯電平定義、限流、相關(guān)限制I2C的Hi/Lo邏輯電平有兩種認定法:相對認定與絕對認定,相對認定是依據(jù)Vdd的電壓來決定,Hi為0.7Vdd,Lo為0.3Vdd,絕對認定則與TTL 準位認定相同,直接指定Hi/Li電壓,Hi為3.0V,Lo為1.5V。相對的SMBus只有絕對認定,且電平與I2C有異,Hi為2.1V,Lo為0.8V,與I2C不全然吻合但也算部分交集。不過,SMBus后來也增訂一套更低電壓的電平認定,Hi為1.4V,Lo為0.6V,這是為了讓運用SMBus的裝置能更省成本的作法。了解電壓后再來是電流,由于SMBus一開始就是運用在筆記本電腦內(nèi),所以省電的表現(xiàn)優(yōu)于I2C,只需100uA就能維持工作,I2C卻要到3mA同樣的低用電特性也反應(yīng)在漏電流(Leakage Current)的要求上,I2C最大的漏電流為10uA,SMBus為1uA,但是1uA似乎過度嚴苛,使運用SMBus的裝置在驗證測試時耗費過多的成本與心力,因此之后的SMBus 1.1版放寬了漏電流上限,最高可至5uA。再者是相關(guān)限制,I2C有線路電容的限制,SMBus卻沒有,但也有相類似的配套規(guī)范,即是電平下拉時的電流限制,當SMBus的集電極開路Pin導(dǎo)通而使線路接地時,流經(jīng)接地的電流不能高于350uA,另上電流(即相同的集電極開路Pin開路時)也一樣有規(guī)范,最小不低于100uA,最高也是不破350uA的。既然對電流有限制,那么也可容易地推斷對上拉電阻的阻值之范圍要求,I2C 在5V Vdd時當大于1.6kohm,在3V Vdd時當大于1kohm,類似的SMBus于5V Vdd時當大于14kohm,3V Vdd時當大于8.5kohm,不過這個定義并非牢不可破,就一般實務(wù)而言,在SMBus上也可用2.4k?3.9kohm范疇的阻值。附注:I2C的時鐘線稱SCK或SCL,數(shù)據(jù)線稱SDA。SMBus的時鐘線稱SMBCLK,數(shù)據(jù)線稱SMBDAT。I2C與SMBus 在邏輯位準的電壓定義不盡相同,基本上I2C的定義較為寬裕、彈性,而SMBus 則更專注在省電方面的要求。物理層面的空間要求完后,再來就是物理層面的時間,即是時序(Timing)方面的差別。先以運作頻率來說,I2C此方面相當寬裕,最低頻可至0Hz(直流狀態(tài),等于時間暫停),高可至100kHz(Standard Mode)、400kHz(Fast Mode)、乃至3.4MHz(High Speed Mode),相對的SMBus就很局限,最慢不慢于10kHz,最快不快于100kHz。很明顯的,I2C與SMBus的交集運作頻率即是10kHz?100kHz間。用于筆記本電腦的電池管理或PC組態(tài)管理、用電管理的SMBus,很容易體會不需要更高運作頻率的理由,只要傳遞小數(shù)據(jù)量的監(jiān)督信息、控制指令本就不用過于高速,而朝向廣泛運用的I2C自然希望用更高的傳輸以應(yīng)對各種可能的需求。然而大家可能會疑惑,為何SMBus有最低速的要求?何不放寬到與I2C相同的無最低速限制呢?SMBus一定要維持10kHz以上的運作頻率,主要也是為了管理監(jiān)控,另一個用意是只要在保持一定傳速運作的情況下加入?yún)?shù),就可輕松獲知總線目前是否處于閑置(Idle)中,省去逐一偵測傳輸過程中的停斷(STOP)信號,或持續(xù)保有停斷偵測并輔以額外參數(shù)偵測,如此對總線閑置后的再取用會更有效快速。傳速要求之后還有數(shù)據(jù)保持時間(Data Hold Time)的要求,SMBus 規(guī)定SMBCLK線路的電平下降后,SMBDAT上的數(shù)據(jù)必須持續(xù)保留300nS,但I2C 卻沒有對此有相同的強制要求。類似的,SMBus對接口被重置(Reset)后的恢復(fù)時間(Timeout)也有要求,一般而言是35mS,I2C這方面亦無約束,可以任意延長時間。相同的SMBus也要求無論是在主控端(Master)或受控端(Slave),其頻率處于Lo電平時的最長持續(xù)時間不得超越限制,以免因為長時間處在Lo準位,而致收發(fā)兩端時序脫軌(失去同步,造成后續(xù)誤動作)。還有,I2C與SMBus在信號的上升時間、下降時間等也有不同的細節(jié)要求,此點必要時也必須進行確認,或在驗證過程中稍加留意。Smart Battery或ACPI的實現(xiàn)、監(jiān)督、與操控,最底層都需要SMBus(圈處)作為后援,圖為簡易的多組式智能型電池系統(tǒng),圖中有Smart Battery A、B 兩組電池。不單是電氣、時序有別,更深層次的協(xié)議機制也有不同。在I2C中,主控端發(fā)送端(主控端)要與接收端(受控端)通訊前,會在總線上廣播受控端的地址信息,每個接收端都會接收到地址信息,但只有與該地址信息相切合的接收端會在地址信息發(fā)布完后發(fā)出「已妥」的回應(yīng)(Acknowledge;ACK),讓發(fā)送端知道對應(yīng)的接收端確實已經(jīng)備妥,可以進行通訊。但是,I2C并沒有強制規(guī)定接收端非要做出響應(yīng)不可,也可以默不作聲,即便默不作聲,發(fā)送端還是會繼續(xù)工作,開始進行數(shù)據(jù)傳遞及下達讀/寫指令,如此的機制在一般運用中還是可行,但若是在一些實時(Real Time)性的應(yīng)用上,任何的動作與機制都有一定的時限要求,這種可有可無式的響應(yīng)法就會產(chǎn)生問題,可能會導(dǎo)致受控端無法接收信息。相同的情形,在SMBus上是不允許接收端在接收地址信息后卻不發(fā)出回應(yīng),每次都要回應(yīng),為何要強制回應(yīng)?其實與SMBus的應(yīng)用息息相關(guān),SMBus上所連接的受控裝置有時是動態(tài)加入、動態(tài)移除的,例如換裝一顆新電池,或筆記本電腦接上DOCK PORT等,如果接入的裝置已經(jīng)改變卻沒有回應(yīng),則主控端的程序所掌握的并非是整體系統(tǒng)的最新組態(tài),就會造成誤動作。類似的情形也適用于ACPI,PC機內(nèi)機外經(jīng)常有一些裝置可動態(tài)增入、移除,如機內(nèi)風扇、外接打印機等,這些也一樣該強制對主控端群發(fā)(廣播)的地址信息作出完整響應(yīng)。地址動作方面有異,數(shù)據(jù)傳輸方面也有異。在I2C方面,Slave雖然對Master 所發(fā)出的地址作出響應(yīng),但在后續(xù)的數(shù)據(jù)傳遞中,可能因某些事務(wù)必須先行處理、因應(yīng)而無法持續(xù)原有的傳輸,這時候Slave就要對Master發(fā)出「未妥」的回應(yīng)(Not Acknowledge;NACK),向Master 表示Slave正為他務(wù)忙碌中。而SMBus方面,與I2C相同的,會以NACK的回訊向Master表達Slave尚未收妥傳遞的信息,但是SMBus的Slave會在后續(xù)的每個Byte傳輸中都發(fā)出NACK回信,這樣設(shè)計的原因是因為SMBus沒有其他可向Master要求重發(fā)(Resend)的表示法。更直接說就是:NACK機制是SMBus標準中的強制必備,任何的訊息傳遞都很重要,不允許有漏失。I2C在完成一段地址或數(shù)據(jù)信息的傳輸后,受接端可發(fā)出訊息收妥(ACK)、未妥(NACK的響應(yīng),SMBus也具相同的機制,但由于應(yīng)用之故有更強制的回顯請求。互動知會機制上有強制與否的差別,協(xié)議方面也是。SMBus的通訊協(xié)議與協(xié)議中所用的訊息格式,其實只是取自I2C 規(guī)范中,對于數(shù)據(jù)傳輸格式定義中的子集合(Subset)而已。所以,如果將I2C與SMBus交混連接,則I2C裝置在存取SMBus裝置時,只能使用SMBus范疇的協(xié)議與格式,若使用I2C的標準存取方式反而無法正確存取。另外,I2C規(guī)范中有一種稱為「General Call」的廣呼方式,當發(fā)出「0000000」的地址信息后,所有I2C上的Slave裝置統(tǒng)統(tǒng)要對此作出反應(yīng),此機制適合用在Master要對所有的Slave進行廣播性訊息更新與溝通上,是一種總體、批次的運作方式。SMBus一樣有General Call機制,但在此之外SMBus還多了一種特用的ALERT(警訊)機制,不過這必須于頻率線與數(shù)據(jù)線外再追加一條線(稱為:SMBSUS)才能實現(xiàn),ALERT雖名為警訊但其實是中斷(Interrupt)的用意,Slave可以將SMBSUS線路的電位拉低(ALERT#,#表示低電平有效),這時就等于向Master發(fā)出一個中斷警訊,要求Master盡速為某一Slave提供傳輸服務(wù)。Master要響應(yīng)這個服務(wù)要求,是透過I2C/SMBus的頻率線與數(shù)據(jù)線來通訊,但要如何知道此次的通訊只是Master對Slave的一般性通訊?還是特別針對Slave的中斷需求而有的服務(wù)響應(yīng)?這主要是透過Master發(fā)出的地址信息來區(qū)別,若為回應(yīng)中斷的服務(wù),地址信息必然是「0001100」,當Slave接收到「0001100」的地址信息,就知道這是Master特為中斷而提供的服務(wù)通訊。因此,軟件工程師須留心,規(guī)劃時必須讓所有的Slave都不能占用「0001100」這個地址,以供ALERT機制運用(當然!若現(xiàn)在與未來都不會用上ALERT機制則可盡管占用)。事實上各種進階的規(guī)范標準(如Smart Battery、ACCESS.bus、VESA DDC 等)都在I2C的短尋址中訂立了一些為自用而保留的地址,這在最初設(shè)計與定義時就該有所留意,以免因先行占用而導(dǎo)致日后須改寫軟件的麻煩。補充提醒的是,SMBSUS一樣是開集電極外加上拉電阻的線路,所以有一個Slave將電位拉下后,其余Slave偵測到電位被拉下,表示已有Slave正在與Master進行中斷需索與響應(yīng)服務(wù),須等待搶到中斷服務(wù)權(quán)的Slave確實被服務(wù)完畢,重新將SMBSUS釋放回高電平后,才能持續(xù)以“看誰能先將線路電平拉低?”的方式來爭取中斷服務(wù)。本文整理自:
《I2C協(xié)議快速解析》作者 k_linux_man
《I2C協(xié)議---I2C時序圖解析》作者:csdn4646