嵌入式系統(tǒng)IIC設備驅動程序設計與實現(xiàn)_第1頁
嵌入式系統(tǒng)IIC設備驅動程序設計與實現(xiàn)_第2頁
嵌入式系統(tǒng)IIC設備驅動程序設計與實現(xiàn)_第3頁
嵌入式系統(tǒng)IIC設備驅動程序設計與實現(xiàn)_第4頁
嵌入式系統(tǒng)IIC設備驅動程序設計與實現(xiàn)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、技 術 創(chuàng) 新中 文 核 心 期 刊 微 計 算 機 信 息 (嵌 入 式 與 SOC 2006年 第 22卷 第 10-2期 元 /:現(xiàn)場總線技術應用 200例 嵌 入 式 系 統(tǒng) 應 用嵌入式系統(tǒng) IIC 設備驅動程序設計與實現(xiàn)Design and Im plem entation of IIC Drivers Based on Em bedded System(南昌工程學院 朱華生葉 軍Zhu,Huasheng Ye ,Jun摘要 :為 了 設 計 出 穩(wěn) 定 可 靠 的 驅 動 程 序 , 首 先 介 紹 IIC 總 線 數(shù) 據(jù) 傳 輸 的 時 序 和 嵌 入 式 Linux 系 統(tǒng)

2、驅 動 程 序 的 框 架 結 構 , 然 后 分析 了 基 于 ARM9嵌 入 式 Linux 系 統(tǒng) IIC 設 備 驅 動 程 序 設 計 的 技 術 難 點 及 解 決 方 法 , 最 后 介 紹 了 基 于 X1227芯 片 EEPROM 設 備 驅 動 程 序 的 實 現(xiàn) 步 驟 。關鍵詞 :Linux;IIC 總線 ; 驅動程序 中圖分類號 :TP311文獻標識碼 :AAbstract:To design credible drivers, first introduces the time sequence of data transmission on IIC bus and

3、 frame of driver in embed-ded linux ,then analyses difficulties of designing driver based on ARM9embedded linux , finally introduces approach of designing EEPROM drivers based on X1227. Key words:linux,IIC bus,drivers文章編號 :1008-0570(200610-2-0170-031前言IIC 總 線 (Inter Integrate Circuit Bus 是 Philips 公

4、 司首先推出的新一代串行擴展總線 , 在嵌入式系統(tǒng)中 得到了廣泛的應用 。 S3C2410處理器其性能價格比好 , 所以在嵌入式市場占有率較高 。 S3C2410采用 ARM9內(nèi)核 , 內(nèi)部集成 IIC 總線 , 因此它連接 IIC 設備非常方 便 。 本文主要研究基于 S3C2410嵌入式 Linux 系統(tǒng) IIC 設備驅動程序的設計方法 。2嵌入式系統(tǒng) IIC 總線的工作時序在 S3C2410嵌入式系統(tǒng) IIC 總線中 , 一般微處理器是總線上的主機 , 其它是從機 。 IIC 總線上可同時接 多個從機 , 每個從機都有一個唯一的地址 。圖 1IIC 總線數(shù)據(jù)傳輸時序圖主機負責 IIC 總

5、線的初始化 、 數(shù)據(jù)傳輸 、 產(chǎn)生時鐘 信號等工作 。 IIC 總線傳輸?shù)臅r序是 :從 START (開始 位 開始傳輸 , STOP (結束位 結束傳輸 。 傳送到 SDA 上的每 一個字節(jié)必 須是 8位 , 每次 傳送的字節(jié) 數(shù)不 限 , 每一個字節(jié)后面必須跟一個應答位 。 如果在傳輸 過程中 , 從設備不能 一次接受完 一個字節(jié) , 此 時它就 會使時鐘置為低電平 , 迫使主 設備等待 ; 當 從設備能 接收下一個數(shù)據(jù)字節(jié)后 , 將釋放 SCL 線 , 繼續(xù) 后面的數(shù)據(jù)傳輸 。 數(shù)據(jù)傳輸?shù)臅r序如圖 1所示 。2.1IIC 總線寫操作時序IIC 總線寫操作有二種方式 :字節(jié)寫和頁面寫 。

6、字 節(jié)寫是指 :每次 在指定位置 寫入一個字 節(jié)數(shù)據(jù) , 時序 如圖 2(a 所示 。 首先主機向從機發(fā)送啟動信號和 “ 從 機地址 +寫 ” , 然后等待應答信號 ; 當應答信號 來到之 后再發(fā)一個器件內(nèi)部地址 , 然后再次等待應答信號 ; 當應答信號來到之后立即發(fā)送數(shù)據(jù) , 當下一個應答信 號來到之后發(fā)送停止信號 。 頁面寫和字節(jié)寫操作很類 似 , 只是主機在完成第一輪資料傳送之后不發(fā)送停止 信號 , 而繼續(xù)發(fā)送數(shù)據(jù) , 時序如圖 2(b 所示 。圖 2IIC 總線寫數(shù)據(jù)時序圖2.2IIC 總線讀操作時序IIC 總線讀操作主要有二種方式 :指定位置讀和 連續(xù)讀 。 指定位置讀時序如圖 3(

7、a 所示 , 首先主機向 從機發(fā)送啟動信號和 “ 從 機地址 +寫 ” , 在 接收到應答 信號之后馬上發(fā)送一個器件內(nèi)部地址 , 然后再次等待 應答信號 ; 當應答信號來到之后發(fā)送一個啟動信號和 “ 從機地址 +讀 ” , 然后再次等待應答信號 ; 當應答信號 來的時候就可以接受讀取位址的字節(jié)數(shù)據(jù) , 接受完成 后發(fā)送一個停止信號 。 連續(xù)讀時序如圖 3(b 所示 , 當朱華生 :副教授基金項目 :江西省自然科學基金資助 (編號 :0511062- :360元 /年技 術 創(chuàng) 新嵌 入 式 系 統(tǒng) 應 用PLC 技術應用 200例 您 的 論 文 得 到 兩 院 院 士 關 注接收到一個字節(jié)數(shù)

8、據(jù)后 , 不 發(fā)停止信號 , 而發(fā)一個應 答信號 ; 當從機收到應答信號后其自動將地址加 1, 然后 繼續(xù)發(fā)送該地址對應的數(shù)據(jù) , 直到收到一個停止信號 。圖 3IIC 總線讀數(shù)據(jù)時序圖3嵌入式 Linux 驅動程序的框架在嵌入式 Linux 系統(tǒng)中設備驅動程序是內(nèi)核的一 部分 , 完成對設備初始化 、 讀寫操作和控制等功能 。 驅 動程序隱藏了硬件設備的具體細節(jié) , 對不同的設備提 供一致的接口 , 這些接口通過 file_operations 結構來定 義 , 設計驅動程序的大部分工作就是根據(jù)硬件結構來 “填寫 ” 結構體中定義的函數(shù) 。 主要的函數(shù)包括 open( 、 read( 、 w

9、rite( 、 ioctl( 和 release( 等等 。Open( 函數(shù)的主要功能是提供給驅動程序初始化 能力 , 為以后的設備操作做好準備 。 read( 函數(shù)的主要 功能是讀設備數(shù)據(jù) 。 write( 函數(shù)的主要功能是寫設備 數(shù)據(jù) 。 ioctl( 函數(shù)的主要功能是執(zhí)行讀 、寫之外的操作 , 如 :配置設備 。 release( 函數(shù)功能與 open( 函數(shù)相反 。除以上幾個函數(shù)以外 , 還有 2個非常重要的函數(shù) module_init ( 和 module_exit ( , 驅動程序是從 mod-ule_init( 函數(shù)開始執(zhí)行 , 它是在加載模塊時執(zhí)行的 。 它 的功能是 :將初始

10、化函數(shù)加入內(nèi)核全局初始化函數(shù)列 表中 , 在內(nèi)核初始化時 執(zhí)行驅動的 初始化函數(shù) , 從而 完成驅動的初始化和注冊 , 之后驅動便停止等待被應 用軟件調(diào)用 。 module_exit( 函數(shù)的功能和 module_init( 相反 。4嵌 入 式 Linux 系 統(tǒng) IIC 設 備 驅 動程序的設計IIC 設備 (屬于字符設備 驅動程序按功能可分為 6個主要模塊 :初始化 、退出處理 、 打開 、 釋放 、 讀和寫 模塊 。 在 ARM9嵌入式系統(tǒng)中 , 連接在 IIC 總線上的設 備 , 必須按照 IIC 總線時序傳輸 。 由于 IIC 總線有多種 時序 , 這就為驅動程序設計帶來一定的難度

11、 。 在各種 時序中 , 數(shù)據(jù)傳輸?shù)拈_始和結束操作都是相同的 , 所 以驅動程序的初始化 、 退 出處理 、 打開 和釋放模塊 都 相同 。 不同的時序只是讀和寫方式有所區(qū)別 , 因此要 設計不同的讀和寫模塊 。為了方便驅動程序的設計 , 可以將 IIC 總線的 4種時序寫成相應的函數(shù) 。 如 :將圖 2(a 所示的 “ 字節(jié)寫 ” 時序設計成 WrBy_Iic( 函數(shù) , 具體實現(xiàn)函數(shù)如下 :WrBy_Iic(U8slvAddr, U8addr, U8wdataIICDS=slvAddr&0xfe;/從地址 +“寫 ” 標記 IICSTAT=0xf0; /開始傳輸 Run_IicPo

12、ll(; /等待應答信號 IICDS=addr; /設備內(nèi)部地址 IICCON=0xaf; /繼續(xù)傳輸 Run_IicPoll(; IICDS=wdata; /待寫數(shù)據(jù) IICCON=0xaf; Run_IicPoll(; IICSTAT=0xd0;/停止傳輸 和以上設計類似將 “ 頁面寫 ” 設計成 WrPa_Iic( 函 數(shù) 、 “ 指定位置讀 ” 設計成 RdBy_Iic( 函數(shù) 、 “連續(xù)讀 ” 設 計成 RdCo_Iic( 函數(shù) 。 當設計具體讀寫模塊時 , 可以從 這些函數(shù)中選擇不同的函數(shù)來構成 。5X1227驅動程序的設計和實現(xiàn)X1227是一個 RTC 芯片 , 除基本的時鐘功能

13、外 ,還有 4K 位 EEPROM 等 。 它支持 IIC 總線 , 與 s3c2410連接電路如圖 4所示 。 當使用 Linux 操作系統(tǒng)時 , 可以 為 X1227芯片中的時鐘和 EEPROM 設計 2個不同的 驅動程序 。 時鐘設備地址是 (1101111X 2、 , EEPROM 設備地址是 (1010111X 2, 其中最低位是讀寫標志 。 下 面介紹 EEPROM 驅動程序的實現(xiàn)方法 。EEPROM 驅動程序主要由 6個模塊組成 , 其中打 開和釋放模塊只是建立和釋放連接 , 所以可以將它們 寫成 2個空的函數(shù) , 驅動程序的關鍵是設計初始化 、 退出處理 、 讀和寫模塊 。 另

14、外 , 設計驅動程序時 , 還必 須給結構 file_operations 結構賦初值 , 賦值語句如下 :static struct file_operations eeprom_fops =open:eeprom _open, read:eeprom _read, write:eeprom _write, release:eeprom _release,;本結構的主要作用是 :將不同的設備提供一致的 接口 。 如在應用程序中 , 對不同設備進行讀操作時 , 都 使用 read 函數(shù) , 寫操作時 , 都使用 write 函數(shù) 。圖 4X1227電路圖5.1設備初始化模塊設備初始化模塊的主要

15、功能是 :初始化設備 、 向 內(nèi)核注冊設備等 。 具體實現(xiàn)函數(shù)如下 :module_init(171-技 術 創(chuàng) 新中 文 核 心 期 刊 微 計 算 機 信 息 (嵌 入 式 與 SOC 2006年 第 22卷 第 10-2期元 /:現(xiàn)場總線技術應用 200例 嵌 入 式 系 統(tǒng) 應 用address_map(;/地址映射eepromMajor =register_chrdev (0,DEVICE_NAME, &eeprom_fops;/申請主設備號devfs_eeprom_dir =devfs_mk_dir (NULL,"eeprom", NULL; /創(chuàng)建設備

16、文件目錄devfs_eeprom_raw =devfs_register (NULL,"eeprom", /注冊設備文件 5.2設備退出處理模塊 設備初始化模塊的主要功能是 :釋放設備所占用 的資源 。 具體實現(xiàn)函數(shù)如下 :module_exit( devfs_unregister(devfs_eeprom_raw ; /刪除設備文件 devfs_unregister(devfs_eeprom_dir; /刪 除 設 備 文 件目錄unregister_chrdev(eepromMajor,DEVICE_NAME; /釋放主設備號 5.3讀數(shù)據(jù)模塊EEPROM 讀數(shù)據(jù)模塊采

17、用連續(xù)讀時序 。 具體實現(xiàn) 函數(shù)如下 :eeprom_read (struct file *filep,char *buffer,size_t length,loff_t *offInit_Iic(;/初始化 IIC 總線RdCo_Iic(0xaf,0,dbuf,length;/連續(xù)讀數(shù)據(jù)copy_to_user(buffer,dbuf,length;/內(nèi)核態(tài)到用戶態(tài) 5.4寫數(shù)據(jù)模塊EEPROM 寫數(shù)據(jù)模塊采用頁面寫時序 。 具體實現(xiàn) 函數(shù)如下 :eeprom_write (struct file *filep,char *buffer,size_tlength,loff_t *offcop

18、y_from_user (dbuf,buffer,length;/用 戶 態(tài) 到 內(nèi) 核態(tài)Init_Iic(;WrBy_Iic(0xde,0x3f,0x02; /寫狀態(tài)寄存器 WrPa_Iic(0xae,0,dbuf,length;/寫一批數(shù)據(jù) 5.5打開和釋放模塊在 EEPROM 驅動程序中 , 打開和釋放模塊沒有具 體的任務 。 具體實現(xiàn)函數(shù)如下 :int eeprom_open(struct inode *inode,struct file *filp MOD_INC_USE_COUNT;/使用計數(shù)加 1return 0;int eeprom_release (struct inode

19、*inode, struct file*filpMOD_DEC_USE_COUNT;/使用計數(shù)減 1return 0;驅動程序設計完成后 , 再編寫 Makefile 文件 , 通過 make 命令生成目標文件 , 最后利用 insmod 命令向內(nèi) 核加載驅動程序 , 這時在 /dev 就會新增一個設備文件 。6結束語以上程序在嵌入式實驗箱上進行測試 , 性能穩(wěn)定 可靠 。 本文的創(chuàng)新點是 :如何根據(jù)時序快速設計出 IIC 總線設備的驅 動程序 。 只要 仔細分析硬 件的工作時 序 , 并結合驅 動程序框架 , 就可以設計 出性能穩(wěn)定 可 靠的驅動程序 。參考文獻 :1ALESSANDRO R

20、UBINI 著 ,LISOLEG 譯 .LINUX 設備驅動程序 (第二版 M. 北京 :中國電力出版社 .2002.2朱華生 , 胡凱利 . 基地 Linux 系統(tǒng)的 HHARM9電機驅動程序設 計 J. 南昌工程學院學報 .2005,4:51-53.3陳志輝 .I2C 總線在 MCS51系列單片機數(shù)據(jù)采集中的實現(xiàn) J. 微計算機信息 ,2005,1:67-68.Biography:Zhu huasheng, male, 1965-,associate professor,re-search direction :development and application of embedded system.(330099南昌 南昌工程學院計算機系 朱華生 葉軍(Computer Science and technology department of NIT,Nan-chang,330099Zhu,Huasheng Ye,Jun通 訊 地 址 :(330099南 昌 市 高 新 技 術 開 發(fā) 區(qū) 天 祥 大 道 289號南昌工程學院計算機系 朱華生(上接第 71頁 1王小明 ,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論