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