歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

I2C基礎知識

常識

  • 兩條總線線路:串行數據總線SDA,串行時鐘總線SCL
  • 每個連接到總線的器件都有唯一的地址供其他設備尋址
  • 每個連接到總線的器件都可以作為發送器和接收器
  • 是多主機總線,如果兩個或更多主機同時初始化,數據傳輸可以通過重提檢測和仲裁防止數據被破壞
  • 串行的8bit雙向數據傳輸位速率在標准模式下可達100kbit/s,快速模式下可達400kbit/s,高速模式下可達3.4Mbit/s
  • 連接到相同總線的I2C數量只受到總線的最大電容400pF的限制
  • I2C通信的數據以8bit為單位,每次發送完一個數據都要等待接收方的ACK信號

術語

  • 發送器:發送數據到總線的器件
  • 接收器:從總線接收數據的器件
  • 主機:發送起始/終止信號和時鐘信號的器件
  • 從機:被主機尋址的器件
  • 仲裁 :是一個在有多個主機同時嘗試控制總線但只允許其中一個控制總線並使傳輸不被破壞的過程
  • 同步:兩個或多個器件同步時鐘信號的過程
  • SDA:數據線通信期間,SDA的電平改變只能發生在SCL在低電平期間
  • SCL:時鐘線

起始與終止

通信的起始條件和終止條件都必須在SCL是高電平的時候被觸發,SCL為高SDA由高->低為起始條件(S,start),SCL為高SDA由低->高為終止條件(P,stop)
正是因為正常通信的過程中如果SCL是高電平,SDA不允許改變,所以這兩種情況可以用來標識S和P

總線在start後被認為處於忙碌狀態,在stop的某段時間後總線被認為再次處於空閒狀態
除了S作為起始信號,I2C還有重啟信號Sr,如果在處於忙碌狀態的總線中發送Sr(restart)而不產生P(stop),總線會一直處於忙碌的狀態。Sr的作用是保證一個主機不間斷的占用總線,它既是前一次數據傳輸的結束,又是後一次數據傳輸的開始,可以用來保證一台主機不間斷的掌控總線。eg:主機發送了讀請求之後,從機進行了應答,接下來還有隨之而來的寫請求,為了主機的讀寫操作能連貫的執行完畢再釋放總線,此時就需要Sr來保證該主機不間斷掌控總線,因為一旦在讀之後發出停止信號,總線就有可能被其他主機掌管,該主機的寫操作就會被延遲。

尋址


主機首先檢測總線是否處於空閒狀態,如果空閒就首先發送一個從機地址(MSB)+控制位(LSB)。7位尋址的話就是1111 XXX,高4位屬於固定地址不可改變,如果器件沒有CPU,則由廠家固化,有CPU的話就由器件的初始化代碼指定(注意不能和總線上其他器件的地址重疊),低3位為引腳設定地址,可以由外部引腳來設定(並非所有器件都可以設定)。控制位即0表示主機會寫W信息到從機,1表示從從機中讀R數據。和其他數據一樣,主機發完這個byte繼續產生一個時鐘周期,並釋放SDA為高阻態(I2C的SDA和SCL都需要上拉電阻保持高阻態),等待從機的ACK信號。

應答

一個主機設備發送了希望讀寫的設備地址到總線之後,總線上的所有器件都會收到一個主機發送的地址並與自身比對,如果與自身的地址相同,表示自己就是主機打算通信的對象。接下來從機可以有三種行為:ACK,NACK,拉低SCL。
ACK就是從機在第9個時鐘周期將SDA電平拉低,表示從機成功的接收了剛才的8bit數據,主機收到了從機的ACK信號就可以繼續發數據,或者准備好接收從機的數據。

NACK就是從機在第9個時鐘周期不響應,表示從機沒有成功的接收到剛才的8bit,主機接收到這個信號就可以發送Sr或采取其他行為。如果最後一次通信中主機是接收方,主機就會回應一個NACK信號(不響應)通知從機表示通信結束,並發送P或Sr。

如果從機沒有准備好應答,就可以將SCL鉗位在低電平,這樣就可以使主機進入等待狀態,直到從機准備就緒接收接下來的數據再釋放SCL,通信就可以繼續了。

Copyright © Linux教程網 All Rights Reserved