實戰經驗:在Linux環境下輕鬆設計基於I2C總線的EEPROM驅動程序
發布時間:2015-09-07 責任編輯:susan
【導讀】I2C總線控製簡單、通信速率高,作為一種2線xian雙shuang向xiang同tong步bu串chuan行xing數shu據ju總zong線xian,為wei嵌qian入ru式shi係xi統tong設she計ji提ti供gong一yi種zhong完wan善shan的de集ji成cheng電dian路lu間jian的de串chuan行xing總zong線xian擴kuo展zhan技ji術shu,大da大da簡jian化hua了le應ying用yong係xi統tong的de硬ying件jian設she計ji。本ben文wen介jie紹shao了leLinux下I2C總線EEPROM驅動程序的一般設計方法。
I2C 總線是由2線式串行的總線,用於連接微控製器以及其外圍設備。它是同步通信的一種特殊形式,具有接口線少、控製方式簡單、器件封裝形式小、通信速率較高等優點。在主從通信中,可有多個I2C總線器件同時接到I2C總線上,通過地址來識別通信對象。
筆者在開發基於MPC8250的嵌入式Linux係統的過程中發現I2C總線在嵌入式係統中應用廣泛,I2C總線控製器的類型比較多,對係統提供的操作接口差別也很大。與I2C總線相連的從設備主要有微控製器、EEPROM、實時時鍾、A/D轉換器等。MPC8250處理器正是通過內部的I2C總線控製器來和這些連接在I2C總線上的設備進行數據交換的。由於I2C總線的特性,Linux的I2C總線設備驅動程序的設計者在設計驅動程序時采用了獨特的體係結構。使開發I2C總線設備驅動程序與開發一般設備驅動程序的方法具有很大差別。因此,開發I2C總線設備驅動程序除了要涉及一般Linux內核驅動程序的知識外。還要對I2C總線驅動的體係結構有深入的了解。筆者在開發過程中使用設備型號為AT24C01A的EEPROM來測試I2C總線驅動。
在介紹I2C總線結構之前。要搞清楚兩個概念:I2C總線控製器和I2C設備。I2C總線控製器為微控製器或微處理器提供控製I2C總線的接口,它控製所有I2C總線的特殊序列、協議、仲裁、時序,這裏指MPC8250提供的I2C總線控製接口。I2C設備是指通過I2C總線與微控製器或微處理器相連的設備,如EEPROM、LCD驅動器等,這裏指EEPROM.
在一個串行數據通道中。I2C總線控製器可以配置成主模式或從模式。開發過程中,MPC8250的I2C總線控製器工作在主模式,作為主設備;與總線相連的I2C設備為AT24C01A型EEPROM,作(zuo)為(wei)從(cong)設(she)備(bei)。主(zhu)設(she)備(bei)和(he)從(cong)設(she)備(bei)都(dou)可(ke)以(yi)工(gong)作(zuo)於(yu)接(jie)收(shou)和(he)發(fa)送(song)狀(zhuang)態(tai)。總(zong)線(xian)必(bi)須(xu)由(you)主(zhu)設(she)備(bei)控(kong)製(zhi),主(zhu)設(she)備(bei)產(chan)生(sheng)串(chuan)行(xing)時(shi)鍾(zhong)控(kong)製(zhi)總(zong)線(xian)的(de)傳(chuan)輸(shu)方(fang)向(xiang),並(bing)產(chan)生(sheng)起(qi)始(shi)和(he)停(ting)止(zhi)條(tiao)件(jian)。
I2C總線控製器
I2C使用由串行數據線SDA和串線時鍾線SCL組成的兩線結構來在外部集成電路與控製器之間交換數據。MPC8250的I2C總線控製器包括發送和接收單元、一個獨立的波特率發生器和一個控製單元。發送和接收單元使用相同的時鍾信號,如果I2C為主設備。那麼時鍾信號由I2C的波特率發生器產生;如果I2C為從設備,時鍾信號則由外部提供。
SDA和SCL為雙向的,通過外部+3.3 V上拉電阻連接至正向電壓。當總線處於空閑狀態時,SDA和SCL都應是高電平,I2C通常的配置模式如圖1所示。

圖1 I2C配置模式
I2C的接收和發送單元均為雙緩存,在數據發送時,數據從發送數據寄存器到移位寄存器,以時鍾速率輸出到SDA線;在數據接收時,數據從SDA線進入移位寄存器,然後進入接收寄存器。
I2C總線控製器和EEPROM的基本操作
I2C總線在傳送數據過程中共有3種類型的信號,分別是:開始信號、結束信號和應答信號。
開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據;
結束信號:SCL為高電平時,SDA由低電平向高電平跳變,傳送數據結束;
應答信號:接收數據的設備在接收到一個字節數據後,向發送數據的設備發出特定的低電平脈衝。表示已收到數據。
當MPC8250的I2C總線空閑時,其SDA和SCL均為高電平,主設備通過發送一個開始信號啟動發送過程。這個信號的時序要求是當SCL為高時,SDA出現一個由高到低的電平跳變。在起始條件之後。必須是從設備的地址字節,其中高4位為器件類型識別符(不同的芯片類型有不同的定義,EEPROM一般應為1010),接著3位為片選,最後1位為讀寫位,當為1時為讀操作,為0時為寫操作,如圖2所示。

圖2 EEPROM設備地址字節結構
如果主設備要向EEPROM中寫數據,在地址字節中主設備向EEPROM發出一個寫請求(R/W=0),發送的地址字節之後緊跟著要發送的數據。每發送一個字節的數據後EEPROM就會產生一個應答信號,主設備也會監控應答信號,如果在發送一個字節後EEPROM沒有返回應答信號,則主設備就會停止發送,並生成一個結束信號。寫操作的時序如圖3所示。

圖3 I2C主設備寫操作時序
[page]
要從EEPROM中讀取數據時,應設置R/W=1.在EEPROM發送完一個字節的數據後,主設備產生一個應答信號來響應,告知EEPROM主設備要求更多的數據,對應主設備產生的每個應答信號EEPROM將發送一個字節的數據。當主設備不發送應答信號並隨後發送結束信號位時結束此操作。讀操作的時序如圖4所示。

圖4 I2C主設備讀操作時序
Linux中I2C總線驅動體係結構
在Linux係統中,對於一個給定的I2C總線硬件配置係統,I2C總線驅動程序體係結構由I2C總線驅動和I2C設備驅動組成。其中I2C總線驅動包括一個具體的控製器驅動和I2C總線的算法驅動。一個算法驅動適用於一類總線控製器。而一個具體的總線控製器驅動要使用某一種算法。例如,Linux內核中提供的算法i2e-algo-8260可以用在MPC82xx係列處理器提供的I2C總線控製器上。Linux內核中提供了一些常見處理器如MPC82xx係列的算法驅動。對於I2C設備,基本上每種具體設備都有自己的基本特性。其驅動程序一般都需要特別設計。
在I2C總線驅動程序體係結構中。使用數據結構Driver來表示I2C設備驅動,使用數據結構Client表示一個具體的I2C設備。而對於I2C總線控製器,各種總線控製器在進行數據傳輸時采用的算法有好多種,使用相同算法的控製器提供的控製接口也可能不同。在I2C總線驅動程序體係結構中,用數據結構Algorithm來表示算法,用數據結構Adapter來表示不同的總線控製器。Linux內核的I2C總線驅動程序體係結構如圖5所示。

圖5 Linux內核I2C總線驅動程序體係結構
在圖5中,一個Client對象對應一個具體的I2C總線設備,而一種I2C設備的Driver可以同時支持多個Client.每個Adapter對應一個具體的I2C總線控製器。不同的I2C總線控製器可以使用相同的算法Algorithm.i2c-core是I2C總(zong)線(xian)驅(qu)動(dong)程(cheng)序(xu)體(ti)係(xi)結(jie)構(gou)的(de)核(he)心(xin),在(zai)這(zhe)個(ge)模(mo)塊(kuai)中(zhong),除(chu)了(le)為(wei)總(zong)線(xian)設(she)備(bei)驅(qu)動(dong)提(ti)供(gong)了(le)一(yi)些(xie)統(tong)一(yi)的(de)調(tiao)用(yong)接(jie)口(kou)來(lai)訪(fang)問(wen)具(ju)體(ti)的(de)總(zong)線(xian)驅(qu)動(dong)程(cheng)序(xu)功(gong)能(neng),以(yi)進(jin)行(xing)讀(du)寫(xie)或(huo)設(she)置(zhi)操(cao)作(zuo)外(wai),還(hai)提(ti)供(gong)了(le)將(jiang)各(ge)種(zhong)支(zhi)持(chi)的(de)總(zong)線(xian)設(she)備(bei)驅(qu)動(dong)和(he)總(zong)線(xian)驅(qu)動(dong)添(tian)加(jia)到(dao)這(zhe)個(ge)體(ti)係(xi)中(zhong)的(de)方(fang)法(fa),以(yi)及(ji)當(dang)不(bu)再(zai)使(shi)用(yong)這(zhe)些(xie)驅(qu)動(dong)時(shi)將(jiang)其(qi)從(cong)體(ti)係(xi)中(zhong)刪(shan)除(chu)的(de)方(fang)法(fa)。i2c-core將總線驅動程序體係一分為二,相互獨立。可以針對某個I2C總線設備來設計一個I2C設備驅動程序,而不需要關心係統的I2C總線控製器是何種類型,所以提高了其可移植性。另一方麵,在設計I2C總線驅動時也可以不要考慮其將用來支持何種設備。因為i2c-core提供了統一的接口,所以也為設計這兩類驅動提供了方便。
開發實例
Linux內核已經提供了I2C驅動中所需要的基本模塊。i2c-core、i2c-dev和i2c-proc是總線控製器和I2C設備所需要的核心模塊。對於MPC8250處理器,內核中還有MPC8260的算法模塊i2c-algo-8260,它也適用於MPC8250的I2C控製接口。這些模塊程序在默認條件下是不會被編譯到內核裏的,所以需要在配置Linux內核時把這些模塊選中。在筆者的開發中需要實現的是I2C總線控製器驅動和I2C設備EEPROM驅動。
I2C總線控製器驅動的設計
MPC8250的I2C總線驅動程序由i2c-algo-8260算法模塊和MPC8250具體的I2C總線控製器驅動組成。其中i2c-algo-8260算法模塊已經在內核中實現,所以主要實現FC總線控製器驅動。
i2c-algo-8260算法模塊主要用來描述MPC82xx處理器如何在I2C總線上傳輸數據。該模塊中主要實現了MPC82xx處理器上I2C總線的初始化、讀寫、ioctl控製和中斷請求等功能。另外,還有i2c_8260_add_bus和i2c_8260_del_bus兩個函數,它們是使用這個算法的Adapter初始化時和退出時調用的函數,用來注冊和注銷一個總線控製器,需要從模塊導出。這些函數功能都被封裝在一個i2c-algorithm結構中,傳遞給使用這個算法的Adapter.算法模塊中這些函數需要調用特定控製器模塊中的函數來實現具體的操作。
[page]
在I2C總線控製器驅動模塊中主要要實現兩個結構體i2c_adapter和i2c_algo_8260_data,定義這兩個結構中的函數指針成員。並且用己經初始化好的i2c_algo_826o_data結構來初始化struct i2c_adapter結構的algo_data成員變量。其中,定義i2e_algo_8260_data結構為:
struct i2c_algo_8260_data rw8250_data={
setisr:rw8250_install_isr
};
這裏的成員變量rw8250_install__isr提供了MPC8250的I2C總線控製器向內核申請中端請求的功能。結構體i2c_adapter定義如下:
struct i2c_adapter rw8250_ops={"rw8250",I2C_HW_
MPC8250_RW8250,NULL,
其中,"rw8250"是該總線控製器的標識名,宏名I2C_HW_MPC8250_RW8250定義了內核中注冊該適配器的ID號,而成員函數rw8250_inc_use和rw8250_dec_use用來增加和減少內核使用該模塊的次數。
另外,該模塊還要完成一個注冊模塊時的初始化函數rw8250_iic_init,在該函數中要初始化I2C控製器使用的通用端口號PortD14、PortD15,並在雙端口RAM中為發送和接受數據的緩衝區分配空間。函數rw8250_iic_init在進行模塊初始化時將被init_module調用。
總之。I2C控製器模塊中設計的這些函數都是為i2c_algo_8650算法模塊服務的。最後需要封裝在i2c-adapter結構中。通過i2c_algo_8260_data算法模塊中輸出的接口函數傳遞給算法模塊。
I2C設備驅動的設計
I2C設備EEPROM驅動除了要根據EEPROM的具體特性進行設計外。還要考慮I2C總線驅動程序體係結構的特性。在EEPROM設備驅動程序中需要實現一個i2c_driver結構。每個對應於具體設備的Client都從這個結構來構造。在i2c_driver結構中有兩個函數attach_adapter和detach_client必須要實現。i2c_driver結構的定義如下:
struct i2c_driver eeprom_driver = {
/*name*/ "I2C_EEPROM_DRIVER",/*id*/I2C_DRIVERID_EEPROM,
/*flags*/ I2C_DF_NOTIFY,/*attach_ adapter*/
/*command*/
};
在設備驅動中。向EEPROM寫數據通過調用i2c-core提供的i2c_master_send函數來完成。從EEPROM讀取數據通過另一個函數i2c_master_read來完成。與一般設備驅動不同的地方就是在EEPROM驅動模塊初始函數中要調用i2c-core提供的i2c_add_driver函數來注冊該設備。在模塊退出函數中調用i2c_del_driver函數來注銷該設備。
Linux作為一種新的操作係統,目前在嵌入式係統中的應用非常廣泛。其發展前景無法估量。由於Linux源碼開放,且非常易於移植,為其編寫設備驅動程序相對容易。
推薦閱讀:
我愛快包——電子工程師的外快錢包
推薦閱讀:
我愛快包——電子工程師的外快錢包
特別推薦
- 噪聲中提取真值!瑞盟科技推出MSA2240電流檢測芯片賦能多元高端測量場景
- 10MHz高頻運行!氮矽科技發布集成驅動GaN芯片,助力電源能效再攀新高
- 失真度僅0.002%!力芯微推出超低內阻、超低失真4PST模擬開關
- 一“芯”雙電!聖邦微電子發布雙輸出電源芯片,簡化AFE與音頻設計
- 一機適配萬端:金升陽推出1200W可編程電源,賦能高端裝備製造
技術文章更多>>
- 邊緣AI的發展為更智能、更可持續的技術鋪平道路
- 每台智能體PC,都是AI時代的新入口
- IAR作為Qt Group獨立BU攜兩項重磅汽車電子應用開發方案首秀北京車展
- 構建具有網絡彈性的嵌入式係統:來自行業領袖的洞見
- 數字化的線性穩壓器
技術白皮書下載更多>>
- 車規與基於V2X的車輛協同主動避撞技術展望
- 數字隔離助力新能源汽車安全隔離的新挑戰
- 汽車模塊拋負載的解決方案
- 車用連接器的安全創新應用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
Future
GFIVE
GPS
GPU
Harting
HDMI
HDMI連接器
HD監控
HID燈
I/O處理器
IC
IC插座
IDT
IGBT
in-cell
Intersil
IP監控
iWatt
Keithley
Kemet
Knowles
Lattice
LCD
LCD模組
LCR測試儀
lc振蕩器
Lecroy
LED
LED保護元件
LED背光


