I2C 總線內部使用漏極開路輸出驅動器,因此 SDA和 SCL 可以被拉低為低電平,但是不能被驅動為高電平,所以每條線上都要使用一個上拉電阻,默認情況下將其保持在高電平。
根據數據手冊來看參數:
·灌電流最大值為3mA;
·低電平輸出電壓設置了最大值為0.4V。
所以根據上述公式可以計算,對于5V的電源,每個上拉電阻阻值至少1.53kΩ,而對于3.3V的電源,每個電阻阻值至少967Ω。可以算出基本的上拉電阻阻值范圍,根據驅動能力大小,選擇合適的上拉電阻。
正常情況下,一個完整的I2C通信過程有如下步驟:
第1步:起始條件主設備通過將SDA線從高電平切換到低電平,再將SCL線從高電平切換到低電平,來向每個連接的從機發(fā)送啟動條件。
第2步:發(fā)送從設備地址主設備向每個從機發(fā)送要與之通信的從機的7位或10位地址,以及相應的讀/寫位。
第3步:接收應答每個從設備將主設備發(fā)送的地址與其自己的地址進行比較。如果地址匹配,則從設備通過將SDA線拉低一位以表示返回一個ACK位。如果來自主設備的地址與從機自身的地址不匹配,則從設備將SDA線拉高,表示返回一個NACK位。
第4步:收發(fā)數據主設備發(fā)送或接收數據到從設備。
第5步:接收應答在傳輸完每個數據幀后,接收設備將另一個ACK位返回給發(fā)送方,以確認已成功接收到該幀。
第6步:停止通信為了停止數據傳輸,主設備將SCL切換為高電平,然后再將SDA切換為高電平,從而向從機發(fā)送停止條件I2C單個主設備連接多個從機。
使用7位地址可提供128 (2的7次方)個唯一地址。使用10位地址很罕見,但可提供1024 (2的10次方)個唯一地址。
要將多個節(jié)點連接到單個主器件多個主設備可以連接到一個或多個從機。當兩個主設備試圖通過SDA線路同時發(fā)送或接收數據時,同一系統(tǒng)中的多個主設備就會出現問題。為了解決這個問題,每個主設備都需要在發(fā)送消息之前檢測SDA線是低電平還是高電平;如果SDA線為低電平,則意味著另一個主設備可以控制總線,并且主設備應等待發(fā)送消息;如果SDA線為高電平,則可以安全地發(fā)送消息。
小結:
1.I2C上拉電阻要看實際情況去選擇合適的阻值,I2C需要上拉電阻的原因是什么(在大多數情況下,由于I2C接口采用Open Drain(開漏)機制,器件本身只能輸出低電平,無法主動輸出高電平,只能通過外部上拉電阻RP將信號線拉至高電平。因此I2C總線上的上拉電阻是必須的);
2.I2C一般可以掛很多個從設備,理論上可以掛128個,實際使用因為寄生電容的原因一般不超過8個從設備(連接到相同總線的 IC 數量受到總線的最大電容 400pF 限制),理論上按照位數地址來確定能掛多少從設備,7位就是128個,10位就是1024個。