I2C由一條時鐘線和一條數據線組成,我們先看兩張圖。
I2C的波形
I2C協議基本形式 I2C的輸入輸出結構采用的是開漏的結構 。 開漏結構 不能夠自主得到高電平,所以需要通過外部上拉電阻 來的實現 I2C 通信過程中的高電平。上拉電阻 的大小取決于 I2C 不同模式時的灌電流大小。這種結構作為邏輯輸出時候,必須要有外部上拉,一般是通過電阻加到VCC電源,平時保持高電平,當輸入低電平時也可被拉低,也就是說此時的開漏輸出的可以作為外部的輸入I/O口。 因為多個設備共用一條I2C總線,如果 I2C 使用的是推挽輸出,假設在某個時間,A設備和B設備剛好在不同的電平輸出,則會引起短路。
下圖是I2C 獲得高低電平的情景。
如果我們不接上拉電阻,設備的I2C SCL SDA引腳是浮空狀態,浮空的意思是沒有確定的電平,可能是高,也可能是低。而根據I2C的協議,在總線空閑期間,SDA和SCL都是高電平,當SDA出現下降沿時信號傳輸開始,如果沒有確定的電平,一旦有外部的干擾,則可能會誤啟動I2C。 上拉電阻取值上面我們已經說到,由于I2C開漏輸出需要輸出高電平我們就需要加上拉電阻。那上拉電阻該如何取值呢?通常情況下我們使用4.7kΩ,就能適用于大多數應用場景。如果需要更精確的電阻值,我們可以使用以下公式: Rmin = (Vcc - Vol) / Iol Rmax=Tr / (0.8473 * Cb) R 是所需的上拉電阻值(Ω); Vcc 是供電電壓(伏特,V); Vol 是I2C總線上的輸出電平電壓(通常是0.4V); Iol 是I2C總線上的輸出電流(通常是3mA); Tr是上升沿時間,Cb是總線電容,0.8473是標準上升沿時間; 通過上面這個公式可以計算出合適的取值。由上可知,供電電壓決定上拉電阻的最小值,總線負載電容決定上拉電阻的最大值。 常見的上拉電阻阻值有1k、1.5k、2.2k、4.7k、5.1k、10k等。 |