嵌入式系统IIC设备驱动程序设计与实现.docx

上传人:b****2 文档编号:18491495 上传时间:2023-08-18 格式:DOCX 页数:10 大小:23.70KB
下载 相关 举报
嵌入式系统IIC设备驱动程序设计与实现.docx_第1页
第1页 / 共10页
嵌入式系统IIC设备驱动程序设计与实现.docx_第2页
第2页 / 共10页
嵌入式系统IIC设备驱动程序设计与实现.docx_第3页
第3页 / 共10页
嵌入式系统IIC设备驱动程序设计与实现.docx_第4页
第4页 / 共10页
嵌入式系统IIC设备驱动程序设计与实现.docx_第5页
第5页 / 共10页
嵌入式系统IIC设备驱动程序设计与实现.docx_第6页
第6页 / 共10页
嵌入式系统IIC设备驱动程序设计与实现.docx_第7页
第7页 / 共10页
嵌入式系统IIC设备驱动程序设计与实现.docx_第8页
第8页 / 共10页
嵌入式系统IIC设备驱动程序设计与实现.docx_第9页
第9页 / 共10页
嵌入式系统IIC设备驱动程序设计与实现.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

嵌入式系统IIC设备驱动程序设计与实现.docx

《嵌入式系统IIC设备驱动程序设计与实现.docx》由会员分享,可在线阅读,更多相关《嵌入式系统IIC设备驱动程序设计与实现.docx(10页珍藏版)》请在冰点文库上搜索。

嵌入式系统IIC设备驱动程序设计与实现.docx

嵌入式系统IIC设备驱动程序设计与实现

技术创新

中文核心期刊《微计算机信息》(嵌入式与SOC2006年第22卷第10-2期

元/:

现场总线技术应用200例》

嵌入式系统应用

嵌入式系统IIC设备驱动程序设计与实现

DesignandImplementationofIICDriversBasedonEmbeddedSystem

(南昌工程学院朱华生

叶军

Zhu,HuashengYe,Jun

摘要:

为了设计出稳定可靠的驱动程序,首先介绍IIC总线数据传输的时序和嵌入式Linux系统驱动程序的框架结构,然后分

析了基于ARM9嵌入式Linux系统IIC设备驱动程序设计的技术难点及解决方法,最后介绍了基于X1227芯片EEPROM设备驱动程序的实现步骤。

关键词:

Linux;IIC总线;驱动程序中图分类号:

TP311文献标识码:

A

Abstract:

Todesigncredibledrivers,firstintroducesthetimesequenceofdatatransmissiononIICbusandframeofdriverinembed-dedlinux,thenanalysesdifficultiesofdesigningdriverbasedonARM9embeddedlinux,finallyintroducesapproachofdesigningEEPROMdriversbasedonX1227.Keywords:

linux,IICbus,drivers

文章编号:

1008-0570(200610-2-0170-03

1前言

IIC总线(InterIntegrateCircuitBus是Philips公司首先推出的新一代串行扩展总线,在嵌入式系统中得到了广泛的应用。

S3C2410处理器其性能价格比好,所以在嵌入式市场占有率较高。

S3C2410采用ARM9内核,内部集成IIC总线,因此它连接IIC设备非常方便。

本文主要研究基于S3C2410嵌入式Linux系统IIC设备驱动程序的设计方法。

2嵌入式系统IIC总线的工作时序

在S3C2410嵌入式系统IIC总线中,一般微处理

器是总线上的主机,其它是从机。

IIC总线上可同时接多个从机,每个从机都有一个唯一的地址。

图1IIC总线数据传输时序图

主机负责IIC总线的初始化、数据传输、产生时钟信号等工作。

IIC总线传输的时序是:

从START(开始位开始传输,STOP(结束位结束传输。

传送到SDA上的每一个字节必须是8位,每次传送的字节数不限,每一个字节后面必须跟一个应答位。

如果在传输过程中,从设备不能一次接受完一个字节,此时它就会使时钟置为低电平,迫使主设备等待;当从设备能接收下一个数据字节后,将释放SCL线,继续后面的

数据传输。

数据传输的时序如图1所示。

2.1IIC总线写操作时序

IIC总线写操作有二种方式:

字节写和页面写。

字节写是指:

每次在指定位置写入一个字节数据,时序如图2(a所示。

首先主机向从机发送启动信号和“从机地址+写”,然后等待应答信号;当应答信号来到之后再发一个器件内部地址,然后再次等待应答信号;当应答信号来到之后立即发送数据,当下一个应答信号来到之后发送停止信号。

页面写和字节写操作很类似,只是主机在完成第一轮资料传送之后不发送停止信号,而继续发送数据,时序如图2(b所示。

图2IIC总线写数据时序图

2.2IIC总线读操作时序

IIC总线读操作主要有二种方式:

指定位置读和连续读。

指定位置读时序如图3(a所示,首先主机向从机发送启动信号和“从机地址+写”,在接收到应答信号之后马上发送一个器件内部地址,然后再次等待应答信号;当应答信号来到之后发送一个启动信号和“从机地址+读”,然后再次等待应答信号;当应答信号来的时候就可以接受读取位址的字节数据,接受完成后发送一个停止信号。

连续读时序如图3(b所示,当

朱华生:

副教授

基金项目:

江西省自然科学基金资助(编号:

0511062

-

-

:

360元/年

技术创新

嵌入式系统应用

PLC技术应用200例》

您的论文得到两院院士关注

接收到一个字节数据后,不发停止信号,而发一个应答信号;当从机收到应答信号后其自动将地址加1,然后继续发送该地址对应的数据,直到收到一个停止信号。

图3IIC总线读数据时序图

3嵌入式Linux驱动程序的框架

在嵌入式Linux系统中设备驱动程序是内核的一部分,完成对设备初始化、读写操作和控制等功能。

驱动程序隐藏了硬件设备的具体细节,对不同的设备提供一致的接口,这些接口通过file_operations结构来定义,设计驱动程序的大部分工作就是根据硬件结构来“

填写”结构体中定义的函数。

主要的函数包括open(、read(、write(、ioctl(和release(等等。

Open(函数的主要功能是提供给驱动程序初始化能力,为以后的设备操作做好准备。

read(函数的主要功能是读设备数据。

write(函数的主要功能是写设备数据。

ioctl(函数的主要功能是执行读、

写之外的操作,如:

配置设备。

release(函数功能与open(函数相反。

除以上几个函数以外,还有2个非常重要的函数module_init(和module_exit(,驱动程序是从mod-ule_init(函数开始执行,它是在加载模块时执行的。

它的功能是:

将初始化函数加入内核全局初始化函数列表中,在内核初始化时执行驱动的初始化函数,从而完成驱动的初始化和注册,之后驱动便停止等待被应用软件调用。

module_exit(函数的功能和module_init(相反。

4嵌入式Linux系统IIC设备驱动

程序的设计

IIC设备(属于字符设备驱动程序按功能可分为6个主要模块:

初始化、

退出处理、打开、释放、读和写模块。

在ARM9嵌入式系统中,连接在IIC总线上的设备,必须按照IIC总线时序传输。

由于IIC总线有多种时序,这就为驱动程序设计带来一定的难度。

在各种时序中,数据传输的开始和结束操作都是相同的,所以驱动程序的初始化、退出处理、打开和释放模块都相同。

不同的时序只是读和写方式有所区别,因此要设计不同的读和写模块。

为了方便驱动程序的设计,可以将IIC总线的4种时序写成相应的函数。

如:

将图2(a所示的“字节写”时序设计成WrBy_Iic(函数,具体实现函数如下:

WrBy_Iic(U8slvAddr,U8addr,U8wdata

{┅

IICDS=slvAddr&0xfe;//从地址+“

写”标记IICSTAT=0xf0;//开始传输Run_IicPoll(;//等待应答信号┅

IICDS=addr;//设备内部地址IICCON=0xaf;//继续传输Run_IicPoll(;┅

IICDS=wdata;//待写数据IICCON=0xaf;Run_IicPoll(;┅

IICSTAT=0xd0;//停止传输┅}

和以上设计类似将“页面写”设计成WrPa_Iic(函数、“指定位置读”设计成RdBy_Iic(函数、“

连续读”设计成RdCo_Iic(函数。

当设计具体读写模块时,可以从这些函数中选择不同的函数来构成。

5X1227驱动程序的设计和实现

X1227是一个RTC芯片,除基本的时钟功能外,

还有4K位EEPROM等。

它支持IIC总线,与s3c2410连接电路如图4所示。

当使用Linux操作系统时,可以为X1227芯片中的时钟和EEPROM设计2个不同的驱动程序。

时钟设备地址是(1101111X2、,EEPROM设备地址是(1010111X2,其中最低位是读写标志。

下面介绍EEPROM驱动程序的实现方法。

EEPROM驱动程序主要由6个模块组成,其中打开和释放模块只是建立和释放连接,所以可以将它们写成2个空的函数,驱动程序的关键是设计初始化、退出处理、读和写模块。

另外,设计驱动程序时,还必须给结构file_operations结构赋初值,赋值语句如下:

staticstructfile_operationseeprom_fops={

open:

eeprom_open,read:

eeprom_read,write:

eeprom_write,release:

eeprom_release,};

本结构的主要作用是:

将不同的设备提供一致的接口。

如在应用程序中,对不同设备进行读操作时,都使用read函数,写操作时,都使用write函数。

图4X1227电路图

5.1设备初始化模块

设备初始化模块的主要功能是:

初始化设备、向内核注册设备等。

具体实现函数如下:

module_init(

171--

技术创新

中文核心期刊《微计算机信息》(嵌入式与SOC2006年第22卷第10-2期

元/:

现场总线技术应用200例》

嵌入式系统应用

{┅

address_map(;//地址映射

eepromMajor=register_chrdev(0,DEVICE_NAME,&eeprom_fops;//申请主设备号

devfs_eeprom_dir=devfs_mk_dir(NULL,"eeprom",NULL;//创建设备文件目录

devfs_eeprom_raw=devfs_register(NULL,"eeprom",┅//注册设备文件

┅}

5.2设备退出处理模块设备初始化模块的主要功能是:

释放设备所占用的资源。

具体实现函数如下:

module_exit({┅

devfs_unregister(devfs_eeprom_raw;//删除设备文件devfs_unregister(devfs_eeprom_dir;//删除设备文件目录

unregister_chrdev(eepromMajor,DEVICE_NAME;//释放主设备号

┅}

5.3读数据模块

EEPROM读数据模块采用连续读时序。

具体实现函数如下:

eeprom_read(structfile*filep,char*buffer,size_tlength,loff_t*off

{┅

Init_Iic(;//初始化IIC总线

RdCo_Iic(0xaf,0,dbuf,length;//连续读数据

copy_to_user(buffer,dbuf,length;//内核态到用户态┅}

5.4写数据模块

EEPROM写数据模块采用页面写时序。

具体实现函数如下:

eeprom_write(structfile*filep,char*buffer,size_t

length,loff_t*off

{…

copy_from_user(dbuf,buffer,length;//用户态到内核态

Init_Iic(;

WrBy_Iic(0xde,0x3f,0x02;//写状态寄存器WrPa_Iic(0xae,0,dbuf,length;//写一批数据…}

5.5打开和释放模块

在EEPROM驱动程序中,打开和释放模块没有具体的任务。

具体实现函数如下:

inteeprom_open(structinode*inode,structfile*filp{MOD_INC_USE_COUNT;//使用计数加1return0;}

inteeprom_release(structinode*inode,structfile

*filp

{MOD_DEC_USE_COUNT;//使用计数减1return0;}

驱动程序设计完成后,再编写Makefile文件,通过make命令生成目标文件,最后利用insmod命令向内核加载驱动程序,这时在/dev就会新增一个设备文件。

6结束语

以上程序在嵌入式实验箱上进行测试,性能稳定可靠。

本文的创新点是:

如何根据时序快速设计出IIC总线设备的驱动程序。

只要仔细分析硬件的工作时序,并结合驱动程序框架,就可以设计出性能稳定可靠的驱动程序。

参考文献:

[1]ALESSANDRORUBINI著,LISOLEG译.LINUX设备驱动程序(第二版[M].北京:

中国电力出版社.2002.

[2]朱华生,胡凯利.基地Linux系统的HHARM9电机驱动程序设计[J].南昌工程学院学报.2005,4:

51-53.

[3]陈志辉.I2C总线在MCS51系列单片机数据采集中的实现[J].微计算机信息,2005,1:

67-68.

作者简介:

朱华生,男,1965-,本科,副教授,研究方向:

嵌入式系统开发与应用.E-mail:

zhuhuasheng@

Biography:

Zhuhuasheng,male,1965-,associateprofessor,re-searchdirection:

developmentandapplicationofembeddedsystem.

(330099南昌南昌工程学院计算机系朱华生叶军

(ComputerScienceandtechnologydepartmentofNIT,Nan-chang,330099Zhu,HuashengYe,Jun

通讯地址:

(330099南昌市高新技术开发区天祥大道289号南昌工程学院计算机系朱华生

(收稿日期:

2006.2.16(修稿日期:

2006.3.17

(上接第71页

[1]王小明,毛敏.基于DSP的实时多任务嵌入式系统[J].微计算机信息,2005,10-2

[2]PhilLapsleyet.al,DSPProcessorFundamental:

ArchitecturesandFeatures,Berkeley,California:

BerkeleyDesignTechnology,Inc,1996

[3]ADSP-219x/2191DSPHardwareReference,AnalogDevicesInc,2000

[4]JL.Hennessy,DA.Patterson著,

计算机体系结构:

量化研究方法(第三版.北京:

机械工业出版社,2003

作者简介:

钟冬庆,男,1971.12,汉,讲师,研究方向:

计算机应用技术,E-mail:

gnsyzdq@。

Biography:

Zhongdongqing,male,1971.12,Hannationality,Lecturer,Researchfield:

Computationalappliedtechnology.

(341000江西赣州赣南师范学院数学与计算机系钟冬庆

(DepartmentofMathematicalandComputerScience,GannanTeachersCollege,Ganzhou,China,341000Zhong,Dongqing

通讯地址:

(341000江西省赣南师范学院数学与计算机系钟冬庆

(收稿日期:

2006.2.17(修稿日期:

2006.3.17

-

-

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2