I2C通信協(xié)議:了解I2C Primer、PMBus和SMBus
?摘要
? ? I2C,即Inter-Integrated Circuit,是一種常用的串行通信協(xié)議,用于在器件之間——特別是兩個或兩個以上不同電路之間建立通信。I2C Primer是最常用的I2C。本文將介紹I2C Primer的基本特性和標準,并重點說明在通信實現(xiàn)過程中如何正確使用該協(xié)議。從I2C的基本原理出發(fā),我們將介紹其變體子集——系統(tǒng)管理總線(SMBus)和電源管理總線(PMBus)——的可用性及二者的區(qū)別。這三種協(xié)議各有專門的功能,旨在滿足不同的客戶需求。
為何重要?
? ? I2C有利于設(shè)計人員在系統(tǒng)的眾多節(jié)點之間建立簡單、雙向、靈活的通信。I2C僅使用兩條雙向線來發(fā)送和接收信息,從而降低了復(fù)雜性。它還允許設(shè)計人員配置多個主節(jié)點系統(tǒng)IC之間的通信。I2C對管理系統(tǒng)和電源的開發(fā)人員也很有利,讓他們能夠在盡可能短的時間內(nèi)創(chuàng)建高質(zhì)量的產(chǎn)品?!皽贤ǎㄍㄐ牛δ切┲铝τ跍贤ǎㄍㄐ牛┑娜擞杏?。”—John Powell
? ? 通信協(xié)議在組織設(shè)備之間通信時扮演著重要角色。它基于系統(tǒng)要求而以不同方式進行設(shè)計。此類協(xié)議具有明確的、為實現(xiàn)成功通信而協(xié)商一致的規(guī)則。如果您曾經(jīng)使用LED顯示器、傳感器甚至加速度計模塊之類的東西構(gòu)建過系統(tǒng),那么您很可能已經(jīng)使用過I2C。I2C支持多個節(jié)點連接單個主器件和多個主器件連接多個節(jié)點的特性。如果您希望物盡其用,讓一個微控制器將數(shù)據(jù)記錄到單個存儲卡,或向單個LCD顯示文本,則此特性非常有用。
? ? 除了最常用的I2C Primer,I2C還有兩個變體,分別專注于系統(tǒng)和電源應(yīng)用,稱為系統(tǒng)管理總線(SMBus)和電源管理總線(PMBus)。根據(jù)定義,Inter-Integrated Circuit (I2C)——也稱為Inter IC——是一種硬件通信協(xié)議,它通過一條多主器件、多節(jié)點、串行通信總線進行同步通信。同步通信意味著兩個(或兩個以上)交換數(shù)據(jù)的器件共享一條公共時鐘線。I2C廣泛用于將低速外圍IC連接到處理器和微控制器。I2C總線由飛利浦公司設(shè)計,它讓位于同一電路板上的器件之間可以輕松通信。
I2C Primer
接口
使用一條串行數(shù)據(jù)(SDA)線、一條串行時鐘(SCL)線和一個公共接地來承載所有通信,最大程度地減少連接。

?每個I2C器件有兩條線路:
?? SDA是供主器件和節(jié)點發(fā)送和接收數(shù)據(jù)的線路。
?? SCL是承載時鐘信號的線路。SCL總是由I2C主器件生成。規(guī)范
對時鐘信號的低相位和高相位有最短周期要求。
I2C總線僅使用兩條雙向線路:每個器件的SDA和SCL用于簡單的IC間通信。

?硬件最重要的注意是在SDA和SCL上加入上拉電阻。I2C器件通過開集或開漏引腳連接到總線,將線路拉低。當(dāng)沒有數(shù)據(jù)傳輸時,I2C總線處于高電平空閑狀態(tài);線路被被動拉高。要傳輸數(shù)
據(jù),須切換線路,即先拉低再釋放(又變?yōu)楦唠娖剑?。?shù)據(jù)位在時鐘下降沿傳輸。開漏輸出需要一個上拉電阻(圖2中的Rp)才能正確輸出高電平。上拉電阻連接在輸出引腳和高電平所需的輸出電壓(圖2中的VDD)之間。對于VCC和VDD (5 V)的典型值,4700 Ω是最常用的上拉電阻值。作為參考,屏蔽2 AWG雙絞線電纜的電容范圍為100 pF?m至240pF?m。因此,I2C鏈路的最大總線長度約為1米(100 kBaud時)或10米(10 kBaud時)。非屏蔽電纜的電容通常要小得多,但只能用在
以其他方式加以屏蔽的外殼內(nèi)。
表1總結(jié)了I2C的關(guān)鍵特性。

?理論上,尋址模式的最大節(jié)點數(shù)為27或210,但有16個地址保留用于特殊用途。I2C是同步的,因此位的輸出通過主器件和節(jié)點之間共享的時鐘信號與位的采樣同步。時鐘信號始終由主器件控制。

保留I2C節(jié)點地址
有16個保留I2C地址。這些地址對應(yīng)于以下兩種模式之一:0000XXX或1111 XXX。表2顯示了為特殊目的而保留的I2C地址。

I2C工作原理
I2C數(shù)據(jù)在消息中傳輸,消息被分解為數(shù)據(jù)幀。讀寫協(xié)議包含地址幀(即節(jié)點的二進制地址)和另一個數(shù)據(jù)幀,后者包含所傳輸?shù)臄?shù)據(jù)、開始和停止條件、重復(fù)起始位、讀?寫位以及每個數(shù)據(jù)幀之間的應(yīng)答?不應(yīng)答位。
時序規(guī)格表
I2C時序表也很重要,因為工程師利用它可以設(shè)計出與總線要求兼容的IC。每個數(shù)據(jù)速率都有自己的時序規(guī)格,主器件和節(jié)點必須遵守該規(guī)格才能正確傳輸數(shù)據(jù)。
表3顯示了時序規(guī)格表上給出的符號和參數(shù)。

總線上的傳輸要么是讀操作,要么是寫操作。讀取和寫入?yún)f(xié)議建立在一系列子協(xié)議之上,例如起始和停止條件、重復(fù)起始位、地址字節(jié)、數(shù)據(jù)傳輸位和應(yīng)答?不應(yīng)答位。
起始條件
顧名思義,起始條件總是在傳輸開始時出現(xiàn),并由主器件發(fā)起。這樣做是為了喚醒總線上的空閑節(jié)點器件。SDA線從高電平切換到低電平,然后SCL線從高電平切換到低電平。參見圖4。
重復(fù)起始條件
在不發(fā)出停止條件的情況下,起始條件可以在傳輸期間重復(fù)。這是一種特殊情況,稱為重復(fù)起始,用于改變數(shù)據(jù)傳輸方向、重復(fù)嘗試傳輸、同步多個IC,甚至控制串行存儲器。參見圖5。
地址幀
地址幀包含7位或10位序列,具體取決于可用性(參見數(shù)據(jù)手冊)。參見圖6。


?不像SPI,I2C沒有節(jié)點選擇線路,因此它需要另一種方法來讓節(jié)點知道數(shù)據(jù)正向其發(fā)送,而不是向另一個節(jié)點發(fā)送。這是通過尋址來實現(xiàn)的。地址幀始終是新消息中起始位之后的第一幀。主器件將其想要與之通信的節(jié)點地址發(fā)送到其所連接的每個節(jié)點。然后,每個節(jié)點將主器件所發(fā)送的地址與其自己的地址進行比較。如果地址匹配,它便向主器件發(fā)送一個低電壓ACK位。如果地址不匹配,則節(jié)點什么也不做,SDA線保持高電平。
讀?寫位
地址幀的最后一位告知節(jié)點,主器件是想要將數(shù)據(jù)寫入其中還是從中接收數(shù)據(jù)。如果主器件希望將數(shù)據(jù)發(fā)送到節(jié)點,則讀?寫位處于低電平。如果主器件請求從節(jié)點得到數(shù)據(jù),則該位處于高電平。參見圖7。
ACK?NACK位
消息中的每一幀后面都跟隨一個應(yīng)答?不應(yīng)答位。如果成功接收到一個地址幀或數(shù)據(jù)幀,則接收器件會向發(fā)件者返回一個
ACK位。
圖例:在下面的圖中,白色框表示節(jié)點,藍色框表示主器件。
參見圖8。
數(shù)據(jù)幀
主器件檢測到來自節(jié)點的ACK位之后,就準備發(fā)送第一數(shù)據(jù)幀。數(shù)據(jù)幀總是8位長,并以MSB優(yōu)先方式發(fā)送。每個數(shù)據(jù)幀之后緊接著一個ACK?NACK位,以驗證該幀是否已成功接收。主器件或節(jié)
點(取決于誰發(fā)送數(shù)據(jù))必須收到ACK位,然后才能發(fā)送下一數(shù)據(jù)幀。參見圖9。
停止條件
發(fā)送完所有數(shù)據(jù)幀之后,主器件可以向節(jié)點發(fā)送停止條件以停止傳輸。停止條件是指SCL線上的電壓從低電平變?yōu)楦唠娖?,然后在SCL線保持高電平的情況下,SDA線上的電壓從低電平變?yōu)楦唠娖?。在SCL線從低電平切換到高電平后,SDA線從低電平切換到高電平。參見圖10。
I2C傳輸步驟:寫入有關(guān)寫入單個數(shù)據(jù)的I2C傳輸?shù)氖纠?,請參見圖11。
第1步
主器件將SDA線從高電平切換到低電平,然后將SCL線從高電平切換到低電平,以將起始條件發(fā)送到每個相連的節(jié)點。
第2步
主器件將其想要與之通信的節(jié)點的7位或10位地址以及寫操作位發(fā)送給每個節(jié)點。
例如,7位地址為0x2D,加上寫操作位(相當(dāng)于0),結(jié)果將是0x5A。
第3步
每個節(jié)點將主器件所發(fā)送的地址與其自己的地址進行比較。如果地址匹配,節(jié)點便將SDA線拉低一位的時間,以返回一個ACK位。如果來自主器件的地址與節(jié)點自己的地址不匹配,則節(jié)點讓SDA線保持高電平不變。在SCL的第九個脈沖期間拉低SDA線路可以發(fā)送ACK位,保持浮空高電平則為NACK。
第4步
主器件發(fā)送或接收數(shù)據(jù)幀。
第5步
傳輸完每個數(shù)據(jù)幀之后,接收器件再向發(fā)送者返回一個ACK位,以確認成功接收該幀。
第6步
若要停止數(shù)據(jù)傳輸,主器件應(yīng)將SCL切換為高電平,然后將SDA切換為高電平,從而發(fā)送停止條件。


?
:??https://shop220317387.taobao.com/