當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > i2c協(xié)議的特點(diǎn)是什么,老司機(jī)帶你深入了解
I2C總線是由Philips公司開(kāi)發(fā)的一種簡(jiǎn)單、雙向二線制同步串行總線。它只需要兩根線(一根數(shù)據(jù)線SDA,一根時(shí)鐘線SCL)即可在連接于總線上的器件之間傳送信息。
在I2C總線中, 各部分器件如下:
主機(jī)初始化發(fā)送,產(chǎn)生時(shí)鐘信號(hào)和終止發(fā)送的器件
從器件被主機(jī)尋址的器件
發(fā)送器發(fā)送數(shù)據(jù)到總線的器件
接收器從總線接收數(shù)據(jù)的器件
多主機(jī)同時(shí)有多于一個(gè)主機(jī)嘗試控制總線但不破壞報(bào)文
仲裁是一個(gè)在有多個(gè)主機(jī)同時(shí)嘗試控制總線,但只允許其中一個(gè)控制總線并使報(bào)文不被破壞的過(guò)程
同步兩個(gè)或多個(gè)器件同步時(shí)鐘信號(hào)的過(guò)程
主機(jī)用于啟動(dòng)總線傳送數(shù)據(jù),并產(chǎn)生時(shí)鐘以開(kāi)放傳送的器件,此時(shí)任何被尋址的器件均被認(rèn)為是從器件.在總線上主和從、發(fā)和收的關(guān)系不是恒定的,而取決于此時(shí)數(shù)據(jù)傳送方向。如果主機(jī)要發(fā)送數(shù)據(jù)給從器件,則主機(jī)首先尋址從器件,然后主動(dòng)發(fā)送數(shù)據(jù)至從器件,最后由主機(jī)終止數(shù)據(jù)傳送;如果主機(jī)要接收從器件的數(shù)據(jù),首先由主機(jī)尋址從器件.然后主機(jī)接收從器件發(fā)送的數(shù)據(jù),最后由主機(jī)終止接收過(guò)程。在這種情況下.主機(jī)負(fù)責(zé)產(chǎn)生定時(shí)時(shí)鐘和終止數(shù)據(jù)傳送。
I2C協(xié)議有如下幾個(gè)特點(diǎn):
1.在硬件上,I2C總線只需要一根數(shù)據(jù)線和一根時(shí)鐘線兩根線,總線接口已經(jīng)集成在芯片內(nèi)部,不需要特殊的接口電路,而且片上接口電路的濾波器可以濾去總線數(shù)據(jù)上的毛刺.因此I2C總線簡(jiǎn)化了硬件電路PCB布線,降低了系統(tǒng)成本,提高了系統(tǒng)可靠性。因?yàn)镮2C芯片除了這兩根線和少量中斷線,與系統(tǒng)再?zèng)]有連接的線,用戶常用I2C可以很容易形成標(biāo)準(zhǔn)化和模塊化,便于重復(fù)利用。
2.發(fā)送到SDA 線上的每個(gè)字節(jié)必須為8 位,每次傳輸可以發(fā)送的字節(jié)數(shù)量不受限制。每個(gè)字節(jié)后必須跟一個(gè)響應(yīng)位。首先傳輸?shù)氖菙?shù)據(jù)的最高位(MSB),如果從機(jī)要完成一些其他功能后(例如一個(gè)內(nèi)部中斷服務(wù)程序)才能接收或發(fā)送下一個(gè)完整的數(shù)據(jù)字節(jié),可以使時(shí)鐘線SCL 保持低電平,迫使主機(jī)進(jìn)入等待狀態(tài),當(dāng)從機(jī)準(zhǔn)備好接收下一個(gè)數(shù)據(jù)字節(jié)并釋放時(shí)鐘線SCL 后數(shù)據(jù)傳輸繼續(xù)。
3. I2C總線是一個(gè)真正的多主機(jī)總線,如果兩個(gè)或多個(gè)主機(jī)同時(shí)初始化數(shù)據(jù)傳輸,可以通過(guò)沖突檢測(cè)和仲裁防止數(shù)據(jù)破壞,每個(gè)連接到總線上的器件都有唯一的地址,任何器件既可以作為主機(jī)也可以作為從機(jī),但同一時(shí)刻只允許有一個(gè)主機(jī)。數(shù)據(jù)傳輸和地址設(shè)定由軟件設(shè)定,非常靈活。總線上的器件增加和刪除不影響其他器件正常工作。
4. I2C總線上的每一個(gè)設(shè)備都可以作為主設(shè)備或者從設(shè)備,而且每一個(gè)設(shè)備都會(huì)對(duì)應(yīng)一個(gè)唯一的地址(可以從I2C器件的數(shù)據(jù)手冊(cè)得知),主從設(shè)備之間就通過(guò)這個(gè)地址來(lái)確定與哪個(gè)器件進(jìn)行通信,在通常的應(yīng)用中,我們把CPU帶I2C總線接口的模塊作為主設(shè)備,把掛接在總線上的其他設(shè)備都作為從設(shè)備。
I2C協(xié)議規(guī)定,總線上數(shù)據(jù)的傳輸必須以一個(gè)起始信號(hào)作為開(kāi)始條件,以一個(gè)結(jié)束信號(hào)作為傳輸?shù)耐V箺l件。起始和結(jié)束信號(hào)總是由主設(shè)備產(chǎn)生。總線在空閑狀態(tài)時(shí),SCL和SDA都保持著高電平,當(dāng)SCL為高電平而SDA由高到低的跳變,表示產(chǎn)生一個(gè)起始條件;當(dāng)SCL為高而SDA由低到高的跳變,表示產(chǎn)生一個(gè)停止條件。在起始條件產(chǎn)生后,總線處于忙狀態(tài),由本次數(shù)據(jù)傳輸?shù)闹鲝脑O(shè)備獨(dú)占,其他I2C器件無(wú)法訪問(wèn)總線;而在停止條件產(chǎn)生后,本次數(shù)據(jù)傳輸?shù)闹鲝脑O(shè)備將釋放總線,總線再次處于空閑狀態(tài)。
I2C的通訊都由主機(jī)發(fā)起,clk為高電平時(shí),sda從高到低; 從器件發(fā)現(xiàn)這樣一組信號(hào),就認(rèn)為主機(jī)要開(kāi)始操作自己了,做好接收的準(zhǔn)備工作。主機(jī)發(fā)送了開(kāi)始位后,把clk拉低,只有clk拉低,sda才可以做高低變化; 當(dāng)clk被拉高時(shí),從器件就會(huì)去讀取sda的高低電平值;clk再次被拉低時(shí),從器件認(rèn)為此位已讀取完畢,認(rèn)為是有效位,等待clk再次拉高,讀取下一位。
主機(jī)發(fā)送完8位后,第9位是校驗(yàn)位,讀取到低電平為有效;主設(shè)備把clk拉低,sdaio換成輸入模式(上拉電阻,默認(rèn)高電平)讀取第9位,clk再次拉高,讀取從設(shè)備發(fā)來(lái)的校驗(yàn)位。
如圖所示時(shí)序圖
對(duì)I2C總線的操作實(shí)際就是主從設(shè)備之間的讀寫(xiě)操作。大致可分為以下三種操作情況:
第一種,主設(shè)備往從設(shè)備中寫(xiě)數(shù)據(jù)。數(shù)據(jù)傳輸格式如下:
第二種,主設(shè)備從從設(shè)備中讀數(shù)據(jù)。數(shù)據(jù)傳輸格式如下:
第三種,主設(shè)備往從設(shè)備中寫(xiě)數(shù)據(jù),然后重啟起始條件,緊接著從從設(shè)備中讀取數(shù)據(jù);或者是主設(shè)備從從設(shè)備中讀數(shù)據(jù),然后重啟起始條件,緊接著主設(shè)備往從設(shè)備中寫(xiě)數(shù)據(jù)。數(shù)據(jù)傳輸格式如下:
第三種操作在單個(gè)主設(shè)備系統(tǒng)中,重復(fù)的開(kāi)啟起始條件機(jī)制要比用STOP終止傳輸后又再次開(kāi)啟總線更有效率。