嵌入式Linux核心I2C子系統詳解
1.1 I2C匯流排知識
1.1.1 I2C匯流排物理拓撲結構
I2C匯流排在物理連線上非常簡單,分別由SDA(序列資料線)和SCL(序列時鐘線)及上拉電阻組成。
通訊原理是通過對SCL和SDA線高低電平時序的控制,來產生I2C匯流排協議所需要的訊號進行資料的
傳遞。在匯流排空閒狀態時,這兩根線一般被上面所接的上拉電阻拉高,保持著高電平。
1.1.2 I2C匯流排特徵
I2C總線上的每一個裝置都可以作為主裝置或者從裝置,而且每一個裝置都會對應一個唯一的地址(可以從I2C器件的資料手冊得知),主從裝置之間就通過這個地址來確定與哪個器件進行通訊,
的應用中,我們把CPU帶I2C匯流排介面的模組作為主裝置,把掛接在總線上的其他裝置都作為從裝置。
I2C總線上可掛接的裝置數量受匯流排的最大電容400pF 限制,如果所掛接的是相同型號的器件,
則還受器件地址位的限制。
I2C匯流排資料傳輸速率在標準模式下可達100kbit/s,快速模式下可達400kbit/s,高速模式下
可達3.4Mbit/s。一般通過I2C匯流排介面可程式設計時鐘來實現傳輸速率的調整,同時也跟所接的上拉電阻
的阻值有關。
I2C總線上的主裝置與從裝置之間以位元組(8位)為單位進行雙向的資料傳輸。
1.1.3 I2C匯流排協議
I2C協議規定,總線上資料的傳輸必須以一個起始訊號作為開始條件,以一個結束訊號作為傳輸的停止條件。起始和結束訊號總是由主裝置產生。匯流排在空閒狀態時,SCL和SDA都保持著高電平,
當SCL為高電平而SDA由高到低的跳變,表示產生一個起始條件;當SCL為高而SDA由低到高的跳變,
表示產生一個停止條件。在起始條件產生後,匯流排處於忙狀態,由本次資料傳輸的主從裝置獨佔,
其他I2C器件無法訪問匯流排;而在停止條件產生後,本次資料傳輸的主從裝置將釋放匯流排,匯流排再次
處於空閒狀態。如圖所示:
在瞭解起始條件和停止條件後,我們再來看看在這個過程中資料的傳輸是如何進行的。前面
我們已經提到過,資料傳輸以位元組為單位。主裝置在SCL線上產生每個時鐘脈衝的過程中將在SDA
線上傳輸一個數據位,當一個位元組按資料位從高位到低位的順序傳輸完後,緊接著從裝置將拉低SDA線,
回傳給主裝置一個應答位,此時才認為一個位元組真正的被傳輸完成。當然,並不是所有的位元組傳輸都
必須有一個應答位,比如:當從裝置不能再接收主裝置傳送的資料時,從裝置將回傳一個否定應答位。
資料傳輸的過程如圖所示:
在前面我們還提到過,I2C總線上的每一個裝置都對應一個唯一的地址,主從裝置之間的資料傳輸
是建立在地址的基礎上,也就是說,主裝置在傳輸有效資料之前要先指定從裝置的地址,地址指定的
過程和上面資料傳輸的過程一樣,只不過大多數從裝置的地址是7位的,然後協議規定再給地址新增
一個最低位用來表示接下來資料傳輸的方向,0表示主裝置向從裝置寫資料,1表示主裝置向從裝置
讀資料。如圖所示:
1.1.4 I2C匯流排操作
對I2C匯流排的操作實際就是主從裝置之間的讀寫操作。大致可分為以下三種操作情況:
第一,主裝置往從裝置中寫資料。資料傳輸格式如下:
第二,主裝置從從裝置中讀資料。資料傳輸格式如下:
第三,主裝置往從裝置中寫資料,然後重啟起始條件,緊接著從從裝置中讀取資料;
或者是主裝置從從裝置中讀資料,然後重啟起始條件,緊接著主裝置往從裝置中寫資料。
資料傳輸格式如下:
第三種操作在單個主裝置系統中,重複的開啟起始條件機制要比用STOP終止傳輸後
又再次開啟匯流排更有效率。
1.2 I2C匯流排硬體介面電路示例
1.2.1 I2C匯流排硬體介面電路示例一
這個電路是基於LPC2368 ARM7晶片進行設計的,使用其內部的I2C介面作為主裝置,
使用ADT75和SC16IS740作為兩個從裝置的I2C匯流排應用。
ADT75是一個帶I2C介面的溫度感測器器件,資料手冊上對其地址的描述如下:
由此,其地址跟A0、A1、A2引腳的接法有關,我們這裡的例項是將A0、A1、A2全部接到高電平上,
因此其地址是:1001111(即0x4F),又因根據協議再給地址新增一個最低位(方向位,預設給寫方向),
因此最後這個溫度感測器作為從裝置的地址是:10011110(即0x9E)。
SC16IS740是一個具有I2C或者SPI介面的擴充套件UART的器件(通過第8腳來決定使用I2C還是SPI介面,我們
這裡要求使用I2C介面,因此將第8腳接到高電平)。根據資料手冊,我們同樣的可以知道地址跟A0、A1的接法
有關,我們這裡的A0接高電平,A1接低電平。因此這個器件作為從裝置的地址是:10010010(即0x92)。
1.2.2 I2C匯流排硬體介面電路示例二
這個電路是Mini2440開發板上I2C匯流排介面的應用。我們可以看到,SDA和SCL線上接了一個10K
的上拉排阻。AT24C08是一個容量為8Kbit的EEPROM儲存器件(注意是8Kbit,也就是1KB) ,根據
資料手冊中器件地址部分的描述,AT24C08的地址是:1010+A2A1A0+方向位,其中1010是EEPROM
的型別識別符;僅僅使用A2來確定匯流排訪問本器件的從裝置地址,這裡接的低電平,所以為0;A1和A0
是器件內部頁地址,在對器件擦除或者程式設計時使用,雖然這裡也接的低電平,但器件內部並不使用引腳的
輸入值,也就是說A1和A0的值是由軟體進行設定的。
1.3 脫離作業系統的I2C匯流排驅動示例(以電路示例一為例)
1.3.1 LPC2368中I2C介面暫存器描述
LPC2368中有三個I2C匯流排介面,分別表示為I2C0、I2C1和I2C2,每個I2C介面都包含7個暫存器。它們分別是:I2C控制置位暫存器(I2CONSET): 8位暫存器,各位不同的設定是對I2C匯流排不同的控制。
位 |
符號 |
描述 |
復位值 |
1:0 |
- |
保留,使用者軟體不要向其寫入1。從保留位讀出的值未被定義 |
NA |
2 |
AA |
宣告應答標誌。為1時將為需要應答的情況產生一個應答 |
0 |
3 |
SI |
I2C中斷標誌。當I2C狀態改變時該位置位 |
0 |
4 |
STO |
匯流排停止條件控制。1發出一個停止條件,當匯流排檢測到停止條件時,STO自動清零 |
0 |
5 |
STA |
匯流排起始條件控制。1進入主模式併發出一個起始條件 |
0 |
6 |
I2EN |
匯流排使能控制。1為使能 |
0 |
7 |
- |
保留,使用者軟體不要向其寫入1。從保留位讀出的值未被定義 |
NA |
I2C控制清零暫存器(I2CONCLR): 8位暫存器,對I2CONSET暫存器中的相應為清零。
位 |
符號 |
描述 |
復位值 |
1:0 |
- |
保留,使用者軟體不要向其寫入1。從保留位讀出的值未被定義 |
NA |
|