I2C总线协议详解(特点、通信过程、典型I2C时序)
目錄
1、I2C總線簡介
2、通信過程
3、尋址方式
4、起始信號和停止信號
5、?字節傳送與應答
?6、同步數據信號
?7、時鐘同步與仲裁
(1)時鐘同步
(2)仲裁
8、典型I2C時序
?(1)主機向從機發送數據
?(2)從機向主機發送數據
?(3)主機先向從機發送數據,然后從機再向主機發送數據
1、I2C總線簡介
I2C總線是Philips公司在八十年代初推出的一種串行、半雙工的總線,主要用于近距離、低速的芯片之間的通信;I2C總線有兩根雙向的信號線,一根數據線SDA用于收發數據,一根時鐘線SCL用于通信雙方時鐘的同步;I2C總線硬件結構簡單,簡化了PCB布線,降低了系統成本,提高了系統可靠性,因此在各個領域得到了廣泛應用。
I2C總線是一種多主機總線,連接在 I2C總線上的器件分為主機和從機。主機有權發起和結束一次通信,從機只能被動呼叫;當總線上有多個主機同時啟用總線時,I2C也具備沖突檢測和仲裁的功能來防止錯誤產生;每個連接到I2C總線上的器件都有一個唯一的地址(7bit),且每個器件都可以作為主機也可以作為從機(但同一時刻只能有一個主機),總線上的器件增加和刪除不影響其他器件正常工作;I2C總線在通信時總線上發送數據的器件為發送器,接收數據的器件為接收器。
I2C總線可以通過外部連線進行在線檢測,便于系統故障診斷和調試,故障可以立即被尋址,軟件也有利于標準化和模塊化,縮短開發時間。
I2C總線上可掛接的設備數量受總線的最大電容400pF限制。
串行的8位雙向數據傳輸速率在標準模式下可達100Kbit/s,快速模式下可達400Kbit/s,高速模式下可達3.4Mbit/s。
總線具有極低的電流消耗,抗噪聲干擾能力強,增加總線驅動器可以使總線電容擴大10倍,傳輸距離達到15m;兼容不同電壓等級的器件,工作溫度范圍寬。
2、通信過程
第4步和第5步用的是發送器和接收器,不是主機和從機,這是由第一個字節的最后一位決定主給從發,還是從給主發。
也就是說,第一個字節和最后的停止信號一定是主機發給從機,但中間就不一定了。
發送數據過程中不允許改變發送方向(除非重啟一次通信,詳見后文典型I2C時序(3)部分)。
3、尋址方式
I2C總線上傳送的數據是廣義的,既包括地址,又包括真正的數據。
主機在發送起始信號后必須先發送一個字節的數據,該數據的高7位為從機地址,最低位表示后續字節的傳送方向,‘0’表示主機發送數據給->從機,‘1’表示從機發送數據給->主機。
總線上所有的從機接收到該字節數據后都將這7位地址與自己的地址進行比較,如果相同,則認為自己被主機尋址,然后再根據第8位將自己定為發送器或接收器。
4、起始信號和停止信號
SCL為高電平時,SDA由高變低表示起始信號;
SCL為高電平時,SDA由低變高表示停止信號;
起始信號和停止信號都是由主機發出,起始信號產生后總線處于占用狀態,停止信號產生后總線被釋放,處于空閑狀態。
空閑時,SCL與SDA都是高電平。
?停止情況有兩種:
5、?字節傳送與應答
I2C總線通信時每個字節為8位長度,數據傳送時,先傳送最高位,后傳送低位,發送器發送完一個字節數據后接收器必須發送1位應答位來回應發送器,即一幀共有9位。
I2C每次發送數據必須是8位。
MSB固定,先發高位,再發低位。
?6、同步數據信號
I2C總線在進行數據傳送時,時鐘線SCL為低電平期間發送器向數據線上發送一位數據,在此期間數據線上的信號允許發生變化,時鐘線SCL為高電平期間接收器從數據線上讀取一位數據,在此期間數據線上的信號不允許發生變化,必須保持穩定。
?7、時鐘同步與仲裁
(1)時鐘同步
時鐘同步是通過I2C總線上的SCL之間的線“與”(wire-AND)來完成的,即如果有多個主機同時產生時鐘,那么只有所有master都發送高電平時,SCL上才表現為高電平,否則SCL都表現為低電平。
線“與”特性由開漏電路實現。如果控制開漏輸出INT為0,低電平,則VGS >0,N-MOS管導通,使輸出接地,若控制開漏輸出INT為1 (它無法直接輸出高電平) 時,則N-MOS 管關閉,所以引腳既不輸出高電平,也不輸出低電平,為高阻態。正常使用時必須外部接上拉電阻。也就是說,若有很多個開漏模式引腳(C1、C2....)連接到一起時,只有當所有引腳都輸出高阻態,才由上拉電阻提供高電平,此高電平的電壓為外部上拉電阻所接的電源的電壓。若其中一個引腳為低電平,那線路就相當于短路接地,使得整條線路都為低電平,0 伏。
(2)仲裁
總線仲裁與時鐘同步類似,當所有主機在SDA上都寫1時,SDA的數據才是1,只要有一個主機寫0,那此時SDA上的數據就是0.
一個主機每發送一個bit數據,在SCL為高電平時,就檢查SDA的電平是否和發送的數據一致,如果不一致,這個主機便知道自己輸掉了仲裁,然后停止向SDA寫數據。也就是說,如果主機一致檢查到總線上數據和自己發送的數據一致,則繼續傳輸,這樣在仲裁過程中就保證了贏得仲裁的master不會丟失數據。
輸掉仲裁的主機在檢測到自己輸了之后也就不再產生時鐘脈沖,并且要在總線空閑時才能重新傳輸。
仲裁的過程可能要經過多個bit的發送和檢查,實際上兩個主機如果發送的時序和數據完全一樣,則兩個主機都能正常完成整個數據傳輸。
注意:多個主機仲裁時,因為線“與”特性,誰低誰能強制SDA為低,也就是跟自己匹配,所以先高(高電平1)的那個就會仲裁失敗。
8、典型I2C時序
(1)主機向從機發送數據
?(2)從機向主機發送數據
(3)主機先向從機發送數據,然后從機再向主機發送數據
注:S:起始信號,A:應答信號,A非表示非應答,P:終止信號,
陰影部分表示數據由主機向從機傳送,無陰影部分表示從機向主機發送數據。
數據傳輸中間如果想轉換發送方向,不用發P停止信號,就不會釋放總線,直接再發起始信號。
怎么發起始信號,怎么發停止信號,這些都不用關心,由I2C控制器完成,我們使用的時候只需要正確配置控制器相應的寄存器就可以了。
參考學習視頻:
https://www.bilibili.com/video/BV1WK4y1o7rd?p=7
https://www.bilibili.com/video/BV1264y1y7oX?from=search&seid=4461481906739954380&spm_id_from=333.337.0.0
總結
以上是生活随笔為你收集整理的I2C总线协议详解(特点、通信过程、典型I2C时序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 背后的故事之 - 快乐的Lambda表达
- 下一篇: 2009最经典名句