|
前邊學(xué)習(xí)了一種通信協(xié)議叫做UART異步串行通信,本章要學(xué)習(xí)第二種常用的通信協(xié)議I2C(重要且常用)。I2C總線是由PHILIPS公司開(kāi)發(fā)的兩線式串行總線,多用于連接微處理器及其外圍芯片。I2C總線的主要特點(diǎn)是接口方式簡(jiǎn)單,兩條線可以掛多個(gè)參與通信的器件,即多機(jī)模式,而且任何一個(gè)器件都可以作為主機(jī),當(dāng)然同一時(shí)刻只能有一個(gè)主機(jī)。 從原理上來(lái)講,UART屬于異步通信,比如電腦發(fā)送給單片機(jī),電腦只負(fù)責(zé)把數(shù)據(jù)通過(guò)TXD發(fā)送出來(lái)即可,接收數(shù)據(jù)是單片機(jī)自己的事情。而I2C屬于同步通信,SCL時(shí)鐘線負(fù)責(zé)收發(fā)雙方的時(shí)鐘節(jié)拍,SDA數(shù)據(jù)線負(fù)責(zé)傳輸數(shù)據(jù)。I2C的發(fā)送方和接收方都以SCL這個(gè)時(shí)鐘節(jié)拍為基準(zhǔn)進(jìn)行數(shù)據(jù)的發(fā)送和接收。 從應(yīng)用上來(lái)講,UART通信多用于板間通信,比如單片機(jī)和電腦,這個(gè)設(shè)備和另外一個(gè)設(shè)備之間的通信。而I2C多用于板內(nèi)通信,比如單片機(jī)和本章要學(xué)的EEPROM之間的通信。 12.1 I2C時(shí)序初步認(rèn)識(shí)在硬件上,I2C總線是由時(shí)鐘總線SCL和數(shù)據(jù)總線SDA兩條線構(gòu)成,連接到總線上的所有器件的SCL都連到一起,所有SDA都連到一起。I2C總線是開(kāi)漏引腳并聯(lián)的結(jié)構(gòu),因此外部要添加上拉電阻。開(kāi)漏電路外部加上拉電阻,就組成了線“與”的關(guān)系。總線上線“與”的關(guān)系就是說(shuō),所有接入的器件保持高電平,這條線才是高電平,而任何一個(gè)器件輸出一個(gè)低電平,那這條線就會(huì)保持低電平,因此可以做到任何一個(gè)器件都可以拉低電平,也就是任何一個(gè)器件都可以作為主機(jī),如圖12-1所示,添加了R63和R64兩個(gè)上拉電阻。
12-1.png (5.96 KB, 下載次數(shù): 0)
下載附件
2026-4-27 15:33 上傳
圖12-1 I2C總線的上拉電阻 雖然說(shuō)任何一個(gè)設(shè)備都可以作為主機(jī),但絕大多數(shù)情況下都是用單片機(jī)來(lái)做主機(jī),而總線上掛的多個(gè)器件,每一個(gè)都像電話機(jī)一樣有自己唯一的地址,在信息傳輸?shù)倪^(guò)程中,通過(guò)這唯一的地址就可以正常識(shí)別到屬于自己的信息。 學(xué)習(xí)UART串行通信的時(shí)候,知道了通信流程分為起始位、數(shù)據(jù)位、停止位這三部分,同理在I2C中也有起始信號(hào)、數(shù)據(jù)傳輸和停止信號(hào),如圖12-2所示。
12-2.png (8.06 KB, 下載次數(shù): 0)
下載附件
2026-4-27 15:33 上傳
圖12-2 I2C時(shí)序流程圖 從圖上可以看出來(lái),I2C和UART時(shí)序流程有相似性,也有一定的區(qū)別。UART每個(gè)字節(jié),都有一位起始位、8位數(shù)據(jù)位、1位停止位。而I2C分為起始信號(hào)、數(shù)據(jù)傳輸部分、停止信號(hào)。其中數(shù)據(jù)傳輸部分,可以一次傳輸很多個(gè)字節(jié),字節(jié)數(shù)是不受限制的,而每個(gè)字節(jié)的數(shù)據(jù)最后額外跟了一位,這一位叫做應(yīng)答位,通常用ACK表示,類(lèi)似于UART的停止位。 下面通過(guò)和UART通信做比較的方式把I2C通信時(shí)序進(jìn)行剖析。首先要理解,UART通信雖然用了TXD和RXD兩根線,但是實(shí)際一次通信中,1條線就可以完成,2條線是把發(fā)送和接收分開(kāi)而已。而I2C每次通信,不管是發(fā)送還是接收,必須2條線都參與工作才能完成,為了更方便的看出來(lái)每一位的傳輸流程,把圖12-2改進(jìn)成圖12-3。
12-3.png (8.2 KB, 下載次數(shù): 0)
下載附件
2026-4-27 15:32 上傳
圖12-3 I2C通信流程解析 (1)起始信號(hào):UART通信是從一直持續(xù)的高電平出現(xiàn)一個(gè)低電平標(biāo)志起始位;而I2C通信的起始信號(hào)的定義是SCL為高電平期間,SDA由高電平向低電平變化產(chǎn)生一個(gè)下降沿,表示起始信號(hào),如圖12-3中的Start部分所示。 (2)數(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)定,如圖12-3中的每一位數(shù)據(jù)的變化,都是在SCL的低電平位置。8位數(shù)據(jù)位后邊跟著的是一位應(yīng)答位,應(yīng)答位后邊還要具體介紹。 (3)停止信號(hào):UART通信的停止位是一位固定的高電平信號(hào);而I2C通信停止信號(hào)的定義是SCL為高電平期間,SDA由低電平向高電平變化產(chǎn)生一個(gè)上升沿,表示結(jié)束信號(hào),如圖12-3中的Stop部分所示。
|