在電子設(shè)計(jì)開(kāi)發(fā)中I2C大家已經(jīng)很熟悉了,每一種電子產(chǎn)品小到電子開(kāi)關(guān),大到衛(wèi)星通信都會(huì)利用的I2C總線。據(jù)統(tǒng)計(jì)I2C在電子產(chǎn)品中占據(jù)了93%的份額,幾乎任何一種電路都要使用。
I2C是由PHILIPS公司在1980年開(kāi)發(fā)的兩線式串行總線,至今已經(jīng)發(fā)展30多年的歷史了。古老的電子產(chǎn)品中就已經(jīng)在使用I2C總線了。I2C總線在所有總線中是最簡(jiǎn)單,最穩(wěn)定的一種,由于發(fā)展歷史久遠(yuǎn),所以I2C總線出現(xiàn)了多種版本。但是萬(wàn)變不離其中,有的廠商甚至在原有I2C總線的基礎(chǔ)上,自己改變了總線時(shí)序,成為獨(dú)有的I2C。但是基本原理不變。
我遇到過(guò)很多人在問(wèn)我,自己的I2C程序明明已經(jīng)調(diào)試好,可換了個(gè)芯片就通信失敗了,不能讀取數(shù)據(jù)了。都是I2C的元器件,只是芯片廠家不同。在這里我告訴大家,這總線歷史悠久,各種版本的要有幾十種甚至幾百種了,所有版本的通信格式,協(xié)議都一樣,只是時(shí)間不同了,因?yàn)橛械男酒瑥S家更改了時(shí)序中的時(shí)鐘周期。所以大家遇到這種問(wèn)題,只需調(diào)整延時(shí),其余不動(dòng)即可,不必不知所措,亂找問(wèn)題。

I2C總線從機(jī)設(shè)備最多支持127個(gè),主要是通過(guò)串行數(shù)據(jù)(SDA)線和串行時(shí)鐘 (SCL)線在連接到總線的器件間傳遞信息。每個(gè)器件都有一個(gè)唯一的地址。
I2C總線有三種數(shù)據(jù)傳輸速度:標(biāo)準(zhǔn),快速模式和高速模式。標(biāo)準(zhǔn)的是100Kbps,快速模式為400Kbps,高速模式支持快至3.4Mbps的速度。所有的與次之傳輸速度的模式都是兼容的。I2C總線支持7位和10位地址空間設(shè)備和在不同電壓下運(yùn)行的設(shè)備。
TTL電平與COMS在I2C這里通用。是相互兼容的。
由于I2C的模式多種多樣,我就給大家講一種常用的7位尋址模式的通信,還有10位模式,大家可以自行找資料去了解,這種10位模式的較少。
總線通信流程大概分為四部分。1.啟動(dòng)—2.數(shù)據(jù)傳輸—3.應(yīng)答—4.結(jié)束。
啟動(dòng)與結(jié)束:
SCL 線是高電平時(shí),SDA 線從高電平向低電平切換,這個(gè)情況表示起始條件;
SCL 線是高電平時(shí),SDA 線由低電平向高電平切換,這個(gè)情況表示停止條件。
數(shù)據(jù)傳輸:
發(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ù)。
數(shù)據(jù)應(yīng)答:
數(shù)據(jù)傳輸必須帶響應(yīng),相關(guān)的響應(yīng)時(shí)鐘脈沖由主機(jī)產(chǎn)生。在響應(yīng)的時(shí)鐘脈沖期間發(fā)送器釋放SDA 線(高)。
在響應(yīng)的時(shí)鐘脈沖期間,接收器必須將SDA 線拉低,使它在這個(gè)時(shí)鐘脈沖的高電平期間保持穩(wěn)定的低電平。
以上是基本的通信流程,當(dāng)然這通信是離不開(kāi)時(shí)鐘線的SCL。
時(shí)鐘同步:
所有主機(jī)在SCL線上產(chǎn)生它們自己的時(shí)鐘來(lái)傳輸I2C總線上的報(bào)文。數(shù)據(jù)只在時(shí)鐘的高電平周期有效,因此需要一個(gè)確定的時(shí)鐘進(jìn)行逐位仲裁。
時(shí)鐘同步通過(guò)線與連接I2C 接口到SCL 線來(lái)執(zhí)行。這就是說(shuō)SCL 線的高到低切換會(huì)使器件開(kāi)始數(shù)它們的低電平周期,而且一旦器件的時(shí)鐘變低電平,它會(huì)使SCL 線保持這種狀態(tài)直到到達(dá)時(shí)鐘的高電平。但是如果另一個(gè)時(shí)鐘仍處于低電平周期,這個(gè)時(shí)鐘的低到高切換不會(huì)改變SCL 線的狀態(tài)。因此SCL 線被有最長(zhǎng)低電平周期的器件保持低電平。此時(shí)低電平周期短的器件會(huì)進(jìn)入高電平的等待狀態(tài)。當(dāng)所有有關(guān)的器件數(shù)完了它們的低電平周期后,時(shí)鐘線被釋放并變成高電平。之后,器件時(shí)鐘和SCL線的狀態(tài)沒(méi)有差別,而且所有器件會(huì)開(kāi)始數(shù)它們的高電平周期。首先完成高電平周期的器件會(huì)再次將SCL線拉低。
這樣產(chǎn)生的同步SCL 時(shí)鐘的低電平周期由低電平時(shí)鐘周期最長(zhǎng)的器件決定,而高電平周期由高電平時(shí)鐘周期最短的器件決定。
7位尋址方式:
第一個(gè)字節(jié)的頭7 位組成了從機(jī)地址,最低位(LSB)是第8 位,它決定了傳輸?shù)姆较?。第一個(gè)字節(jié)的最低位是“0”,表示主機(jī)會(huì)寫(xiě)信息到被選中的從機(jī);“1”表示主機(jī)會(huì)向從機(jī)讀信息,當(dāng)發(fā)送了一個(gè)地址后,系統(tǒng)中的每個(gè)器件都在起始條件后將頭7 位與它自己的地址比較,如果一樣,器件會(huì)判定它被主機(jī)尋址,至于是從機(jī)接收器還是從機(jī)發(fā)送器,都由R/W 位決定的。
下面是I2C的時(shí)序圖與對(duì)應(yīng)程序,程序已經(jīng)調(diào)試通過(guò),大家可以使用,但是大家記住一點(diǎn),不同廠家芯片時(shí)鐘周期會(huì)不同。本人以51單片機(jī),keil4開(kāi)發(fā)環(huán)境,12M晶振調(diào)試通過(guò)。從機(jī)芯片是AT24C08芯片。
起始與停止總線:

I2C總線程序起始與停止:

I2C讀寫(xiě)時(shí)序:

I2C讀寫(xiě)單個(gè)字節(jié):


I2C應(yīng)答與非應(yīng)答時(shí)序:

I2C多字節(jié)連續(xù)讀寫(xiě)時(shí)序:

以上程序調(diào)試通過(guò),直接使用即可。但根據(jù)不同廠家的芯片可能時(shí)序會(huì)有不同,如遇通信不正常,可改變延時(shí)?;窘o大家把I2C的基本通信總結(jié)了一下。由于I2C種類版本繁多,但基本原理相同,這里不一一舉例。
責(zé)任編輯:haq
-
電路
+關(guān)注
關(guān)注
173文章
6079瀏覽量
178455 -
I2C
+關(guān)注
關(guān)注
28文章
1556瀏覽量
131272 -
電子設(shè)計(jì)
+關(guān)注
關(guān)注
42文章
1763瀏覽量
49858
原文標(biāo)題:看懂了這篇文章你將會(huì)操作所有的IIC器件?。。?/p>
文章出處:【微信號(hào):KY_QRS,微信公眾號(hào):開(kāi)源嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
I2C總線-通信線纜長(zhǎng)度的影響及改進(jìn)措施
I2C 為什么只要兩根線就能搞定通信?
P82B715:I2C總線擴(kuò)展的得力助手
基于FPGA的I2C控制模塊設(shè)計(jì)
TCA39306雙向I2C總線和SMBus電壓電平轉(zhuǎn)換器技術(shù)解析
I2C的總線協(xié)議
如何在CW32 MCU上優(yōu)化I2C通信
深入剖析I2C協(xié)議
I2C總線通信,為什么要進(jìn)行電氣隔離?
第十八章 I2C通信測(cè)試
【技術(shù)說(shuō)明】數(shù)字輸出壓力傳感器的I2C通信
嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-I2C設(shè)備驅(qū)動(dòng)之Linux下的I2C驅(qū)動(dòng)簡(jiǎn)介
飛凌嵌入式ElfBoard ELF 1板卡-I2C設(shè)備驅(qū)動(dòng)之Linux下的I2C驅(qū)動(dòng)簡(jiǎn)介
是德DSOX4034A示波器I2C總線信號(hào)分析
I2C總線的基本通信總結(jié)
評(píng)論