徐海林
(安徽理工大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院,安徽淮南,232001)
在現(xiàn)代社會(huì),嵌入式以及半導(dǎo)體技術(shù)發(fā)展迅速。嵌入式技術(shù)被應(yīng)用到了社會(huì)上的各個(gè)方面,尤其以手機(jī),平板電腦,醫(yī)療電子,自動(dòng)領(lǐng)域更為明顯。而嵌入式技術(shù)的核心是嵌入式處理器,在眾多的嵌入式處理器領(lǐng)域中又以ARM最為典型。
IIC總線是Philips公司首先推出的新一代串行擴(kuò)展總線,在嵌入式系統(tǒng)中得到了廣泛的應(yīng)用。本文主要研究ARMLinux系統(tǒng)中IIC設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)方法。
IIC 是Inter-Integrated Circuit(集成電路總線)的縮寫,這種總線類型在八十年代初由飛利浦半導(dǎo)體公司設(shè)計(jì)出來。IIC總線是一種高性能的串行總線,這種總線連線少,結(jié)構(gòu)簡(jiǎn)單,使用方便,從而大大簡(jiǎn)化系統(tǒng)的硬件設(shè)計(jì)。IIC總線由數(shù)據(jù)線SDA和時(shí)鐘線SCL兩條線構(gòu)成通信線路,既可以接受數(shù)據(jù)又可以發(fā)送數(shù)據(jù)。每一個(gè)帶有IIC總線的芯片都有一個(gè)固定的地址,他們通過這個(gè)唯一固定的地址通信,互相接受和發(fā)送信息。每個(gè)IIC總線芯片都可以是一個(gè)單獨(dú)的接受者和發(fā)送者。
IIC總線是一種雙向的串行接口總線,它的最大的特點(diǎn)就是簡(jiǎn)單和高效率。正是這種總線采用了串行通信方式,所以IIC總線只需要很少的空間和IO接口。IIC總線通過上拉電阻連接正電源,當(dāng)總線空閑時(shí),兩根線均是高電平。連接到總線上的任一器件輸出的低電平,都將使總線的信號(hào)變低,即各器件的SDA與SCL都是“線與”的關(guān)系。IIC總線的數(shù)據(jù)傳輸效率在標(biāo)準(zhǔn)模式下可以達(dá)到100Kbps,在快速模式下可以達(dá)到400Kbps,在高速模式下可以達(dá)到3.4Mbps。
IIC總線總共能產(chǎn)生三種信號(hào):起始信號(hào)、結(jié)束信號(hào)和響應(yīng)信號(hào)。
(1)起始信號(hào):當(dāng)SCL總線處于高電平狀態(tài),SDA總線的電平從高電平處于低電平,代表著處理器向IIC芯片發(fā)送了起始信號(hào)。

圖1 AT24C02的芯片引腳圖
(2)結(jié)束信號(hào):同樣當(dāng)SCL總線上的電平為高電平,SDA總線的電平從低電平處于高電平狀態(tài),代表著處理器向IIC芯片發(fā)送了結(jié)束信號(hào)。
(3)響應(yīng)信號(hào):當(dāng)芯片接受和發(fā)送完數(shù)據(jù)后,在第9個(gè)時(shí)鐘周期,拉低SDA電平,這就是響應(yīng)信號(hào),標(biāo)志著數(shù)據(jù)接受完成或者讀完成。
AT24C02是美國(guó)公司生產(chǎn)的低功耗的CMOS串行EEPROM,它有四種標(biāo)準(zhǔn)工作電壓,分別是5.0V/2.7V/2.5和1.8V。AT24C02共有8個(gè)引腳,SDA引腳輸出串行數(shù)據(jù),SCL輸出串行時(shí)鐘,A1、A2、A3是地址線引腳,它決定了AT24C02 的地址,七號(hào)引腳是寫保護(hù)引腳,當(dāng)它為低電平時(shí),當(dāng)WP引腳接到VCC上,所有的內(nèi)容被寫保護(hù),只能讀。AT24C02內(nèi)部含有256個(gè)8位字節(jié),總共有32個(gè)頁(yè),每個(gè)頁(yè)有8個(gè)字節(jié)。AT24C02不能發(fā)送數(shù)據(jù),它只能接受數(shù)據(jù)。AT24C02的引腳如圖1所示。
由于IIC總線在嵌入式系統(tǒng)中的廣泛應(yīng)用,S3C2440X芯片內(nèi)部集成了IIC總線接口,方便系統(tǒng)對(duì)IIC總線的應(yīng)用。IIC總線在主從設(shè)備中接受和收發(fā)信息,只需要對(duì)IIC的特殊功能寄存器進(jìn)行相應(yīng)的設(shè)置,就可以使用了。在S3C2440中,IIC特殊功能寄存器有IICCON、IICSTAT、IICDS和IICADD。S3C2440的IIC接口工作流程如圖2所示。

圖2 S3C2440的IIC接口工作流程圖
在嵌入式Linux系統(tǒng)中設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,完成對(duì)設(shè)備初始化、讀寫操作和控制等功能。在廣泛應(yīng)用的ARMLinux及其Android的嵌入式軟硬件系統(tǒng)中,經(jīng)常涉及到內(nèi)部整合電路IIC總線的操作及其設(shè)備的添加與驅(qū)動(dòng)的實(shí)現(xiàn)。
ARM-Linux下,IIC總線設(shè)備驅(qū)動(dòng)采用了總線設(shè)備驅(qū)動(dòng)模型,IIC分為3個(gè)層次IIC內(nèi)核和IIC總線驅(qū)動(dòng)和IIC設(shè)備驅(qū)動(dòng)。在IIC內(nèi)核中定義了一個(gè)i2C_bus_type結(jié)構(gòu)體,里面定義了一個(gè)mach函數(shù),一個(gè)設(shè)備鏈表,一個(gè)驅(qū)動(dòng)鏈表。在ARM-Linux中通過mach函數(shù)來配對(duì)驅(qū)動(dòng)鏈表中的驅(qū)動(dòng)和與之相對(duì)應(yīng)的設(shè)備鏈表中的設(shè)備。IIC內(nèi)核中還提供了一些數(shù)據(jù)結(jié)構(gòu)的定義和接口函數(shù),這些函數(shù)實(shí)現(xiàn)了一個(gè)IIC驅(qū)動(dòng)的注冊(cè)、以及設(shè)備的尋找和適配器的讀寫通信代碼。在IIC 設(shè)備驅(qū)動(dòng)中提供了一個(gè)IIC 設(shè)備的物理相關(guān)信息,而IIC 驅(qū)動(dòng)則實(shí)現(xiàn)了從機(jī)設(shè)備驅(qū)動(dòng),包括read、write、以及ioctl等用戶層接口。
ARM-linux中添加IIC設(shè)備驅(qū)動(dòng),首先是編寫該設(shè)備的i2c-driver驅(qū)動(dòng),然后是編寫跟這個(gè)設(shè)備相關(guān)的i2C-client驅(qū)動(dòng),最后向系統(tǒng)注冊(cè)該驅(qū)動(dòng)。為了方便編寫i2C-client,在linux內(nèi)核2.6中定義了一個(gè)i2C_board_info結(jié)構(gòu)體,里面的兩個(gè)重要成員name和addr可以很輕松幫我們識(shí)別設(shè)備的地址和找到該設(shè)備的i2c-driver驅(qū)動(dòng)。成員name定義了該設(shè)備的名稱,上面提到的mach函數(shù)會(huì)根據(jù)成員name來配對(duì)相對(duì)應(yīng)的i2c-driver。而成員addr則向內(nèi)核提供了該IIC設(shè)備的唯一地址,用來辨別該設(shè)備。
采用I2C-dev.c來編寫IIC驅(qū)動(dòng)是最簡(jiǎn)單的方法。它實(shí)際上是通過應(yīng)用層操作IIC適配器來控制i2c設(shè)備的。I2C-dev.c是一種通用的IIC驅(qū)動(dòng),它提供了通用的read()、write()和ioctl()等函數(shù)接口。應(yīng)用層通過訪問這些接口來訪問掛接在IIC適配器上的IIC設(shè)備的存儲(chǔ)空間和寄存器。其實(shí)I2C-dev.c對(duì)應(yīng)的read()、write()是分別調(diào)用了IIC內(nèi)核心的i2C_master_recv()和i2C_master_send ()函數(shù),這樣的驅(qū)動(dòng)可讀性和可設(shè)計(jì)性都得到了大大的增加。
IIC總線在現(xiàn)在電子技術(shù)中得到廣泛的應(yīng)用,在ARM—Linux中,采用了總線驅(qū)動(dòng)模型三層設(shè)備驅(qū)動(dòng)架構(gòu),使得IIC驅(qū)動(dòng)程序設(shè)計(jì)更加的簡(jiǎn)單,方便閱讀與設(shè)計(jì)。
[1]朱文濤,桑楠,楊國(guó)武.基于S3C2410的I2C總線接口的軟件仿真與驗(yàn)證,2011,9(9).
[2]Data Manual of IIC Serial EEPROM (oaf)[K].Microchip Technology Inc.2005.
[3]孔令成,王華.串行E2PROM的原理及應(yīng)用[J].國(guó)外電子元器件,1997(8):42.
[4]李群芳,張士軍,黃建.單片微型計(jì)算機(jī)與接口技術(shù)[M].2版.北京:電子工業(yè)出版社,2005.
[5]楊文鉑,等.Linux下I2c設(shè)備驅(qū)動(dòng)的一種適配器層直接實(shí)現(xiàn)方法[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2011,11(6).
[6]韋東山.嵌入式Linux 應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社.2008.
[7]Data Manual of IIC Serial EEPROM (oaf)[K].Microchip Technology Inc.2005.