嵌入式linux下SPI总线设备驱动设计与实现-_第1页
嵌入式linux下SPI总线设备驱动设计与实现-_第2页
嵌入式linux下SPI总线设备驱动设计与实现-_第3页
嵌入式linux下SPI总线设备驱动设计与实现-_第4页
嵌入式linux下SPI总线设备驱动设计与实现-_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 邮局订阅号:82-946120元/年技术创新嵌入式与SOCPLC 技术应用200例您的论文得到两院院士关注嵌入式linux 下SPI 总线设备驱动设计与实现The Design and Implementation of SPI Bus Device Driver in Embedded Linux(上海理工大学王艇艇赵文博孙国强WANG Ting-ting ZHAO Wen-bo SUN Guo-qiang摘要:设备驱动程序是将系统外围设备和应用软件连接起来的中间环节。在嵌入式应用系统中采用SPI 总线芯片越来越多,ARM 芯片的标准SPI 接口不够用。本文采用通用I/O 引脚,在ARM9

2、平台上linux 系统中实现了SPI 总线设备驱动,经实验验证最高通讯速率可达5Mdps 。关键词:ARM;linux;设备驱动;SPI 总线中图分类号:TP335+.1;TP316.2文献标识码:AAbstract:Device driver is the intermediate links between system peripherals devices and application software.,More and more SPI bus chip used in embedded applications.And the standard SPI interface on

3、 ARM chip is not enough.In this paper,the general-pur -pose I /O pins on the ARM9platform will achieve the SPI bus device driver in linux system.And it was proved by experiment that meeting the design requirements.Key words:ARM;linux;device drivers;SPI bus.文章编号:1008-0570(201104-0085-03Linux 操作系统在嵌入式

4、系统领域应用广泛,不仅因为其开源的优势,还在于良好的性能和可移植性。在“人声识别智能婴儿摇篮”项目中使用了linux 操作系统。该项目中摇篮的摆动采用直流电机,改变直流电机电枢电压值,就可以改变转速。项目中采用MAX539芯片来实现这一功能。因此需要编写设备驱动程序,以使linux 系统能够操作MAX539芯片。本项目中,ARM9与MAX539连接没有用ARM 标准的SPI 总线接口,而是使用通用输入输出端口与MAX539的SPI 总线接口连接,主要基于以下两点考虑:1该项目中需要用到其他SPI 总线芯片,如高速AD 等,每次操作在1uS 左右,这些高速SPI 芯片占用了标准SPI 总线接口;

5、MAX539在本系统中属于慢速设备,用GPIO 模拟SPI 时序,每次操作至少需要2.5uS,可以满足电机调速的要求;这样高低速的配置,提高了系统性能。2采用GPIO 连接SPI 总线,驱动的时序、信号都用软件来模拟,这样提高了驱动程序在不同硬件平台上的可移植性。1硬件设计1.1ARM 微处理器简介该项目采用S3C2440A 芯片作为主控芯片,其有2个SPI 标准接口;有130个多用途输入输出端口GPIO(General Purpose Input/Output Ports,可以方便用户进行系统的拓展以及模拟各种总线的时序。每个端口都可以用软件来设置和配置以满足不同系统的设计需求。1.2DA

6、芯片MAX539简介MAX539是低功耗、电压输出型、12位数模转换(DACs、单+5V 电源芯片;电压失调、增益和线性度已经在内部经过修整;MAX539有+2倍的输出增益,输出范围为0+5V;采用外部参考电压,参考电压值为22.5V;可以连接成链式结构。MAX539使用三线串行接口,兼容SPI 总线。对DAC 设置需要两个字节数据,16位中的最高4位是链式连接时的从芯片地址,其余12位是电压数据。MAX539输出电压与输入数字量值之间的转换关系为:VOUT=+2(VREFIN(IN/(4096图1MAX539时序图根据标准SPI 总线协议,MAX539采用的是CPOL =CPHA=0的相序配

7、置形式,即串行同步时钟的空闲状态为低电平、在串行同步时钟的第一个跳变沿(上升或下降数据被采样。1.3硬件连接图2ARM9和MAX539连接图MAX539的参考电压为2.5V,系统中仅用一片MAX539,DOUT 引脚接地。2驱动程序2.1设备驱动程序简介设备驱动程序是操作系统内核和机器硬件之间的接口,由王艇艇:在读硕士研究生基金项目:基金申请人:赵文博;基金颁发部门:上海市教育委员会;项目名称:基于嵌入式微处理器的智能婴儿摇篮(JWCXSL100285-技术创新微计算机信息2011年第27卷第4期120元/年邮局订阅号:82-946现场总线技术应用200例嵌入式与SOC一组函数和一些私有数据组

8、成,是应用程序和硬件设备之间的桥梁。对于硬件,驱动程序直接操作硬件的I/O 端口和寄存器。对于应用程序,驱动程序提供统一的接口,响应应用程序的服务调用。在linux 系统中,把硬件设备与普通文件抽象成相同的文件,称为设备文件。两者抽象出的共性文件的操作,其对硬件设备同样有效。linux 操作系统的某些接口提供公共的函数指针,它们独立于特定的驱动程序和硬件设备。应用程序可以通过这类函数指针操作硬件设备,从而使应用程序能像操作普通文件一样操作设备。而编写驱动程序,就是完成某个设备的函数指针所指向的函数接口。2.2文件系统接口定义文件系统接口在linux 操作系统中被定义为struct file_o

9、perations,它是连接应用软件和硬件设备的公共接口,其成员全部是函数指针,这些指针指出了设备驱动程序各服务函数所在的入口点位置,本质上是驱动函数的散转表。编写驱动程序就是实现该接口的部分或全部接口函数,并将该文件系统接口注册到linux 系统中,在系统中生成一个设备文件。本项目中的文件系统接口定义如下:static struct file_operations max539_fops =.owner =THIS_MODULE,.ioctl =max539_ioctl,.write =max539_write,.open =max539_open,.release =max539_rele

10、ase,;本项目中,定义了文件系统接口的变量max539_fops,在该接口中,我们根据实际的需要,实现了如下一些接口函数。.ioctl,处理一些对于硬件的控制操作,用于调试驱动程序。.write,将数据写到目的硬件,是驱动程序的核心内容。.open,负责处理打开设备的相关操作。.release,负责处理关闭设备前的操作。2.3驱动程序实现1初始化和退出函数在驱动程序加载时,首先是运行初始化函数,它的主要功能是进行设备文件系统和设备文件的注册、所用资源的初始化等。本程序中,初始化函数负责将本驱动注册到linux 系统中,生成设备文件,源代码如下:ret =misc_register(&misc

11、;/*将misc 注册到linux 系统中*/其中ret 为整型返回值。misc 为要注册的设备,其定义如下:static struct miscdevice misc =.minor =MISC_DYNAMIC_MINOR,/*misc 设备的设备号值为255*/.name =DEVICE_NAME,/*这个设备的名称值为max539*/.fops =&max539_fops,/*max539_fops 是文件系统接口*/;/*定义一个简单的小型设备。*/当执行完初始化后,linux 系统中就存在“max539”这个设备文件了,设备号255。当驱动卸载时,需要完成注销设备文件的操作,代码如下

12、:misc_deregister(&misc;“max539”这个设备文件从linux 操作系统中注销了。2打开和关闭函数当在linux 系统中注册好设备之后,就可以像操作文件一样操作设备了。打开和关闭就是常见的操作。打开函数是设备打开时驱动程序被调用的第一个函数,一般可以用来设置设备的电源状态,例如省电模式还是额定功率模式;还可以选择设备或芯片等操作。本驱动程序中,打开函数用来设置模拟SPI 总线的三条GPIO 引脚为输出引脚功能,主要代码如下:s3c2410_gpio_cfgpin(gpio_cs,max539_gpio_cfg;s3c2410_gpio_setpin(gpio_cs,1;

13、/*片选信号暂时为无效状态,等要传输时再有效。信号线和时钟线都为低电平状态。各引脚均按照SPI 标准来初始化。*/关闭函数是设备要关闭时执行的函数,一般做一些关闭设备前的善后工作,比如释放资源等。本驱动程序中,将三条模拟SPI 总线的GPIO 线恢复成等待操作时的状态,即CS 无效,SCLK 和DIN 均为低电平状态。3控制函数控制函数ioctl(一般用来完成读写之外的工作,比如对设备发出某个控制命令等。本程序中的ioctl(函数是在驱动程序调试阶段使用的函数,功能与写函数一致,因为比较简单,在调试时更加方便。4写操作函数写操作函数的功能是将应用程序中要传送的用户数据,发送到设备或芯片,这是本

14、驱动程序最重要的功能。此函数分成两部分内容,读取用户数据和模拟SPI 时序写数据给MAX539。该函数的主要代码如下:unsigned short data=(unsigned short0;/*这个变量用来存储要发送的数据*/char str2;/*从用户空间读取数据所存储的缓冲区*/int r =copy_from_user(str,buffer,2;/*从用户空间读取两字节的数据*/data=str0=0x1000return -EINVAL;/*判断数据是否超出0FFFH 范围*/send_2_bytes(data;/*发送数据*/5发送函数这个函数不是文件系统接口中的函数,而是为了实

15、现特定功能而添加的,主要是模拟MAX539的SPI 时序,将16位的串行数据发送给MAX539。以下是本函数的主要代码:unsigned char bit_counter=16;/*发送16位数据计数变量*/unsigned short temp=0x00;s3c2410_gpio_setpin(gpio_sclk,0;ndelay(20;/*tCSH0:SCLK 拉低后需要保持的时间。*/s3c2410_gpio_setpin(gpio_cs,0;/*片选MAX539有效*/ndelay(30;/*tCSS:CS 下降后需要保持的时间。*/do86- 邮局订阅号:82-946120元/年技术

16、创新嵌入式与SOCPLC 技术应用200例您的论文得到两院院士关注temp=data;if(temp&0x8000=0x8000s3c2410_gpio_setpin(gpio_din,1;ndelay(50;/*tDS:DIN setup time.printk(1;*/elses3c2410_gpio_setpin(gpio_din,0;ndelay(50;/*tDS:DIN setup time.printf(0*/s3c2410_gpio_setpin(gpio_sclk,1;/*DIN 设置完1位,SCLK 上升,发送数据*/ndelay(50;/*tCH:SCLK 为1保持*/s3

17、c2410_gpio_setpin(gpio_sclk,0;ndelay(50;/*tCL:SCLK 为0保持*/temp=data1;/*下一位数据*/data=temp;bit_counter-;while(bit_counter;s3c2410_gpio_setpin(gpio_cs,1;/*所有数据发送完,CS 无效,电压输出*/ndelay(30;/*tCSW:CS 保持高的最短时间。*/2.4编译和测试1编译和加载驱动首先把驱动源代码存放到内核源代码目录drivers/char 下,然后修改该目录中的内核配置文件Kconfig 和编译配置文件Makefile6。在这两个文件中分别添

18、加新加入的驱动源代码的相关内容,如下:Kconfig:config MAX539_WTTtristate max539DAC by wtt.SPI bus and GPIO likeMakefile:obj-$(CONFIG_MAX539_WTT+=max539.o然后,在控制台下进入内核主目录,输入make modules 命令,开始编译。编译完成后,可以在源代码所在目录找到max539.ko 可执行文件。将此文件下载到ARM9平台下,执行modprobe max539即可加载该驱动,可以通过查看/dev 目录,发现“max539”这个设备文件已经注册到linux 系统中了,完成了驱动程序的

19、编译和加载。2程序测试和结果将驱动程序加载到linux 内核,执行write 函数,将两字节的数据存在char 型数组中,作为write 函数参数传送给驱动程序。测试中MAX539的参考电压为2.58V,、DIN 和SCLK 的高电平为3.23V,低电平为0.02V 。初态是:=1,DIN=SCLK=0,说明打开设备的函数完成了模拟SPI 总线的初始化操作,使总线处于等待状态。调用设备的写函数,将多个测试数据发送给驱动程序去执行,在MAX539的400KHz 最高工作频率条件下,测量MAX539的输出电压,得到测试结果如表1。表1模拟电压输出值从表中可以看出,实际的输出电压和理论的输出电压值之

20、间误差比较小,在MAX539的精度范围之内。说明采用模拟SPI 通信方式可以满足MAX539最高频率的SPI 通信功能。3结论本文中的SPI 驱动程序,从实际应用的效果来看,能够满足系统的需求,从传输波特率上来讲,可以达到MAX539的最高波特率条件。采用通用输入输出端口来模拟SPI 总线的方式,可以实现驱动程序的跨平台移植。本方法为SPI 总线设备的驱动程序提供了一种有益的解决方案。本文作者创新点:采用通用输入输出端口来模拟SPI 总线的方式,完全可以达到SPI 通信方式最高波特率(5Mbps的速度,因此其他SPI 总线设备的驱动程序也可以依此方案来开发。作者对本文版权全权负责,无抄袭。参考文献3畅卫功,丁忠林.嵌入式

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论