1. 程式人生 > 實用技巧 >I2C協議及其原始碼跟進(一)I2C協議簡介及層次架構

I2C協議及其原始碼跟進(一)I2C協議簡介及層次架構

I2C協議及其原始碼跟進

(一)I2C協議簡介

I2C協議特點:


I2C匯流排示意

1.它是飛利浦公司生產的一種串列埠協議;

2.它是兩根線傳輸的SDA,SCl資料時鐘線;

3.兩根線上必須要由上拉電阻;(上拉電阻的作用是將不確定的訊號通過一個電阻與電源相連,固定在高電平,同時起到限流的作用。)

4.可以掛多個裝置,採用的是主從模式;

5.I2C的時鐘都是由主機產生的;

6.半雙工通訊方式(SPI全雙工的,四根線,序列的);

7.速度問題,低速模式:100K/s全速模式:400k/s高速模式:3.4M/sSPI的速度一般在10M左右);

8.真正的多主機匯流排;

9.序列8位雙向傳輸,先傳高位再傳低位;

I2C時序圖規定:

I2C一般是有7/10位定址的;

I2C起始和停止訊號

起始訊號:在SCL線是高電平時SDA線從高電平向低電平切換;

停止訊號:當SCL線是高電平時SDA線由低電平向高電平切換。

資料的有效性

在SCL線為高電平時,SDA線上的資料保持穩定,也就是說SDA線的高低改變只能是在SCL線為低時,當然起停訊號不在此列。

響應問題

第九個電平的低電平期間,主機會將SDA線拉低,第九個高電平期間,從機將SDA線拉低,同時主機將檢測SDA是為0還是為1,為零表示有響應,否則無響應。

I2C傳送資料,讀寫操作

0”為寫,“1”為讀,寫操作是直接先寫地址再寫資料,讀操作是先寫地址再改為讀,再讀取資料

(二)I2C層次架構

瞭解完了I2C協議的一些規定及特點之後,然後進入Linux核心原始碼(Linux-2.6.22.6)跟進階段。我們知道I2C驅動總共分為三層,I2C匯流排介面卡驅動層,裝置驅動層,I2C核心層。I2C框架關係圖如下:

匯流排介面卡驅動層是一個平臺裝置驅動(platform-device-driver),對應的是控制器的驅動,它分為I2C控制器驅動i2c-s3c2410.c檔案中)和裝置資源(在devs.c檔案中宣告資源,在mach-smdk2410.c中註冊資源),對應一個虛擬匯流排將它們掛接起來,定義描述具體i2c匯流排介面卡的i2c_adapter資料結構、實現在具體

i2c介面卡上的i2c匯流排通訊方法,並由i2c_algorithm資料結構進行描述

裝置驅動層是對於具體裝置的一個驅動比如eeprom驅動(在eeprom.c檔案中),由I2C匯流排將驅動與控制器掛接起來;定義描述具體裝置的i2c_client和可能的私有資料結構、藉助i2c框架的i2c_probe函式實現註冊裝置的attach_adapter方法、提供裝置可能使用的地址範圍、以及裝置地址檢測成功後建立i2c_client資料結構的回撥函式。

I2C核心層(在i2c-core.ci2c.h中)就類似於一個封裝起來的函式庫,它提供公用的結構體,提供註冊和登出的介面,提供公用或者轉接函式,起一個上下層承接的作用。

還有一個分離出來東西i2c-dev.c檔案,i2c-dev模組為系統中所有的i2c介面卡建立相應的/dev/i2c/%d字元裝置節點,並註冊裝置訪問方法,從而使得使用者程序可以訪問該i2c總線上的裝置。它包含對I2C介面卡申請主裝置號(核心中已規定#defineI2C_MAJOR 89)和建立裝置類以及對裝置的操作方法file_operations(也就是找到對應的adapterclient並作相應操作),主裝置號的申請放這裡是因為可以有多條I2C匯流排所以以主次裝置號表示,而不是有一個申請一個,浪費系統資源。