在硬件上,I2C總線是由時(shí)鐘總線SCL和數(shù)據(jù)總線SDA兩條線構(gòu)成,連接到總線上的所有器件的SCL都連到一起,所有SDA都連到一起。I2C總線是開(kāi)漏引腳并聯(lián)的結(jié)構(gòu),因此我們外部要添加上拉電阻。對(duì)于開(kāi)漏電路外部加上拉電阻,就組成了線“與”的關(guān)系??偩€上線“與”的關(guān)系就是說(shuō),所有接入的器件保持高電平,這條線才是高電平,而任何一個(gè)器件輸出一個(gè)低電平,那這條線就會(huì)保持低電平,因此可以做到任何一個(gè)器件都可以拉低電平,也就是任何一個(gè)器件都可以作為主機(jī),如圖14-1所示,我們添加了 R63 和 R64 兩個(gè)上拉電阻。
圖14-1 I2C 總線的上拉電阻
雖然說(shuō)任何一個(gè)設(shè)備都可以作為主機(jī),但絕大多數(shù)情況下我們都是用單片機(jī)來(lái)做主機(jī),而總線上掛的多個(gè)器件,每一個(gè)都像電話機(jī)一樣有自己唯一的地址,在信息傳輸?shù)倪^(guò)程中,通過(guò)這唯一的地址就可以正常識(shí)別到屬于自己的信息,在 KST-51 開(kāi)發(fā)板上,就掛接了2個(gè) I2C 設(shè)備,一個(gè)是 24C02,一個(gè)是 PCF8591。
我們?cè)趯W(xué)習(xí) UART 串行通信的時(shí)候,知道了通信流程分為起始位、數(shù)據(jù)位、停止位這三部分,同理在 I2C 中也有起始信號(hào)、數(shù)據(jù)傳輸和停止信號(hào),如圖14-2所示。
圖14-2 I2C 時(shí)序流程圖
從圖上可以看出來(lái),I2C 和 UART 時(shí)序流程有相似性,也有一定的區(qū)別。UART 每個(gè)字節(jié)中,都有一個(gè)起始位、8個(gè)數(shù)據(jù)位、1位停止位。而 I2C 分為起始信號(hào)、數(shù)據(jù)傳輸部分、停止信號(hào)。其中數(shù)據(jù)傳輸部分,可以一次通信過(guò)程傳輸很多個(gè)字節(jié),字節(jié)數(shù)是不受限制的,而每個(gè)字節(jié)的數(shù)據(jù)最后也跟了一位,這一位叫做應(yīng)答位,通常用 ACK 表示,有點(diǎn)類似于 UART 的停止位。
下面我們一部分一部分的把 I2C 通信時(shí)序進(jìn)行剖析。之前我們已經(jīng)學(xué)過(guò)了 UART,所以學(xué)習(xí) I2C 的過(guò)程我盡量拿 UART 來(lái)作為對(duì)比,這樣有助于更好的理解。但是有一點(diǎn)大家要理解清楚,就是 UART 通信雖然用了 TXD 和 RXD 兩根線,但是實(shí)際一次通信中,1條線就可以完成,2條線是把發(fā)送和接收分開(kāi)而已,而 I2C 每次通信,不管是發(fā)送還是接收,必須2條線都參與工作才能完成,為了更方便的看出來(lái)每一位的傳輸流程,我們把圖14-2改進(jìn)成圖14-3。
圖14-3 I2C 通信流程解析
起始信號(hào):UART 通信是從一直持續(xù)的高電平出現(xiàn)一個(gè)低電平標(biāo)志起始位;而 I2C 通信的起始信號(hào)的定義是 SCL 為高電平期間,SDA 由高電平向低電平變化產(chǎn)生一個(gè)下降沿,表示起始信號(hào),如圖14-3中的 Start 部分所示。
數(shù)據(jù)傳輸:首先,UART 是低位在前,高位在后;而 I2C 通信是高位在前,低位在后。其次,UART 通信數(shù)據(jù)位是固定長(zhǎng)度,波特率分之一,一位一位固定時(shí)間發(fā)送完畢就可以了。而 I2C 沒(méi)有固定波特率,但是有時(shí)序的要求,要求當(dāng) SCL 在低電平的時(shí)候,SDA 允許變化,也就是說(shuō),發(fā)送方必須先保持 SCL 是低電平,才可以改變數(shù)據(jù)線 SDA,輸出要發(fā)送的當(dāng)前數(shù)據(jù)的一位;而當(dāng) SCL 在高電平的時(shí)候,SDA 絕對(duì)不可以變化,因?yàn)檫@個(gè)時(shí)候,接收方要來(lái)讀取當(dāng)前 SDA 的電平信號(hào)是0還是1,因此要保證 SDA 的穩(wěn)定,如圖14-3中的每一位數(shù)據(jù)的變化,都是在 SCL 的低電平位置。8位數(shù)據(jù)位后邊跟著的是一位應(yīng)答位,應(yīng)答位我們后邊還要具體介紹。
停止信號(hào):UART 通信的停止位是一位固定的高電平信號(hào);而 I2C 通信停止信號(hào)的定義是 SCL 為高電平期間,SDA 由低電平向高電平變化產(chǎn)生一個(gè)上升沿,表示結(jié)束信號(hào),如圖14-3中的 Stop 部分所示。