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