常識 兩條匯流排線路:串列數據匯流排SDA,串列時鐘匯流排SCL 每個連接到匯流排的器件都有唯一的地址供其他設備定址 每個連接到匯流排的器件都可以作為發送器和接收器 是多主機匯流排,如果兩個或更多主機同時初始化,數據傳輸可以通過重提檢測和仲裁防止數據被破壞 串列的8bit雙向數據傳輸位速率在標準模式下可達100 ...
常識
- 兩條匯流排線路:串列數據匯流排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,通信就可以繼續了。