1. 程式人生 > >嵌入式Linux核心I2C子系統詳解

嵌入式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