徐海林
(安徽理工大學計算機科學與工程學院,安徽淮南,232001)
在現(xiàn)代社會,嵌入式以及半導體技術發(fā)展迅速。嵌入式技術被應用到了社會上的各個方面,尤其以手機,平板電腦,醫(yī)療電子,自動領域更為明顯。而嵌入式技術的核心是嵌入式處理器,在眾多的嵌入式處理器領域中又以ARM最為典型。
IIC總線是Philips公司首先推出的新一代串行擴展總線,在嵌入式系統(tǒng)中得到了廣泛的應用。本文主要研究ARMLinux系統(tǒng)中IIC設備驅(qū)動程序的設計方法。
IIC 是Inter-Integrated Circuit(集成電路總線)的縮寫,這種總線類型在八十年代初由飛利浦半導體公司設計出來。IIC總線是一種高性能的串行總線,這種總線連線少,結構簡單,使用方便,從而大大簡化系統(tǒng)的硬件設計。IIC總線由數(shù)據(jù)線SDA和時鐘線SCL兩條線構成通信線路,既可以接受數(shù)據(jù)又可以發(fā)送數(shù)據(jù)。每一個帶有IIC總線的芯片都有一個固定的地址,他們通過這個唯一固定的地址通信,互相接受和發(fā)送信息。每個IIC總線芯片都可以是一個單獨的接受者和發(fā)送者。
IIC總線是一種雙向的串行接口總線,它的最大的特點就是簡單和高效率。正是這種總線采用了串行通信方式,所以IIC總線只需要很少的空間和IO接口。IIC總線通過上拉電阻連接正電源,當總線空閑時,兩根線均是高電平。連接到總線上的任一器件輸出的低電平,都將使總線的信號變低,即各器件的SDA與SCL都是“線與”的關系。IIC總線的數(shù)據(jù)傳輸效率在標準模式下可以達到100Kbps,在快速模式下可以達到400Kbps,在高速模式下可以達到3.4Mbps。
IIC總線總共能產(chǎn)生三種信號:起始信號、結束信號和響應信號。
(1)起始信號:當SCL總線處于高電平狀態(tài),SDA總線的電平從高電平處于低電平,代表著處理器向IIC芯片發(fā)送了起始信號。
圖1 AT24C02的芯片引腳圖
(2)結束信號:同樣當SCL總線上的電平為高電平,SDA總線的電平從低電平處于高電平狀態(tài),代表著處理器向IIC芯片發(fā)送了結束信號。
(3)響應信號:當芯片接受和發(fā)送完數(shù)據(jù)后,在第9個時鐘周期,拉低SDA電平,這就是響應信號,標志著數(shù)據(jù)接受完成或者讀完成。
AT24C02是美國公司生產(chǎn)的低功耗的CMOS串行EEPROM,它有四種標準工作電壓,分別是5.0V/2.7V/2.5和1.8V。AT24C02共有8個引腳,SDA引腳輸出串行數(shù)據(jù),SCL輸出串行時鐘,A1、A2、A3是地址線引腳,它決定了AT24C02 的地址,七號引腳是寫保護引腳,當它為低電平時,當WP引腳接到VCC上,所有的內(nèi)容被寫保護,只能讀。AT24C02內(nèi)部含有256個8位字節(jié),總共有32個頁,每個頁有8個字節(jié)。AT24C02不能發(fā)送數(shù)據(jù),它只能接受數(shù)據(jù)。AT24C02的引腳如圖1所示。
由于IIC總線在嵌入式系統(tǒng)中的廣泛應用,S3C2440X芯片內(nèi)部集成了IIC總線接口,方便系統(tǒng)對IIC總線的應用。IIC總線在主從設備中接受和收發(fā)信息,只需要對IIC的特殊功能寄存器進行相應的設置,就可以使用了。在S3C2440中,IIC特殊功能寄存器有IICCON、IICSTAT、IICDS和IICADD。S3C2440的IIC接口工作流程如圖2所示。
圖2 S3C2440的IIC接口工作流程圖
在嵌入式Linux系統(tǒng)中設備驅(qū)動程序是內(nèi)核的一部分,完成對設備初始化、讀寫操作和控制等功能。在廣泛應用的ARMLinux及其Android的嵌入式軟硬件系統(tǒng)中,經(jīng)常涉及到內(nèi)部整合電路IIC總線的操作及其設備的添加與驅(qū)動的實現(xiàn)。
ARM-Linux下,IIC總線設備驅(qū)動采用了總線設備驅(qū)動模型,IIC分為3個層次IIC內(nèi)核和IIC總線驅(qū)動和IIC設備驅(qū)動。在IIC內(nèi)核中定義了一個i2C_bus_type結構體,里面定義了一個mach函數(shù),一個設備鏈表,一個驅(qū)動鏈表。在ARM-Linux中通過mach函數(shù)來配對驅(qū)動鏈表中的驅(qū)動和與之相對應的設備鏈表中的設備。IIC內(nèi)核中還提供了一些數(shù)據(jù)結構的定義和接口函數(shù),這些函數(shù)實現(xiàn)了一個IIC驅(qū)動的注冊、以及設備的尋找和適配器的讀寫通信代碼。在IIC 設備驅(qū)動中提供了一個IIC 設備的物理相關信息,而IIC 驅(qū)動則實現(xiàn)了從機設備驅(qū)動,包括read、write、以及ioctl等用戶層接口。
ARM-linux中添加IIC設備驅(qū)動,首先是編寫該設備的i2c-driver驅(qū)動,然后是編寫跟這個設備相關的i2C-client驅(qū)動,最后向系統(tǒng)注冊該驅(qū)動。為了方便編寫i2C-client,在linux內(nèi)核2.6中定義了一個i2C_board_info結構體,里面的兩個重要成員name和addr可以很輕松幫我們識別設備的地址和找到該設備的i2c-driver驅(qū)動。成員name定義了該設備的名稱,上面提到的mach函數(shù)會根據(jù)成員name來配對相對應的i2c-driver。而成員addr則向內(nèi)核提供了該IIC設備的唯一地址,用來辨別該設備。
采用I2C-dev.c來編寫IIC驅(qū)動是最簡單的方法。它實際上是通過應用層操作IIC適配器來控制i2c設備的。I2C-dev.c是一種通用的IIC驅(qū)動,它提供了通用的read()、write()和ioctl()等函數(shù)接口。應用層通過訪問這些接口來訪問掛接在IIC適配器上的IIC設備的存儲空間和寄存器。其實I2C-dev.c對應的read()、write()是分別調(diào)用了IIC內(nèi)核心的i2C_master_recv()和i2C_master_send ()函數(shù),這樣的驅(qū)動可讀性和可設計性都得到了大大的增加。
IIC總線在現(xiàn)在電子技術中得到廣泛的應用,在ARM—Linux中,采用了總線驅(qū)動模型三層設備驅(qū)動架構,使得IIC驅(qū)動程序設計更加的簡單,方便閱讀與設計。
[1]朱文濤,桑楠,楊國武.基于S3C2410的I2C總線接口的軟件仿真與驗證,2011,9(9).
[2]Data Manual of IIC Serial EEPROM (oaf)[K].Microchip Technology Inc.2005.
[3]孔令成,王華.串行E2PROM的原理及應用[J].國外電子元器件,1997(8):42.
[4]李群芳,張士軍,黃建.單片微型計算機與接口技術[M].2版.北京:電子工業(yè)出版社,2005.
[5]楊文鉑,等.Linux下I2c設備驅(qū)動的一種適配器層直接實現(xiàn)方法[J].單片機與嵌入式系統(tǒng)應用,2011,11(6).
[6]韋東山.嵌入式Linux 應用開發(fā)完全手冊[M].北京:人民郵電出版社.2008.
[7]Data Manual of IIC Serial EEPROM (oaf)[K].Microchip Technology Inc.2005.