一、概述
IIC-BUS,是 Inter-Integrated Circuit Bus 的縮寫,顧名思義,簡單、方便地連接各種外設(shè)芯片,一種雙向2線制同步串行總線。
二、基本特征
基本特征如下:
串行(只有一根數(shù)據(jù)線,只能一位一位 bit 發(fā)送和接收)
同步(兩邊使用共同的時鐘線:無論是接收還是發(fā)送數(shù)據(jù),時鐘都是由主機(jī)提供)
單端(區(qū)別于差分信號,數(shù)據(jù)線使用絕對電平作為 0 或者 1 的區(qū)分)
雙向(半雙工,同一時間只能接收或者發(fā)送)
主從(Master/Slave,只能由主機(jī)發(fā)起通信請求,從機(jī)只能響應(yīng))
總線(Bus,一條通信鏈路可以接多個設(shè)備)
三、電路連接和配置
一般的電路連接如下所示:
右圖中可知,設(shè)備間連接至少需要三根線:SDA(串行數(shù)據(jù)線)、SCL(串行時鐘線)和 GND(地)。
需要注意的是,無論是主機(jī)還是從機(jī) SDA 和 SCL 的引腳,都需要配置成 漏極開路(OD:Open drain,存在于MOS管中)或者 集電極開路的(Open Collector,存在于三極管中)的形式:
這個特征需要我們在嵌入式系統(tǒng)中使用 IIC 時需要考慮兩個點(diǎn):
軟件設(shè)計(jì)時,單片機(jī)的 GPIO 端口要配置成漏極開路(OD:Open drain)模式,效果就是:導(dǎo)通時會將總線電壓拉低到地,不導(dǎo)通時就是高阻態(tài),等效于一個阻值超級大的電阻,相當(dāng)于分壓很大,不影響信號線的電平)
這樣的電路設(shè)計(jì)其實(shí)是為了實(shí)現(xiàn) 線與 功能,線與的意思就是 邏輯與,對應(yīng)到這里的的電路是:所有設(shè)備不拉低才為高,只要有一個設(shè)備拉低就會將總線拉低。
四、優(yōu)點(diǎn)
只需要2根信號線(節(jié)約 PCB 板面積、引腳、成本等,都是錢呀)
協(xié)議簡單(當(dāng)然是相對于 USB、以太網(wǎng)等協(xié)議)
協(xié)議容易實(shí)現(xiàn)(硬件電路比較簡單)
支持的器件多(硬件 IIC 功能是現(xiàn)在單片機(jī)的標(biāo)配,當(dāng)然一些低端的 8 位單片機(jī)可能沒有,但也能使用 GPIO 模擬實(shí)現(xiàn)) 。
總線可以同時掛載多個器件 (這就是總線的優(yōu)勢了)
總線電氣兼容性好(對于常用的 5V、3.3V都支持,就看你上拉電阻選擇哪一個了)
速率較高(100kbps ~ 400kbps ~3.4Mbps,其實(shí)這個速率只能算一般吧)
距離較遠(yuǎn)(幾米,降低速率~十幾米,不過一般都是比較近的使用場景,為了保證信號的準(zhǔn)確性,遠(yuǎn)距離會選擇具有差分信號的信號線)
五、I2C 總線的電平邏輯
I2C 是電平有效的(SPI 則是邊沿有效的),也就是說:在傳輸數(shù)據(jù)的過程中,在 SCL 為低電平時,數(shù)據(jù)線 SDA 的電平發(fā)生變化,在 SCL為高電平時,SDA 的電平保持不變(這個時候的電平就是通信的數(shù)據(jù)位)。
當(dāng)然,也有特殊情況,在 I2C 總線開始和結(jié)束數(shù)據(jù)傳輸時,SDA 在 SCL 為高時變化,這正好能夠區(qū)分是傳輸數(shù)據(jù)還是起始結(jié)束信號。
5.1、起始與結(jié)束信號
如圖所示,
起始位:
當(dāng)SCL處于高電平時,SDA從高電平向低電平跳變,產(chǎn)生“起始”位。 總線在起始條件產(chǎn)生后便處于忙(Busy)的狀態(tài)。可將“起始”位簡記為S。
停止位:
當(dāng)SCL處于高電平時,SDA從低電平向高電平跳變,產(chǎn)生“停止”位。 總線在停止條件產(chǎn)生后處于空困狀態(tài)。可將“停止”位簡記為P。
5.2、通信數(shù)據(jù)幀
?
灰色方塊表示主機(jī)控制 SDA 數(shù)據(jù)線發(fā)送數(shù)據(jù),白色方塊表示從機(jī)控制 SDA 數(shù)據(jù)線給主機(jī)應(yīng)答或者響應(yīng)數(shù)據(jù)給主機(jī)。
SA(Slave Address) 為從機(jī)地址,主機(jī)不需要地址,但是從機(jī)必須要有個地址,因?yàn)榭偩€連接多個設(shè)備時需要用地址區(qū)分,同時設(shè)備也只響應(yīng)針對自身地址的通信,其中總線的從機(jī)地址位為 7 bits,即只可以連接 128 個從機(jī)設(shè)備。(值得說明的是,大多數(shù) I2C 從機(jī)設(shè)備會將這7位固定好幾位,這樣有能夠減少設(shè)備的引腳數(shù)的優(yōu)勢,這個看手冊的說明即可)
5.3、高階知識
重復(fù)起始(Repeated Start)
上圖中的 Sr 為重復(fù)起始 (Repeated Start)
I2C 通訊中,有時需要切換數(shù)據(jù)收發(fā)的方向,例如 I2C 設(shè)備是個EEPROM 存儲器時,要讀 EEEPROM ,需要先寫入地址(主->從),再讀取數(shù)據(jù)(從->主), 此時無需給出停止位,然后再給開始位,而是直接再產(chǎn)生一次開始位,就可以了,稱為“重復(fù)起始位,記為 Sr。這樣做的好處是提高了通信的效率。
I2C 從設(shè)備子地址
我們知道,有一些 I2C 器件,除了器件自身的 I2C 地址SA外,其內(nèi)部還有若干個單元可被訪問,相應(yīng)具有子地址(寄存器),
比較典型的是 EEPROM 存儲器等,子地址可以是 1字節(jié)~N字節(jié),主機(jī)可以發(fā)送數(shù)據(jù)來對子地址進(jìn)行控制。下面我們來探討兩種情況:對從設(shè)備的寄存器寫入數(shù)據(jù)和對讀取從設(shè)備某些寄存器的值。
如下圖所示,
主機(jī)先發(fā)送從機(jī)的 IIC 地址和寫標(biāo)記,接著緊跟寄存器的地址,然后跟著發(fā)送該寄存器的數(shù)據(jù),完成對指定寄存器的寫入操作。
如下圖所示,
主機(jī)發(fā)送從機(jī)的 IIC 地址和寫標(biāo)記,然后發(fā)送所要讀取寄存器的地址值,然后發(fā)起一次重啟讀操作,從設(shè)備回應(yīng)數(shù)據(jù),完成一次對從設(shè)備某個寄存器值的讀取操作。
(值得說明的是,為什么要啟動一次 Sr 重啟操作呢?因?yàn)橐淮瓮ㄐ胖荒苡幸粋€方向,讀或者寫,若要轉(zhuǎn)換方向,那必須重新發(fā)起)
評論