一、什么是I2C協(xié)議 ? ? ?
I2C協(xié)議是一個(gè)允許一主多從進(jìn)行通訊的協(xié)議。它就像串行外設接口(SPI)一樣,只能用于短距離通信。又像異步串行接口(如RS232或UART), 只需要兩根信號線(xiàn)來(lái)交換信息。
實(shí)現I2C需要兩根信號線(xiàn)完成信息交換,SCL時(shí)鐘信號線(xiàn),SDA數據輸入/輸出線(xiàn)。它屬于同步通信,由于輸入輸出數據均使用一根線(xiàn),因此通信方向為半雙工。
總結:短距離、一主多從、半雙工、兩根線(xiàn)、同步通訊
二、名詞解釋 ? ? ?
什么是半雙工呢?什么是同步通訊?什么是異步通訊?
1 什么是半雙工?
數據通信中,數據在線(xiàn)路上的傳送方式可以分為單工通信、半雙工通信和全雙工通信三種。
單工通信:是指消息只能單方向傳輸的工作方式。例如遙控、遙測(一部分),就是單工通信方式。單工通信信道是單向信道,發(fā)送端只能發(fā)送信息,不能接收信息;接收端只能接收信息,不能發(fā)送信息。
半雙工:是指數據可以沿兩個(gè)方向傳送,但同一時(shí)刻一個(gè)信道只允許單方向傳送,因此又被稱(chēng)為雙向交替通信。半雙工方式要求收發(fā)兩端都有發(fā)送和接收能力。由于這種方式要頻繁變換信道方向,故效率低,但可以節約傳輸線(xiàn)路。
全雙工:是指在通信的任意時(shí)刻,線(xiàn)路上可以同時(shí)存在A(yíng)到B和B到A的雙向信號傳輸。在全雙工方式下,通信系統的每一端都設置了發(fā)送器和接收器,因此,能控制數據同時(shí)在兩個(gè)方向上傳送。全雙工方式無(wú)需進(jìn)行方向的切換,因此,沒(méi)有切換操作所產(chǎn)生的時(shí)間延遲,這對那些不能有時(shí)間延誤的交互式應用(例如遠程監測和控制系統)十分有利。比如,電話(huà)機則是一種全雙工設備,其通話(huà)雙方可以同時(shí)進(jìn)行對話(huà)。
2.2 什么是同步通訊
同步通信:發(fā)送端在發(fā)送串行數據的同時(shí),提供一個(gè)時(shí)鐘信號,并按照一定的約定(例如:在時(shí)鐘信號的上升沿的時(shí)候,將數據發(fā)送出去)發(fā)送數據,接收端根據發(fā)送端提供的時(shí)鐘信號,以及大家的約定,接收數據。如:I2C、SPI等有時(shí)鐘信號的協(xié)議,都屬于這種通信方式。
異步通信:接收方并不知道數據什么時(shí)候會(huì )到達,收發(fā)雙方可以有各自自己的時(shí)鐘。發(fā)送方發(fā)送的時(shí)間間隔可以不均,接收方是在數據的起始位和停止位的幫助下實(shí)現信息同步的。這種傳輸通常是很小的分組,比如:一個(gè)字符為一組,數據組配備起始位和結束位。所以這種傳輸方式的效率是比較低的,因為額外加入了很多的輔助位作為負載,常用在低速的傳輸中。
同步通信與異步通信區別:
(1)同步通信要求接收端時(shí)鐘頻率和發(fā)送端時(shí)鐘頻率一致,發(fā)送端發(fā)送連續的比特流;異步通信時(shí)不要求接收端時(shí)鐘和發(fā)送端時(shí)鐘同步,發(fā)送端發(fā)送完一個(gè)字節后,可經(jīng)過(guò)任意長(cháng)的時(shí)間間隔再發(fā)送下一個(gè)字節。
(2)同步通信效率高,異步通信效率較低。
(3)同步通信較復雜,雙方時(shí)鐘的允許誤差較??;異步通信簡(jiǎn)單,雙方時(shí)鐘可允許一定誤差。
(4)同步通信可用于點(diǎn)對多點(diǎn);異步通信只適用于點(diǎn)對點(diǎn)。
三、I2C的功能特點(diǎn) ? ? ?
I2C最重要的功能包括:
只需要兩條總線(xiàn);
沒(méi)有嚴格的波特率要求,例如使用RS232,主設備生成總線(xiàn)時(shí)鐘;
所有組件之間都存在簡(jiǎn)單的主/從關(guān)系,連接到總線(xiàn)的每個(gè)設備均可通過(guò)唯一地址進(jìn)行軟件尋址;
I2C是真正的多主設備總線(xiàn),可提供仲裁和沖突檢測;
傳輸速度:
標準模式:Standard Mode = 100 Kbps
快速模式:Fast Mode = 400 Kbps
高速模式:High speed mode = 3.4 Mbps
超快速模式:Ultra fast mode = 5 Mbps
最大主設備數:無(wú)限制;
最大從機數:理論上是127;
四、I2C的高阻態(tài) ? ? ?
漏極開(kāi)路(Open Drain)即高阻狀態(tài),適用于輸入/輸出,其可獨立輸入/輸出低電平和高阻狀態(tài),若需要產(chǎn)生高電平,則需使用外部上拉電阻
高阻狀態(tài):高阻狀態(tài)是三態(tài)門(mén)電路的一種狀態(tài)。邏輯門(mén)的輸出除有高、低電平兩種狀態(tài)外,還有第三種狀態(tài)——高阻狀態(tài)的門(mén)電路。電路分析時(shí)高阻態(tài)可做開(kāi)路理解。
我們知道IIC的所有設備是接在一根總線(xiàn)上的,那么我們進(jìn)行通信的時(shí)候往往只是幾個(gè)設備進(jìn)行通信,那么這時(shí)候其余的空閑設備可能會(huì )受到總線(xiàn)干擾,或者干擾到總線(xiàn),怎么辦呢?
為了避免總線(xiàn)信號的混亂,IIC的空閑狀態(tài)只能有外部上拉, 而此時(shí)空閑設備被拉到了高阻態(tài),也就是相當于斷路, 整個(gè)IIC總線(xiàn)只有開(kāi)啟了的設備才會(huì )正常進(jìn)行通信,而不會(huì )干擾到其他設備。
五、數據傳輸協(xié)議 ? ? ? 主設備和從設備進(jìn)行數據傳輸時(shí)遵循以下協(xié)議格式。數據通過(guò)一條SDA數據線(xiàn)在主設備和從設備之間傳輸0和1的串行數據。串行數據序列的結構可以分為:
1 起始位
當主設備決定開(kāi)始通訊時(shí),需要發(fā)送開(kāi)始信號,并且執行以下過(guò)程:
將SDA線(xiàn)由高電平切換成低電平;
將SCL線(xiàn)由高電平切換成低電平;
在主設備發(fā)送開(kāi)始條件信號之后,所有從機即使處于睡眠模式也將變?yōu)榛顒?dòng)狀態(tài),并等待接收地址位。
2 地址位
地址位支持7bit、10bit,主設備如果需要向從機發(fā)送/接收數據,首先要發(fā)送對應從機的地址,然后會(huì )匹配總線(xiàn)上掛載的從機的地址,故地址為主要用來(lái)辨識不同設備。
地址位由主機發(fā)送,從設備負責接受并識別該地址是否位自己地址。
3 讀寫(xiě)位
由于I2C是半雙工通訊,所以設備需要確定數據傳輸的方向,故引入了讀寫(xiě)位。
如果主設備需要將數據發(fā)送到從設備,則該位設置為 0;
如果主設備需要往從設備接收數據,則將其設置為 1 ;
讀寫(xiě)位由主機發(fā)送;1表示讀操作,0表示寫(xiě)操作。
4 應答位
I2C最大的一個(gè)特點(diǎn)就是有完善的應答機制,從機接收到主機的數據時(shí),會(huì )回復一個(gè)應答信號來(lái)通知主機表示“我收到了”。
應答信號:出現在1個(gè)字節傳輸完成之后,即第9個(gè)SCL時(shí)鐘周期內,此時(shí)主機需要釋放SDA總線(xiàn),把總線(xiàn)控制權交給從機,由于上拉電阻的作用,此時(shí)總線(xiàn)為高電平,如果從機正確的收到了主機發(fā)來(lái)的數據,會(huì )把SDA拉低,表示應答響應。
非應答信號:當第9個(gè)SCL時(shí)鐘周期時(shí),SDA保持高電平,表示非應答信號。
非應答信號可能是主機產(chǎn)生也可能是從機產(chǎn)生,產(chǎn)生非應答信號的情況主要有以下幾種:
I2C總線(xiàn)上沒(méi)有主機所指定地址的從機設備;
從機正在執行一些操作,處于忙狀態(tài),還沒(méi)有準備好與主機通訊;
主機發(fā)送的一些控制命令,從機不支持;
主機接收從機數據時(shí),主機產(chǎn)生非應答信號,通知從機數據傳輸結束,不要再發(fā)數據了;
5 數據位
I2C數據總線(xiàn)傳輸要保證在SCL為高電平時(shí),SDA數據穩定,所以SDA上數據變化只能在SCL為低電平時(shí)
一次傳輸的數據總共有8位,由發(fā)送方設置,它需要將數據位傳輸到接收方。
發(fā)送之后會(huì )緊跟一個(gè)ACK / NACK位,如果接收器成功接收到數據,則從機發(fā)送ACK。否則,從機發(fā)送NACK。
數據可以重復發(fā)送多個(gè),直到接收到停止位為止。
6 停止位
當主設備決定結束通訊時(shí),需要發(fā)送結束信號,需要執行以下動(dòng)作:
先將SDA線(xiàn)從低電壓電平切換到高電壓電平;
再將SCL線(xiàn)從高電平拉到低電平;
總結,寫(xiě)寄存器的標準流程為:
1. Master發(fā)起START
2. Master發(fā)送I2C addr(7bit)和w操作0(1bit),等待ACK
3. Slave發(fā)送ACK
4. Master發(fā)送reg addr(8bit),等待ACK
5. Slave發(fā)送ACK
6. Master發(fā)送data(8bit),即要寫(xiě)入寄存器中的數據,等待ACK
7. Slave發(fā)送ACK
8. 第6步和第7步可以重復多次,即順序寫(xiě)多個(gè)寄存器
9. Master發(fā)起STOP
讀寄存器的標準流程為:
1. Master發(fā)送I2C addr(7bit)和w操作1(1bit),等待ACK
2. Slave發(fā)送ACK
3. Master發(fā)送reg addr(8bit),等待ACK
4. Slave發(fā)送ACK
5. Master發(fā)起START
6. Master發(fā)送I2C addr(7bit)和r操作1(1bit),等待ACK
7. Slave發(fā)送ACK
8. Slave發(fā)送data(8bit),即寄存器里的值
9. Master發(fā)送ACK
10. 第8步和第9步可以重復多次,即順序讀多個(gè)寄存器
六、仲裁機制 ? ? ?
在多主的通信系統中??偩€(xiàn)上有多個(gè)節點(diǎn),它們都有自己的尋址地址,可以作為從節點(diǎn)被別的節點(diǎn)訪(fǎng)問(wèn),同時(shí)它們都可以作為主節點(diǎn)向其他的節點(diǎn)發(fā)送控制字節和傳送數據。
但是如果有兩個(gè)或兩個(gè)以上的節點(diǎn)都向總線(xiàn)上發(fā)送啟動(dòng)信號并開(kāi)始傳送數據,這樣就形成了沖突。要解決這種沖突,就要進(jìn)行仲裁的判決,這就是I2C總線(xiàn)上的仲裁。
I2C總線(xiàn)上的仲裁分兩部分:SCL線(xiàn)的同步和SDA線(xiàn)的仲裁。
1 SCL線(xiàn)的同步
SCL同步是由于總線(xiàn)具有線(xiàn) “與” 的邏輯功能(開(kāi)漏輸出),即只要有一個(gè)節點(diǎn)發(fā)送低電平時(shí),總線(xiàn)上就表現為低電平。當所有的節點(diǎn)都發(fā)送高電平時(shí),總線(xiàn)才能表現為高電平。正是由于線(xiàn)“與”邏輯功能的原理,當多個(gè)節點(diǎn)同時(shí)發(fā)送時(shí)鐘信號時(shí),在總線(xiàn)上表現的是統一的時(shí)鐘信號,這就是SCL的同步原理。
2 SDA線(xiàn)的仲裁
總線(xiàn)仲裁是為了解決多設備同時(shí)競爭中線(xiàn)控制權的問(wèn)題,通過(guò)一定的裸機來(lái)決定哪個(gè)設備能夠獲得最終的總線(xiàn)控制權。
SDA線(xiàn)的仲裁也是建立在總線(xiàn)具有線(xiàn)與邏輯功能的原理上的。節點(diǎn)在發(fā)送1位數據后,比較總線(xiàn)上所呈現的數據與自己發(fā)送的是否一致(類(lèi)似于CAN總線(xiàn)的回讀機制)。
是,繼續發(fā)送;
否則,退出競爭;
I2C總線(xiàn)的控制邏輯:低電平優(yōu)先
SDA線(xiàn)的仲裁可以保證I2C總線(xiàn)系統在多個(gè)主節點(diǎn)同時(shí)企圖控制總線(xiàn)時(shí)通信正常進(jìn)行并且數據不丟失,總線(xiàn)系統通過(guò)仲裁只允許一個(gè)主節點(diǎn)可以繼續占據總線(xiàn)。
上圖過(guò)程分析:
第一個(gè)周期:所有設備發(fā)送1,做與運算后的結果為1,與自己發(fā)送的數據相同,繼續發(fā)送;
第二個(gè)周期:所有設備發(fā)送1,做與運算后的結果為1,與自己發(fā)送的數據相同,繼續發(fā)送;
第三個(gè)周期:所有設備發(fā)送0,做與運算后的結果為0,與自己發(fā)送的數據相同,繼續發(fā)送;
第四個(gè)周期:AB設備發(fā)送1,C設備發(fā)送0,做與運算后結果為0,與AB發(fā)送的數據不同,則AB退出競爭,節點(diǎn)C獲勝;
注:若AB兩個(gè)設備發(fā)送0,C設備發(fā)送1,這最后與運算結果為0,與AB數據格式相同,與C數據格式不同,則C退出,AB繼續發(fā)送,直至AB中有一個(gè)退出。
SDA仲裁和SCL時(shí)鐘同步處理過(guò)程沒(méi)有先后關(guān)系,而是同時(shí)進(jìn)行的。
七、I2C死鎖 ? ? ?
在實(shí)際使用過(guò)程中,I2C比較容易出現的一個(gè)問(wèn)題就是死鎖 ,死鎖在I2C中主要表現為:I2C死鎖時(shí)表現為SCL為高,SDA一直為低。
在I2C主設備進(jìn)行讀寫(xiě)操作的過(guò)程中,主設備在開(kāi)始信號后控制SCL產(chǎn)生8個(gè)時(shí)鐘脈沖,然后拉低SCL信號為低電平,在這個(gè)時(shí)候,從設備輸出應答信號,將SDA信號拉為低電平。
如果這個(gè)時(shí)候主設備異常復位,SCL就會(huì )被釋放為高電平。此時(shí),如果從設備沒(méi)有復位,就會(huì )繼續I2C的應答,將SDA一直拉為低電平,直到SCL變?yōu)榈碗娖?,才?huì )結束應答信號。
而對于I2C主設備來(lái)說(shuō),復位后檢測SCL和SDA信號,如果發(fā)現SDA信號為低電平,則會(huì )認為I2C總線(xiàn)被占用,會(huì )一直等待SCL和SDA信號變?yōu)楦唠娖健?/p>
這樣,I2C主設備等待從設備釋放SDA信號,而同時(shí)I2C從設備又在等待主設備將SCL信號拉低以釋放應答信號,兩者相互等待,I2C總線(xiàn)進(jìn)人一種死鎖狀態(tài)。
同樣,當I2C進(jìn)行讀操作,I2C從設備應答后輸出數據,如果在這個(gè)時(shí)刻I2C主設備異常復位而此時(shí)I2C從設備輸出的數據位正好為0,也會(huì )導致I2C總線(xiàn)進(jìn)入死鎖狀態(tài)。
審核編輯:黃飛
?
評論
查看更多