通信的起始條件和終止條件都必須在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,通信就可以繼續了。