I2C(Inter Integrated Circuit,內(nèi)部集成電路)總線是價(jià)格低廉卻很有效的用以互連小規(guī)模嵌入式系統(tǒng)內(nèi)的外設(shè)的網(wǎng)絡(luò)。I2C 總線有時(shí)候也叫作 IIC,它已有20多年的歷史了。I2C 接口和 SPI 接口的作用相同,但二者的使用方法有些不同。
I2C 總線用兩根線來(lái)連接多支路總線中的多個(gè)設(shè)備。這種總線是雙向、低速的,并與公共時(shí)鐘同步??梢灾苯訉⒁粋€(gè)設(shè)備接到 I2C 總線上或是從該總線上取下,而不會(huì)影響其他設(shè)備。一些生產(chǎn)商比如 Microchip 公司、Philips 公司、Intel 公司等生產(chǎn)的小型微處理器都內(nèi)置了 I2C 接口。I2C 總線的數(shù)據(jù)傳輸率比 SPI 總線要慢一些,在標(biāo)準(zhǔn)模式下的傳輸速度為 100kbps,在快速模式下為 400kbps。利用 I2C 接口在設(shè)備之間進(jìn)行連接使用的兩根線是SDA(串行數(shù)據(jù))和SCL(串行時(shí)鐘),它們都是開(kāi)漏,通過(guò)一個(gè)上拉電阻接到正電源,因此在不使用的時(shí)候扔保持高電平。使用 I2C 總線進(jìn)行通信的設(shè)備驅(qū)動(dòng)這兩根線變?yōu)榈碗娖剑诓皇褂玫臅r(shí)候就讓它們保持高電平。每個(gè)連到 I2C 的設(shè)備都有一個(gè)唯一地址,這個(gè)設(shè)備可以是數(shù)據(jù)發(fā)送者(總線主機(jī))、接收者(總線從機(jī)),也可以二者都是。I2C 是多主機(jī)總線,這意味著可以有多個(gè)設(shè)備充當(dāng)總線主機(jī)的角色。
圖1. I2C總線連線圖
SDA和SCL都是雙向的。SPI 總線有兩根單獨(dú)的線,分別用于兩個(gè)方向的通信,而 I2C 總線不同,它使用同一根線來(lái)完成主機(jī)發(fā)送數(shù)據(jù)和接收從機(jī)響應(yīng)。另外,與 SPI 總線具有多個(gè)工作模式不同,I2C 總線只有一個(gè)工作模式,時(shí)鐘線 SCL 和數(shù)據(jù)線 SDA 之間的時(shí)序關(guān)系很簡(jiǎn)單直觀:當(dāng)空閑的時(shí)候,SDA 和 SCL 都是高電平,只有 SDA 變?yōu)榈碗娖?,接?SCL 也變?yōu)榈碗娖綍r(shí),才開(kāi)始 I2C 總線的數(shù)據(jù)傳輸。當(dāng) SDA 和 SCL 都變?yōu)榈碗娖綍r(shí),就是告訴總線上的所有接收設(shè)備數(shù)據(jù)包的傳輸開(kāi)始了,在 SCL 變?yōu)榈碗娖胶?,SDA 才發(fā)送第一個(gè)有效數(shù)據(jù)位,這稱為開(kāi)始條件。對(duì)于被傳輸?shù)拿恳晃?,?dāng) SCL 為低電平時(shí)在 SDA 上必須變?yōu)橛行?,該位是?SCL 的上升沿對(duì) SDA 上的數(shù)據(jù)位進(jìn)行采樣的,也必須一直保持有效直到 SCL 再次變?yōu)榈碗娖?,然?SDA 就在 SCL 再次變?yōu)楦唠娖街皞鬏斚乱晃?。最后,SCL 變?yōu)楦唠娖剑又?SDA 也變?yōu)楦唠娖?,?shù)據(jù)傳輸結(jié)束。這被稱為結(jié)束條件。
圖2. I2C總線傳輸?shù)拈_(kāi)始條件和結(jié)束條件
無(wú)論多大的數(shù)據(jù)包都可以通過(guò) I2C 總線進(jìn)行傳輸。像 SPI 總線一樣,I2C 也是高位先傳輸。如果數(shù)據(jù)接收者無(wú)法再接收更多的數(shù)據(jù),它可以通過(guò)將SCL保持低電平來(lái)中斷傳輸,這樣可以迫使數(shù)據(jù)發(fā)送者等待,直到 SCL 被重新釋放。發(fā)送方發(fā)出的每個(gè)字節(jié)都必須經(jīng)過(guò)接收方確認(rèn),每個(gè)字節(jié)的第8位數(shù)據(jù)一旦傳送結(jié)束,發(fā)送方就釋放數(shù)據(jù)線 SDA,然后主機(jī)在 SCL 上產(chǎn)生一個(gè)額外的時(shí)鐘脈沖,這會(huì)觸發(fā)接收方通過(guò)將 SDA 置為低電平來(lái)表示接收到的字節(jié)進(jìn)行確認(rèn)。如果接收方?jīng)]有能將 SDA 置為低電平,發(fā)送方就會(huì)中斷傳輸,并且采取適當(dāng)?shù)腻e(cuò)誤處理措施。
圖3. 帶有接收方確認(rèn)的I2C數(shù)據(jù)包
由于 I2C 是多主機(jī)總線,因此存在同一時(shí)刻會(huì)有多個(gè)主機(jī)試圖開(kāi)始數(shù)據(jù)傳輸?shù)目赡?。SPI 總線使用一個(gè)獨(dú)立的片選端來(lái)使接收從機(jī)有效,每個(gè) SPI 從機(jī)都有一個(gè)單獨(dú)的片選端,由主機(jī)驅(qū)動(dòng)。I2C 沒(méi)有這樣的選擇機(jī)制,不過(guò)總線上的每個(gè)設(shè)備都有一個(gè)唯一的地址,數(shù)據(jù)包傳輸時(shí)先發(fā)送地址位,接著才是數(shù)據(jù)。一個(gè)地址字節(jié)由7個(gè)地址位和1個(gè)指示位組成。如果指示位是0,意味著這個(gè)傳輸是一個(gè)寫操作,被選中的從機(jī)將接收數(shù)據(jù)并將其作為輸入;如果指示位是1,就要求從機(jī)將數(shù)據(jù)發(fā)送回主機(jī)。
I2C 總線還支持一個(gè)擴(kuò)展的10位尋址模式,可連接的外設(shè)數(shù)量可達(dá)1024個(gè),使用7位尋址模式的設(shè)備和10位尋址模式的設(shè)備可以在同一個(gè)系統(tǒng)中混合使用。10位尋址時(shí),使用2個(gè)字節(jié)來(lái)保存地址。如果第1個(gè)地址字節(jié)以0b11110xx_開(kāi)始,就會(huì)產(chǎn)生一個(gè)10位地址,第1個(gè)字節(jié)的第1、2位(第0位是讀寫指示位)和第2個(gè)字節(jié)的8位合起來(lái)構(gòu)成10位的地址。而7位設(shè)備將會(huì)忽略這個(gè)過(guò)程。
圖4. I2C普通的和帶重復(fù)開(kāi)始條件的7位地址格式
圖5. I2C總線10位地址格式
-
SPI
+關(guān)注
關(guān)注
17文章
1688瀏覽量
91202 -
總線
+關(guān)注
關(guān)注
10文章
2858瀏覽量
87912 -
I2C
+關(guān)注
關(guān)注
28文章
1477瀏覽量
123054
原文標(biāo)題:淺談I2C總線,有時(shí)候它也叫?IIC
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論