----- 正文 -----
1、概述
I2C(Inter-Integrated Circuit)也稱(chēng)為IIC,是由飛利浦公司(現(xiàn)在屬于恩智浦半導(dǎo)體)開(kāi)發(fā)的串行通信協(xié)議,廣泛應(yīng)用于連接低速外圍設(shè)備,例如ADC、DAC、電源管理芯片、電流采集芯片等,采用兩線(xiàn)制,最高支持5Mhz通信頻率,支持多主機(jī)多從機(jī)模式。
2、基本結(jié)構(gòu)
I2C基本結(jié)構(gòu)如下圖,SCL與SDA為通信總線(xiàn),SCL:時(shí)鐘線(xiàn),SDA:數(shù)據(jù)線(xiàn),由于其協(xié)議有仲裁功能,因此上面可以?huà)於鄠€(gè)主機(jī)和多個(gè)從機(jī),另外由于其開(kāi)漏輸出結(jié)構(gòu),兩根線(xiàn)上均有上拉電阻來(lái)提供高電平。
當(dāng)然最常見(jiàn)的還是單主機(jī)和(單)多從機(jī)用法:
3、開(kāi)漏輸出與線(xiàn)與邏輯
開(kāi)漏輸出:
開(kāi)漏輸出是I2C的特點(diǎn),開(kāi)漏輸出是指輸出端通過(guò) MOS管的漏極連接到外部電路,MOS管的源極接地,柵極受控,如下圖,此種結(jié)構(gòu)的特點(diǎn)無(wú)法輸出高電平,當(dāng)MOS管開(kāi)啟時(shí)輸出低電平,當(dāng)MOS管關(guān)斷時(shí),輸出高阻態(tài),也就是說(shuō)不拉高也不拉低,因此需要外部加一個(gè)上拉電阻來(lái)實(shí)現(xiàn)高電平輸出。
開(kāi)漏輸出的一個(gè)好處是即使總線(xiàn)上各個(gè)設(shè)備有的輸出高電平有的輸出低電平,由于高電平是由上拉電阻產(chǎn)生,因此總線(xiàn)上不會(huì)出現(xiàn)VDD與GND短路。
線(xiàn)與邏輯:
線(xiàn)與邏輯類(lèi)似于與門(mén)的邏輯,由于開(kāi)漏輸出原因,總線(xiàn)上只要有一個(gè)設(shè)備輸出低電平,那么總線(xiàn)上就會(huì)是低電平,如下表:
4、數(shù)據(jù)有效性:
I2C再進(jìn)行數(shù)據(jù)傳輸時(shí),需要遵循以下邏輯才能保持?jǐn)?shù)據(jù)有效:
SCL為高電平期間:SDA線(xiàn)上的數(shù)據(jù)必須保持穩(wěn)定。
SCL為低電平期間:SDA線(xiàn)上的數(shù)據(jù)可以發(fā)生變化。
5、數(shù)據(jù)傳輸:
以下是官方文檔給出的一個(gè)時(shí)序示例
5.1 位傳輸:
從上面的時(shí)序圖可以看出,I2C傳輸中,每8位為一個(gè)字節(jié),后面跟隨一個(gè)應(yīng)答或非應(yīng)答位
應(yīng)答位(ACK):設(shè)備將SDA拉低
非應(yīng)答位(NACK):SDA保持高電平
另外:
讀(Read):SDA保持高電平
寫(xiě)(Write):主機(jī)將SDA拉低
起始位(Start):在SCL為高電平時(shí),SDA由高電平變?yōu)榈碗娖健?/span>
終止位(Stop):在SCL為高電平時(shí),SDA由低電平變?yōu)楦唠娖健?/span>
5.2 常見(jiàn)時(shí)序
以下是最常見(jiàn)的時(shí)序的抽象圖,該時(shí)序由①起始位開(kāi)始然后主機(jī)發(fā)送②七位從機(jī)地址,后面跟隨一個(gè)③讀或?qū)懳?/strong>,此后等待從機(jī)④應(yīng)答,待從機(jī)應(yīng)答后,⑤如果是讀數(shù)據(jù),那么后續(xù)將會(huì)是從機(jī)返回?cái)?shù)據(jù),主機(jī)讀取數(shù)據(jù);如果是寫(xiě)數(shù)據(jù),那么就是主機(jī)寫(xiě)入一位數(shù)據(jù),讀或者寫(xiě)完成后,主機(jī)或者從機(jī)再次發(fā)⑥非應(yīng)答信號(hào),此后發(fā)送⑦停止位停止此次通信。
另外還有常見(jiàn)的復(fù)雜一點(diǎn)的時(shí)序,該時(shí)序由①起始位開(kāi)始然后主機(jī)發(fā)送②七位從機(jī)地址,后面跟隨一個(gè)③寫(xiě)位,此后等待從機(jī)④應(yīng)答,從機(jī)應(yīng)答后,主機(jī)⑤發(fā)送寄存器地址,從機(jī)收到后再次⑥應(yīng)答,主機(jī)收到應(yīng)答后再次發(fā)送⑦起始位,并再次⑧發(fā)送從機(jī)地址,然后發(fā)送⑨讀或?qū)懳唬撕笤俅蔚却龔臋C(jī)10. 應(yīng)答,主機(jī)收到應(yīng)答后,11. 向從機(jī)發(fā)送數(shù)據(jù)或者讀取從機(jī)返回的數(shù)據(jù),后續(xù)主機(jī)或者從機(jī)再次發(fā)12. 非應(yīng)答信號(hào),最后主機(jī)發(fā)送停止位停止此時(shí)通信。
上述時(shí)序的關(guān)鍵在于第一個(gè)字節(jié)發(fā)送從機(jī)地址,后跟隨第二個(gè)字節(jié)從機(jī)某個(gè)寄存器的地址,第三個(gè)字節(jié)再次發(fā)送從機(jī)地址,然后第四個(gè)字節(jié)才是寫(xiě)入或讀取的數(shù)據(jù),這樣的時(shí)序?qū)τ谏晕?fù)雜一點(diǎn)的芯片通信比較友好,因?yàn)榭梢詫?duì)不同的寄存器進(jìn)行配置。
6、實(shí)際時(shí)序示例:
如下是一個(gè)讀數(shù)據(jù)的時(shí)序示意圖,從機(jī)地址為:1011 001,從機(jī)返回的數(shù)據(jù)為:0101 1101
歡迎評(píng)論區(qū)討論,別忘了點(diǎn)贊!!!