轉自:http://blog.csdn.net/w89436838/article/details/38660631編程
I2C 總線在物理鏈接上很是簡單,分別由SDA(串行數據線)和SCL(串行時鐘線)及上拉電阻組成。通訊原理是經過對SCL和SDA線高低電平時序的控制,來產生I2C總線協議所須要的信號進行數據的傳遞。在總線空閒狀態時,這兩根線通常被上面所接的上拉電阻拉高,保持着高電平。spa
I2C通訊方式爲半雙工,只有一根SDA線,同一時間只能夠單向通訊,485也爲半雙工,SPI和uart爲雙工。.net
I2C總線上的每個設備均可以做爲主設備或者從設備,並且每個設備都會對應一個惟一的地址(地址經過物理接地或者拉高,能夠從I2C器件的數據手冊得知,如TVP5158芯片,7位地址依次bit6~bit0:x101 1xxx, 最低三位可配,若是所有物理接地,則該設備地址爲0x58, 而之因此7bit由於1個bit要表明方向,主向從和從向主),主從設備之間就經過這個地址來肯定與哪一個器件進行通訊,在一般的應用中,咱們把CPU帶I2C總線接口的模塊做爲主設備,把掛接在總線上的其餘設備都做爲從設備。
I2C總線上可掛接的設備數量受總線的最大電容400pF 限制,若是所掛接的是相同型號的器件,則還受器件地址位的限制。
I2C總線數據傳輸速率在標準模式下可達100kbit/s,快速模式下可達400kbit/s,高速模式下可達3.4Mbit/s。通常經過I2C總線接口可編程時鐘來實現傳輸速率的調整,同時也跟所接的上拉電阻的阻值有關。
I2C總線上的主設備與從設備之間以字節(8位)爲單位進行雙向的數據傳輸。3d
I2C協議規定,總線上數據的傳輸必須以一個起始信號做爲開始條件,以一個結束信號做爲傳輸的中止條件。起始和結束信號老是由主設備產生(意味着從設備不能夠主動通訊?全部的通訊都是主設備發起的,主能夠發出詢問的command,而後等待從設備的通訊)。blog
起始和結束信號產生條件:總線在空閒狀態時,SCL和SDA都保持着高電平,當SCL爲高電平而SDA由高到低的跳變,表示產生一個起始條件;當SCL爲高而SDA由低到高的跳變,表示產生一箇中止條件。接口
在起始條件產生後,總線處於忙狀態,由本次數據傳輸的主從設備獨佔,其餘I2C器件沒法訪問總線;而在中止條件產生後,本次數據傳輸的主從設備將釋放總線,總線再次處於空閒狀態。起始和結束如圖所示:
get
在瞭解起始條件和中止條件後,咱們再來看看在這個過程當中數據的傳輸是如何進行的。前面咱們已經提到過,數據傳輸以字節爲單位。主設備在SCL線上產生每一個時鐘脈衝的過程當中將在SDA線上傳輸一個數據位,當一個字節按數據位從高位到低位的順序傳輸完後,緊接着從設備將拉低SDA線,回傳給主設備一個應答位, 此時才認爲一個字節真正的被傳輸完成。固然,並非全部的字節傳輸都必須有一個應答位,好比:當從設備不能再接收主設備發送的數據時,從設備將回傳一個否 定應答位。數據傳輸的過程如圖所示:
在前面咱們還提到過,I2C總線上的每個設備都對應一個惟一的地址,主從設備之間的數據傳輸是創建在地址的基礎上,也就是說,主設備在傳輸有效數據以前要先指定從設備的地址,地址指定的過程和上面數據傳輸的過程同樣,只不過大多數從設備的地址是7位的,而後協議規定再給地址添加一個最低位用來表示接下來數據傳輸的方向,0表示主設備向從設備寫數據,1表示主設備向從設備讀數據。向指定設備發送數據的格式如圖所示:(每一最小包數據由9bit組成,8bit內容+1bit ACK, 若是是地址數據,則8bit包含1bit方向)
it
下圖是完整的一幀I2C數據:效率
對I2C總線的操做實際就是主從設備之間的讀寫操做。大體可分爲如下三種操做狀況:基礎
第三種操做在單個主設備系統中,重複的開啓起始條件機制要比用STOP終止傳輸後又再次開啓總線更有效率。