武 婷等
在電子消費(fèi)品、通訊及工業(yè)電子等應(yīng)用領(lǐng)域,許多看似不相關(guān)的設(shè)計(jì)常常有許多相似之處,比如幾乎每個(gè)系統(tǒng)都有這幾個(gè)部分組成:處理器、數(shù)據(jù)存儲(chǔ)介質(zhì)及應(yīng)用專用電路,如廣播、電視中用到的數(shù)字調(diào)諧器、信號(hào)處理器,或支持語(yǔ)音撥號(hào)的電話中需要的DTMF發(fā)生器等。而它們之間的數(shù)據(jù)傳遞通常都有距離短、流量小、突發(fā)性等特點(diǎn),如何利用這些共性,使電路的設(shè)計(jì)簡(jiǎn)單而性能穩(wěn)定呢?本文介紹由Philips公司提出的I2C總線很好地解決了這個(gè)問(wèn)題。 I2C總線為兩線雙向串行傳輸總線,它為模塊之間的數(shù)據(jù)傳遞提供了一種方便有效的方法,特別適合應(yīng)用于有很多模塊、彼此之間非頻繁數(shù)據(jù)傳遞的設(shè)計(jì)中。文中介紹了I2C總線協(xié)議,并給出了其軟件的實(shí)現(xiàn)方法,最后提出了硬件連接方法中應(yīng)注意的問(wèn)題。
I2C總線協(xié)議
1.協(xié)議概述
I2C總線僅占用系統(tǒng)的兩個(gè)I/O口,一條作為串行數(shù)據(jù)線SDA,一條作為串行時(shí)鐘線SCL,線上外加上拉電阻,在不傳數(shù)據(jù)時(shí)SCL、SDA總保持高電平。連在每一個(gè)總線上的器件都有一個(gè)唯一地址,它們彼此之間只有簡(jiǎn)單的Master/Slaver關(guān)系:
Master:控制時(shí)鐘線,產(chǎn)生啟動(dòng)信號(hào)、時(shí)鐘信號(hào)、停止信號(hào)??刂凭€上的發(fā)送和接收節(jié)奏。
Slaver:處于從機(jī)地位,按SCL線上的時(shí)鐘接收SDA線上的數(shù)據(jù)或發(fā)送數(shù)據(jù)到SDA線上。
它是個(gè)真正的多主控總線方式,如果有兩個(gè)或兩個(gè)以上Master同時(shí)有數(shù)據(jù)傳送請(qǐng)求時(shí),通過(guò)檢測(cè)發(fā)出去的數(shù)據(jù)是否和SDA線上的數(shù)據(jù)相同來(lái)判斷是否發(fā)生沖突,數(shù)據(jù)不同將放棄此次傳輸,通過(guò)這種沖突檢測(cè)、仲裁機(jī)制可以防止數(shù)據(jù)沖突。
I2C總線要求所有連在I2C總線上的器件都必須是開漏或開集輸出,用以實(shí)現(xiàn)線與的功能,可使不同Master產(chǎn)生的時(shí)鐘同步,也解決Master和Slaver之間速度不匹配問(wèn)題。I2C總線的傳輸速度:標(biāo)準(zhǔn)模式可達(dá)100kbit/s,快速模式可達(dá)400kbit/s,高速模式可達(dá)3.4Mbit/s。
2.協(xié)議規(guī)范
I2C總線數(shù)據(jù)傳輸時(shí)序圖見(jiàn)圖1、圖2,其中,圖1為寫模式時(shí)序,圖2為讀模式時(shí)序。其協(xié)議規(guī)定:數(shù)據(jù)以字節(jié)為單元,每字節(jié)8位,SCL的每一時(shí)鐘脈沖發(fā)送一位,先高位后低位。應(yīng)答位緊跟每個(gè)字節(jié)之后。接收數(shù)據(jù)是在時(shí)鐘的高電平期采樣數(shù)據(jù),所以改變SDA線上的數(shù)據(jù)必須在時(shí)鐘的低電平期,數(shù)據(jù)在時(shí)鐘的高電平期應(yīng)保持不變,正是數(shù)據(jù)傳輸?shù)倪@個(gè)特點(diǎn),I2C總線利用SCL高電平時(shí)改變SDA來(lái)作為開始(start)和結(jié)束(stop)命令。
開始命令信號(hào)(start):在SCL為高電平時(shí),產(chǎn)生一個(gè)1→0跳變,表示開始一個(gè)數(shù)據(jù)傳輸周期。
結(jié)束命令信號(hào)(stop):在SCL為高電平時(shí),產(chǎn)生一個(gè)0→1跳變,表示結(jié)束一個(gè)數(shù)據(jù)傳輸周期。
從機(jī)地址(Slaver address):每個(gè)I2C總線上的器件都有唯一的地址。這個(gè)地址分固定部分和可編程部分,同類器件的固定地址相同,因?yàn)橛锌删幊滩糠?,所以允許有多個(gè)同類或相同器件放在同一總線上。從機(jī)地址必須緊跟start命令信號(hào)之后,與讀寫指示位組成一個(gè)字節(jié)發(fā)送。I2C線上所有處于從機(jī)地位的器件在接到start信號(hào)后的第一字節(jié)后檢查是否和自己的地址相符,如果相符發(fā)送應(yīng)答信號(hào)(在SCL的第9個(gè)時(shí)鐘維持SDA線為低電平),不符,仍保持自己SDA口輸出為高。I2C總線也支持10位地址,本文主要討論7位地址方式。
讀寫位(R/W):讀操作,此位置1;寫操作,此位置0。
應(yīng)答位(ACK):每字節(jié)后緊跟的第一個(gè)時(shí)鐘對(duì)應(yīng)的SDA數(shù)據(jù),這個(gè)數(shù)據(jù)也必須在時(shí)鐘高電平期維持不變。
無(wú)論是讀模式還是寫模式都是相對(duì)Master來(lái)定義的。
當(dāng)Master處于寫模式:即Master要向Slaver送數(shù)據(jù)。Master先發(fā)start信號(hào);緊跟著發(fā)送7位Slaver地址和讀寫指示位0;Slaver確認(rèn)地址和自己相符后置應(yīng)答位SDA為低電平,并判斷讀寫位,準(zhǔn)備接收數(shù)據(jù),若地址不符置高電平;Master檢查應(yīng)答位為高,發(fā)送stop信號(hào)結(jié)束此次數(shù)據(jù)傳輸周期, 如果為低,繼續(xù)發(fā)送數(shù)據(jù),Slaver每接收一字節(jié)數(shù)據(jù),發(fā)送一低應(yīng)答信號(hào),Master檢查到低應(yīng)答信號(hào)后才繼續(xù)發(fā)送下一個(gè)字節(jié)數(shù)據(jù),否則發(fā)送stop信號(hào)停止發(fā)送;當(dāng)Master數(shù)據(jù)發(fā)送完畢后,也會(huì)自動(dòng)發(fā)送stop信號(hào)停止此周期傳送。時(shí)序見(jiàn)圖1。
當(dāng)Master處于讀模式:即Master要讀Slaver數(shù)據(jù)。Master先發(fā)start信號(hào);緊跟著發(fā)送7位Slaver地址和讀寫指示位1;Slaver確認(rèn)地址和自己相符后置應(yīng)答位SDA為低電平,并判斷讀寫位,準(zhǔn)備數(shù)據(jù)發(fā)送,若地址不符置應(yīng)答位為高電平;Master檢查應(yīng)答位為高,發(fā)送stop信號(hào)結(jié)束此次數(shù)據(jù)傳輸周期,如果為低,繼續(xù)發(fā)送時(shí)鐘信號(hào),Slaver按SCL上的時(shí)鐘將數(shù)據(jù)放到SDA上,每當(dāng)Master接收到一字節(jié)數(shù)據(jù)后,發(fā)送低應(yīng)答位給Slaver,Master要停止接收,發(fā)送高應(yīng)答位給Slaver,告訴Slaver不再接收數(shù)據(jù),然后發(fā)stop信號(hào)結(jié)束此次數(shù)據(jù)傳輸周期。時(shí)序見(jiàn)圖2。
I2C總線接口的軟件實(shí)現(xiàn)
本文給出的I2C總線接口程序流程圖為在I2C總線上處于Master地位的總線接口程序。程序入口參數(shù):HDADDS(從機(jī)地址右移1位)、 FLRW(讀寫標(biāo)志位)、REF(存放發(fā)送/接收參數(shù)在RAM中存放的首地址,數(shù)據(jù)由高地址到低地址讀取或存放)、 SDRVCT(發(fā)送參數(shù)的個(gè)數(shù),不包括HDADDS)。圖3為程序流程圖,在本刊的網(wǎng)站上給出了具體程序,供讀者參考。
I2C總線硬件設(shè)計(jì)
在硬件電路設(shè)計(jì)中應(yīng)注意以下幾點(diǎn):
(1)I2C總線驅(qū)動(dòng)能力和連在總線上的器件的等效電容有關(guān),也就是說(shuō)所有連在總線上的器件產(chǎn)生的電容負(fù)載不能超過(guò)400pF。
(2)在I2C總線上,如果所接器件的I/O口的輸入電平邏輯判斷固定為1.5V和3V,與該芯片的供電電壓無(wú)關(guān),則該器件在I2C總線上可獨(dú)立供電,此時(shí)I2C的SDA和SCL經(jīng)上拉電阻連接到5V±10%;如果所接器件的I/O口的輸入電平邏輯判斷和該芯片的供電電壓有關(guān),那么它們必須統(tǒng)一接到相同的供電電壓上,且I2C的SDA和SCL必須經(jīng)上拉電阻也連接在這電壓上。圖4給出I2C總線上混合這兩類器件的電路連接。圖中的右邊兩個(gè)為輸入電平和供電電壓無(wú)關(guān)的器件,左邊兩個(gè)為輸入電平和供電電壓有關(guān)的器件。
結(jié)束語(yǔ)
采用I2C總線的系統(tǒng)很容易實(shí)現(xiàn)模塊的修改,因?yàn)榧尤胍粋€(gè)支持I2C接口的模塊到I2C總線或從I2C上去除一個(gè)模塊無(wú)需附加接口電路,且不影響其它電路。I2C總線靈活性好,器件地址可編程,數(shù)據(jù)傳輸協(xié)議可由自己靈活約定,且容易查錯(cuò)。該總線還具有低耗、寬電壓范圍、適用溫度范圍廣、抗干擾能力強(qiáng)等特點(diǎn),因此被廣泛應(yīng)用于電路設(shè)計(jì)中。