以下文章來(lái)源于汽車電控知識(shí),作者安己樂(lè)人
I2C(Inter-Integrated Circuit)表示集成電路互連,是一種用于線路板內(nèi)部芯片之間通信的總線。
I2C總線的引腳和導(dǎo)線的數(shù)量很少,簡(jiǎn)化了布線空間,極大的方便了芯片設(shè)計(jì)和應(yīng)用。
同樣可以用于板內(nèi)芯片間串行通信的還有SPI總線《為什么說(shuō)SPI總線的數(shù)據(jù)傳輸與眾不同?》,它們之間有什么區(qū)別呢?
1.物理接口
1.1全雙工與半雙工
SPI總線有4根線,串行數(shù)據(jù)線MOSI和MISO、串行時(shí)鐘線SCK和從設(shè)備選擇SS。
SPI總線接口1對(duì)1原理框圖
而I2C總線僅需要兩條線就可以實(shí)現(xiàn)芯片之間的互連通信,這兩根線分別為串行數(shù)據(jù)線SDA和串行時(shí)鐘線SCL。
I2C總線接口1對(duì)1原理框圖
通過(guò)接口對(duì)比可以看出,SPI有2個(gè)數(shù)據(jù)線MOSI和MISO,而I2C只有1個(gè)數(shù)據(jù)線SDA。
SPI的2個(gè)數(shù)據(jù)線分別用于發(fā)送和接收,所以可以實(shí)現(xiàn)全雙工的通信,所謂的雙工就是指可以在發(fā)送與接收兩個(gè)方向上傳輸數(shù)據(jù),全雙工就是可以同時(shí)進(jìn)行收發(fā)。
而I2C只用1根數(shù)據(jù)線,也可以實(shí)現(xiàn)兩個(gè)方向的傳輸,但是同一時(shí)刻只能進(jìn)行收或發(fā),不能同時(shí)進(jìn)行,因此I2C是一種半雙工的通信方式。
這里要說(shuō)明一下,I2C的新版協(xié)議已經(jīng)將術(shù)語(yǔ)主機(jī)和從機(jī)更改為控制器和目標(biāo),我們這里為了方便理解它的原理,還是用主機(jī)和從機(jī)的描述。
1.2上拉電阻
SPI總線是信號(hào)直接相連,外部不需要上拉電阻。
而I2C總線中的SDA和SCL,都必須通過(guò)上拉電阻連接到電源電壓。這是因?yàn)镮2C設(shè)備內(nèi)部輸出電路為開漏(OD)輸出或開集電極(OC)輸出,無(wú)法提供高電平輸出,所以要在總線上外接上拉電阻,目的就是用來(lái)給總線上的時(shí)鐘或數(shù)據(jù)提供高電平。
R1和R2為外部上拉電阻
1.3硬件尋址與軟件尋址
SPI的SS信號(hào)用于主設(shè)備選擇從設(shè)備,當(dāng)有多個(gè)從設(shè)備時(shí),主設(shè)備通過(guò)SS信號(hào)線來(lái)使能需要通信的從設(shè)備,通過(guò)硬線信號(hào)實(shí)現(xiàn)片選的功能,這稱為硬件尋址。
而I2C沒(méi)有類似SS這樣的硬線信號(hào),它使用的是設(shè)備地址,設(shè)備地址是個(gè)7位的數(shù)據(jù),包括器件類型和地址碼,主設(shè)備通過(guò)數(shù)據(jù)線中的地址數(shù)據(jù)來(lái)實(shí)現(xiàn)片選功能,也就是軟件尋址。
此外,SPI的速率與SCK時(shí)鐘頻率有關(guān);I2C的傳輸速率不僅與SCL時(shí)鐘頻率有關(guān),還與工作模式有關(guān),8位的串行雙向數(shù)據(jù)傳輸速率在標(biāo)準(zhǔn)模式下最高可達(dá)100 kbit/s,在快速模式下最高可達(dá)400 kbit/s,在快速增強(qiáng)模式下最高可達(dá)1 Mbit/s,在高速模式下最高可達(dá)3.4 Mbit/s。8位的單向數(shù)據(jù)傳輸,在超快速模式下最高可達(dá)5 Mbit/s。
2.主從模式
SPI采用主從模式,主設(shè)備通過(guò)提供 SCK(Clock)和SS (SlaveSelect)來(lái)控制多個(gè)從設(shè)備,從設(shè)備的 Clock 由主設(shè)備通過(guò) SCK 管腳提供。
當(dāng)有多個(gè)從設(shè)備的時(shí)候,主設(shè)備會(huì)分配給每個(gè)從設(shè)備一個(gè)片選信號(hào),當(dāng)主設(shè)備和某個(gè)從設(shè)備進(jìn)行通信時(shí),需要將從設(shè)備對(duì)應(yīng)的片選引腳電平拉低。
SPI總線1主3從原理框圖
與SPI總線相似,I2C采用的也是主從模式。從設(shè)備的 Clock 由主設(shè)備通過(guò) SCL 管腳提供。
當(dāng)有多個(gè)從設(shè)備的時(shí)候,每個(gè)設(shè)備,包括主設(shè)備都有一個(gè)唯一的設(shè)備地址,主設(shè)備在通信時(shí)通過(guò)SDA發(fā)送地址數(shù)據(jù)來(lái)選擇對(duì)應(yīng)的從設(shè)備。
與SPI不同的是,I2C是一種多主總線,也就是在總線上可以連接多個(gè)主設(shè)備,這些主設(shè)備都可以發(fā)起對(duì)總線的控制。
I2C總線2主2從原理框圖
所以I2C的主從關(guān)系不是固定的,它會(huì)根據(jù)功能需要,在通信過(guò)程中動(dòng)態(tài)變化。
I2C總線可以是多主模式,動(dòng)態(tài)變化
2.1仲裁
主從模式中的一主多從在整個(gè)周期中都是由主設(shè)備來(lái)控制時(shí)序和進(jìn)程,不會(huì)有控制權(quán)沖突的現(xiàn)象。
但是多主模式在多個(gè)設(shè)備同時(shí)控制發(fā)送時(shí)就會(huì)產(chǎn)生沖突,因?yàn)榭偩€上同一個(gè)時(shí)刻,只能有一個(gè)主設(shè)備獲得控制權(quán),所以I2C總線必須還要有個(gè)發(fā)生沖突時(shí)的仲裁機(jī)制,以確定最終由哪個(gè)主機(jī)控制總線并完成其傳輸。
I2C的仲裁機(jī)制是如果兩個(gè)或多個(gè)主機(jī)同時(shí)發(fā)送數(shù)據(jù),一個(gè)主機(jī)發(fā)送“0”,另一個(gè)主機(jī)發(fā)送“1”時(shí),發(fā)送“0”的主機(jī)獲得控制權(quán),發(fā)送“1”的主機(jī)將失去仲裁。
從總線電平來(lái)看,就是當(dāng)總線上只要有一個(gè)設(shè)備輸出低電平,整條總線便處于低電平狀態(tài),這也稱為線與邏輯。
2.2時(shí)鐘同步
當(dāng)總線為空閑狀態(tài)時(shí),SDA和SCL兩條線路一定都是高電平。
在總線空閑時(shí),兩個(gè)主機(jī)可以同時(shí)啟動(dòng)傳輸,必須有一種方法來(lái)決定由哪一個(gè)主機(jī)來(lái)控制總線并完成傳輸。這是通過(guò)時(shí)鐘同步和仲裁兩個(gè)步驟來(lái)完成的。
I2C總線時(shí)鐘同步
如上圖所示,時(shí)鐘同步就是通過(guò)SCL接口和SCL總線之間的“線與”連接來(lái)執(zhí)行的。
主機(jī)一的SCL接口檢測(cè)到總線上由高電平到低電平的轉(zhuǎn)換時(shí),便拉低自己的SCL,并開始倒計(jì)時(shí)應(yīng)有的SCL低電平保持時(shí)間,直到應(yīng)有的低電平時(shí)間結(jié)束,會(huì)把SCL時(shí)鐘拉到高電平狀態(tài)。
如果另一個(gè)主機(jī)二的SCL時(shí)鐘仍然處于低電平周期內(nèi),則主機(jī)一的SCL時(shí)鐘由低到高的轉(zhuǎn)換不會(huì)改變SCL總線為低電平的狀態(tài),主機(jī)一的SCL時(shí)鐘會(huì)進(jìn)入高電平等待狀態(tài)。因此,SCL總線會(huì)被具有最長(zhǎng)低電平周期的主機(jī)保持在低電平。
當(dāng)所有的主機(jī)都已完成自身低電平周期的計(jì)時(shí)時(shí),SCL時(shí)鐘總線會(huì)被釋放并變?yōu)楦唠娖健V鳈C(jī)SCL接口和SCL總線的狀態(tài)之間保持一致,都為高電平。所有主機(jī)開始計(jì)算它們的高電平周期。第一個(gè)完成高電平周期的主機(jī)再次將SCL線拉低。
這樣,就產(chǎn)生了同步的SCL總線時(shí)鐘,其低周期由具有最長(zhǎng)時(shí)鐘低周期的主機(jī)確定,其高周期由具有最短時(shí)鐘高周期的主機(jī)確定,這樣大家就統(tǒng)一了時(shí)鐘的時(shí)序。
2.3 仲裁過(guò)程
I2C的端口內(nèi)部電路是可以支持回讀的,就是SCL和SDA端口每次輸出電平后,會(huì)立即回讀,用來(lái)判斷自己的輸出是否與總線一致。
具體的仲裁過(guò)程由SCL和SDA一起配合來(lái)完成,SCL負(fù)責(zé)完成時(shí)鐘同步。SDA負(fù)責(zé)數(shù)據(jù)仲裁。
仲裁是在SDA線上按位地進(jìn)行的。當(dāng)SCL為高電平時(shí),每個(gè)主機(jī)各自判斷自己SDA線輸出的電平是否與SDA總線電平一致,如果不一致,則該主機(jī)仲裁失敗,失去對(duì)總線的控制權(quán),需要停止輸出。另一個(gè)主機(jī)贏得仲裁獲取對(duì)總線的控制權(quán),繼續(xù)完成它的數(shù)據(jù)傳輸。
I2C總線仲裁
仲裁失敗的主機(jī)可以在總線空閑時(shí)重新發(fā)起仲裁。但是如果一個(gè)主機(jī)也具有從機(jī)的功能,并且在尋址階段仲裁失敗,則該主機(jī)必須立即切換到從機(jī)模式,便于主機(jī)與其通信。
I2C總線的仲裁有點(diǎn)類似于CAN的沖突檢測(cè)機(jī)制,但是I2C總線的控制是由各個(gè)競(jìng)爭(zhēng)主機(jī)發(fā)送的地址和數(shù)據(jù)決定,它并沒(méi)有CAN ID的優(yōu)先級(jí)概念。
3.I2C總線狀態(tài)
I2C總線有四種狀態(tài):空閑、啟動(dòng)、忙碌、停止。
當(dāng)總線為空閑狀態(tài)時(shí),SDA和SCL兩條線路一定都是高電平。
所有的傳輸通信都是以啟動(dòng)(Start)開始,以停止(Stop)結(jié)束。當(dāng)SCL為高電平時(shí),SDA線上的高電平到低電平轉(zhuǎn)換表示啟動(dòng)條件S。當(dāng)SCL為高電平時(shí),SDA線上的低電平到高電平轉(zhuǎn)換表示停止條件P。
啟動(dòng)條件和停止條件
啟動(dòng)和停止都是由主機(jī)發(fā)起。在啟動(dòng)發(fā)起之后,總線被認(rèn)為是忙碌的。在停止發(fā)起后總線被認(rèn)為是空閑的。
4.SDA數(shù)據(jù)有效性
在串行時(shí)鐘SCL線的高電平期間,SDA線的“高電平”或者“低電平”狀態(tài)必須保持穩(wěn)定,此時(shí)SDA線上穩(wěn)定的“高電平”或“低電平”就是有效數(shù)據(jù)“1”或者“0”。
SDA的數(shù)據(jù)改變,也就是電平狀態(tài)改變,只能在SCL線的低電平期間進(jìn)行。串行時(shí)鐘SCL每產(chǎn)生一個(gè)高電平脈沖,串行數(shù)據(jù)SDA線就傳輸一位有效數(shù)據(jù)。
SDA數(shù)據(jù)在SCL高時(shí)有效
SDA線在SCL線的低電平期間改變數(shù)據(jù)(改變電平),更改完成后,SCL線由低電平變?yōu)楦唠娖讲⒈3址€(wěn)定,此時(shí)SDA線的穩(wěn)定電平就是有效數(shù)據(jù)。
5.數(shù)據(jù)傳輸格式
總線啟動(dòng)后,串行數(shù)據(jù)SDA線上每次傳輸1個(gè)字節(jié)(8位),每個(gè)字節(jié)后必須跟隨1個(gè)應(yīng)答位,可以連續(xù)傳輸多次,即多個(gè)字節(jié)。
數(shù)據(jù)首先從最高有效位(MSB)開始。如果從機(jī)由于內(nèi)部繁忙,無(wú)法立即接收或發(fā)送下一個(gè)字節(jié)的數(shù)據(jù),從機(jī)可以拉低時(shí)鐘線SCL,使主機(jī)進(jìn)入等待狀態(tài),直到從機(jī)做好準(zhǔn)備后,再釋放時(shí)鐘線SCL,繼續(xù)接收或發(fā)送數(shù)據(jù)。
I2C總線數(shù)據(jù)傳輸格式
應(yīng)答(ACK)發(fā)生在每個(gè)字節(jié)之后,是接收器向發(fā)送器發(fā)送的確認(rèn)信號(hào),表示該字節(jié)成功接收。
應(yīng)答信號(hào)是在第9個(gè)應(yīng)答時(shí)鐘脈沖SCL保持高電平期間,發(fā)送器釋放SDA線(高電平),接收器拉低SDA線。主機(jī)或從機(jī)收到ACK應(yīng)答信號(hào)后,可以繼續(xù)進(jìn)行接下來(lái)的傳輸,否則主機(jī)會(huì)中止傳輸或重新啟動(dòng)傳輸。
5.1 從機(jī)地址和R/W位
主機(jī)在啟動(dòng)后,發(fā)送從機(jī)地址,該地址為7位長(zhǎng)度。后面第8位是數(shù)據(jù)傳輸方向位,邏輯“1”代表讀R,邏輯“0”代表寫W,讀表示接下來(lái)的數(shù)據(jù)由從機(jī)發(fā)送給主機(jī),寫表示接下來(lái)的數(shù)據(jù)由主機(jī)發(fā)生給從機(jī)。
數(shù)據(jù)傳輸示例
在傳輸中,讀/寫格式有不同的組合,比如寫數(shù)據(jù)時(shí)主機(jī)發(fā)送器向從機(jī)接收器發(fā)送信號(hào)。傳輸方向不變,從機(jī)接收器確認(rèn)每個(gè)字節(jié)。
主機(jī)向從機(jī)寫數(shù)據(jù)
與寫對(duì)應(yīng)的就是讀數(shù)據(jù),讀數(shù)據(jù)時(shí)主機(jī)在發(fā)送完第一個(gè)目標(biāo)地址字節(jié)后立即讀取從機(jī)。在第1次應(yīng)答(ACK)后,主機(jī)發(fā)送器變成主機(jī)接收器,從機(jī)接收器變成從機(jī)發(fā)送器。
主機(jī)向從機(jī)讀數(shù)據(jù)
這里的第1應(yīng)答是由從機(jī)產(chǎn)生,后續(xù)的應(yīng)答是由主機(jī)產(chǎn)生。停止信號(hào)由主機(jī)產(chǎn)生,主機(jī)在發(fā)起停止信號(hào)之前先給從機(jī)發(fā)送一個(gè)不應(yīng)答(NACK)信號(hào)。
還有一種方式,就是讀和寫的混合模式,在傳輸過(guò)程中改變讀寫方向時(shí),啟動(dòng)信號(hào)和從機(jī)地址都會(huì)重復(fù),R/W位會(huì)反轉(zhuǎn)。如果主機(jī)接收器要發(fā)送重啟信號(hào),它就在重啟之前發(fā)送不應(yīng)答(NACK)。
主機(jī)向從機(jī)讀、寫數(shù)據(jù)
大多數(shù)I2C總線的從機(jī)設(shè)備具有7位從機(jī)地址編碼,所以理論上總線可以連接128個(gè)從機(jī)設(shè)備;為連接更多設(shè)備,I2C規(guī)范又增加了10位地址編碼的從機(jī)設(shè)備,使從機(jī)設(shè)備可以擴(kuò)展到1024個(gè)。
5.2 特殊保留地址
地址編碼中除了用于表示每個(gè)芯片的目標(biāo)地址,還有8個(gè)特殊地址編碼,作為特殊保留地址。
特殊保留地址
我們主要介紹下其中的廣播地址,廣播呼叫地址(0000 0000)用于主機(jī)同時(shí)尋址連接到I2C總線的所有從機(jī)。
主機(jī)啟動(dòng)I2C總線后,第一字節(jié)首先發(fā)送廣播呼叫地址(0000 0000),如果某些從機(jī)不需要被呼叫尋址,它可以通過(guò)不應(yīng)答(NACK)來(lái)忽略這個(gè)地址。如果某些設(shè)備確實(shí)需要傳輸數(shù)據(jù),它就發(fā)送應(yīng)答(ACK)信號(hào)來(lái)確認(rèn)這個(gè)地址并作為一個(gè)從機(jī)接收器。如果一個(gè)或多個(gè)從機(jī)做出應(yīng)答響應(yīng),主機(jī)實(shí)際上并不知道有多少?gòu)臋C(jī)進(jìn)行了應(yīng)答。第二個(gè)字節(jié)及以后的字節(jié)由每個(gè)能夠處理該數(shù)據(jù)的從機(jī)接收器接收并確認(rèn)。不能處理這些字節(jié)的從機(jī)可以通過(guò)不應(yīng)答(NACK)來(lái)忽略它。
廣播呼叫地址格式
主機(jī)發(fā)送的第2個(gè)字節(jié)是控制地址,是表示呼叫目的和含義的字節(jié),其具體含義如下
當(dāng)?shù)?字節(jié)第8位B=0時(shí),常使用兩種控制地址:
1.控制地址=0000 0110(06h):從機(jī)復(fù)位和寫數(shù)據(jù)到從機(jī)內(nèi)部存儲(chǔ)空間。從機(jī)接收到第一字節(jié)和本字節(jié)后,被尋址的所有從機(jī)復(fù)位,并接收主機(jī)接下來(lái)發(fā)送的數(shù)據(jù),存入自己內(nèi)部存儲(chǔ)空間。
2.控制地址=0000 0100(04h):寫數(shù)據(jù)到從機(jī)內(nèi)部存儲(chǔ)空間。過(guò)程如上,但不會(huì)復(fù)位硬件。
當(dāng)?shù)?字節(jié)的第8位B=1時(shí),前7位表示主機(jī)自己的地址,這中廣播地址表示“硬件廣播”。
廣播呼叫地址第2字節(jié)第8位B=1
從機(jī)接收到第1字節(jié)和控制地址后,被尋址的所有從機(jī)將第2字節(jié)的前7位標(biāo)識(shí)備案為主機(jī)的地址。這個(gè)地址的作用就是向所有設(shè)備發(fā)送自身的設(shè)備地址。
6.小結(jié)
I2C是一種串行、高速的半雙工通信總線,它只用SCL和SDA兩根線就可以實(shí)現(xiàn)控制時(shí)鐘信號(hào)和數(shù)據(jù)信號(hào)的傳輸。I2C雖然與SPI都是主從模式,但它可以允許多主模式,通過(guò)時(shí)鐘同步、回讀檢測(cè)和仲裁可以防止總線錯(cuò)誤和沖突!
-
芯片
+關(guān)注
關(guān)注
456文章
51004瀏覽量
425207 -
接口
+關(guān)注
關(guān)注
33文章
8661瀏覽量
151480 -
總線
+關(guān)注
關(guān)注
10文章
2893瀏覽量
88211 -
I2C
+關(guān)注
關(guān)注
28文章
1491瀏覽量
124080 -
SPI總線
+關(guān)注
關(guān)注
4文章
103瀏覽量
27615
原文標(biāo)題:I2C與SPI總線有什么區(qū)別?
文章出處:【微信號(hào):Rocker-IC,微信公眾號(hào):路科驗(yàn)證】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論