CAN总线在嵌入式Linux下驱动程序的实现.docx

上传人:安*** 文档编号:17786653 上传时间:2022-05-26 格式:DOCX 页数:13 大小:21.64KB
返回 下载 相关 举报
CAN总线在嵌入式Linux下驱动程序的实现.docx_第1页
第1页 / 共13页
CAN总线在嵌入式Linux下驱动程序的实现.docx_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《CAN总线在嵌入式Linux下驱动程序的实现.docx》由会员分享,可在线阅读,更多相关《CAN总线在嵌入式Linux下驱动程序的实现.docx(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、CAN总线在嵌入式Linux下驱动程序的实现ronggang导语:本文以S3C44B0X为微处理器,通过其SPI接口,采用MCP2510CAN控制器扩展CAN总线,文章在分析Linux设备驱动程序工作原理和构造的根底上,重点阐述CAN设备在uClinux下驱动程序的设计方法摘要:本文以S3C44B0X为微处理器,通过其SPI接口,采用MCP2510CAN控制器扩展CAN总线,文章在分析Linux设备驱动程序工作原理和构造的根底上,重点阐述CAN设备在uClinux下驱动程序的设计方法,编写驱动程序的操纵例程,测试驱动程序的正确性。结果说明CAN设备在嵌入式操纵系统uClinux下驱动程序的正确

2、性;CAN设备驱动程序的成功实现,对在嵌入式操纵系统下扩展其它设备驱动程序有重要的指导意义。关键词:CAN;Clinux;S3C44B0X;设备驱动程序基于嵌入式系统设计的工业控制装置,在工业控制现场受到各种干扰,如电磁、粉尘、天气等对系统的正常运行造成很大的影响。在工业控制现场各个设备之间要经常交换、传输数据,需要一种抗干扰性强、稳定、传输速率快的现场总线进展通讯。文章采用CAN总线,基于嵌入式系统32位的S3C44B0X微处理器,通过其SPI接口,MCP2510CAN控制器扩展CAN总线;将嵌入式操纵系统嵌入到S3C44B0X微处理器中,能实现多任务、友好图形用户界面;针对S3C44B0X

3、微处理器没有内存治理单元MMU,采用uClinux嵌入式操纵系统。这样在嵌入式系统中扩展CAN设备关键技术就是CAN设备在嵌入式操纵系统下驱动程序的实现。文章重点解决了CAN总线在嵌入式操纵系统下驱动程序实现的问题。对于用户来讲,CAN设备在嵌入式操纵系统驱动的实现为用户屏蔽了硬件的细节,用户不用关心硬件就可以编出自己的用户程序。实验结果说明驱动程序的正确性,能进步整个系统的抗干扰才能,稳定性好,最大传输速率到达1Mb/s;硬件的错误检定特性也增强了CAN的抗电磁干扰才能。2系统硬件设计系统采用S3C44B0X微处理器,需要扩展CAN控制器。常用的CAN控制器有SJA1000和MCP2510,

4、这两种芯片都支持CAN2.0B标准。SJA1000采用的总线是地址线和数据线复用的方式,但是嵌入式处理器外部总线大多是地址线和数据线分开的构造,这样每次对SJA1000操纵时需要先后写入地址和数据2次数据,而且SJA1000使用5V逻辑电平。所以应用MCP2510控制器进展扩展,收发器采用82C250。MCP2510控制器特点:1.支持标准格式和扩展格式的CAN数据帧构造CAN2.0B;2.08字节的有效数据长度,支持远程帧;3.最大1Mb/s的可编程波特率;4.2个支持过滤器的承受缓冲区,3个发送缓冲区;5.SPI高速串行总线,最大5MHz;6.35.5V宽电压范围供电。MCP2510工作电

5、压为3.3V,可以直接与S3C44B0X微处理器I/O口相连。为了进一步进步系统抗干扰性,可在CAN控制器和收发器之间加一个光隔6N137。其构造原理框图如图1:align=center图1.S3C44B0X扩展CAN构造框图/alignalign=center图2.字符设备注册表/align3CAN设备驱动程序的设计Linux把设备看成特殊的文件进展治理,添加一种设备,首先要注册该设备,增加它的驱动。设备驱动程序是操纵系统内核与设备硬件之间的接口,并为应用程序屏蔽了硬件细节。在linux中用户进程不能直接对物理设备进展操纵,必须通过系统调用向内核提出恳求,由内核调用相应的设备驱动。因此首先建

6、立Linux设备治理、设备驱动、设备注册、Linux中断这几个概念。3.1Linux的设备治理Linux支持各种各样的外围设备,对这些设备的治理通称为设备治理。设备治理分为两局部:一局部是驱动程序的上层,与设备无关的,这局部根据输入输出恳求,通过特定的设备驱动程序接口与设备进展通讯;另一局部是下层,与设备有关的,通常称为设备驱动程序,它直接与硬件打交道,并且向上层提供一组访问接口。Linux设备治理为了对设备进展读、写等操纵,把物理设备逻辑化,把它看成特殊的文件,称为设备文件,采用文件系统接口和系统调用来治理和控制设备。Linux把设备分为三类,块设备、字符设备和网络设备。每类设备都有不同治理

7、控制方式和不同的驱动程序,这样方便于对系统进展裁减。Linux内核对设备的识别是根据设备类型和设备号。在字符设备中使用同一个驱动程序的每种设备都有唯一的主设备号。CAN设备通过在/vendor/Samsung/44b0/Makefile文件下设置设备类型和设备号分别为can、125。3.2file_operations构造体Linux对设备操纵的详细实现是由设备驱动程序完成。设备驱动程序加载到系统中通过设备注册实现。Linux驱动程序对文件的操纵通过file_operations构造体来完成。file_operations构造体是文件操纵函数指针的集合。在设备治理中该构造体各个成员项指向的操纵

8、函数就是设备驱动程序的各个操纵例程,编写驱动程序本质上就是编写该构造体中的各个函数。对不同的设备可以装备其中全部或者局部的操纵函数,不使用的函数指针置为NULL。下面是CAN设备file_operations构造体:Staticstructfile_operationswrite:s3c44b0_mcp2510_write,/写操纵read:s3c44b0_mcp2510_read,/读操纵ioctl:s3c44b0_mcp2510_ioctl,/读写之外的操纵open:s3c44b0_mcp2510_open,/翻开设备release:s3c44b0_mcp2510_release;/关闭设

9、备这个构造的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用,来调用自己的驱动接口,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据构造相应的函数指针,接着把控制权交给该函数。3.3设备注册在linux中,当一种设备安装到系统时必须向系统进展注册,设备注册的主要任务是把设备驱动程序加载到系统中。Linux对不同的设备如字符设备和块设备分开进展注册治理。每个设备描绘符包括两个指针:name指向设备名字符串,fops指向文件操纵函数构造file_operations,该构造体中包含着指向驱动程序各个操纵例程的指针。图2给出了linux字符设备注册表的示意图。CAN字

10、符设备的注册函数是内核函数:register_chrdevMAJOR_NR,DEVICE_NAME,&s3c44b0_mcp2510_fops;其中参数DEVICE_NAME表示设备名,s3c44b0_mcp2510_fops表示指向file_operations构造体的指针,即指向设备的驱动程序。3.4Linux中断的处理在linux系统里,对中断的处理是属于系统核心局部,因此假如设备与系统之间以中断方式进展数据交换,就必须把该设备的驱动程序作为系统核心的一局部。设备驱动程序通过用request_irq函数来申请中断,通过free_irq来释放中断。由于本实验未用到中断,因此在此不作具体介绍

11、。3.5CAN驱动程序的实现3.5.1编写驱动程序操纵例程CAN设备属于字符设备,对于CAN总线设备,除了发送使用write方法、承受使用read方法以外,还需要控制CAN总线通讯的波特率、设置工作形式、设置ID等,所以使用ioctl是最适宜的方法。CAN驱动程序的入口函数:int_inits3c44b0_mcp2510_initvoidARMTargetInit;/初始化ARMinit_MCP2510BandRat125kbps;/初始化CAN控制器ret=register_chrdevMAJOR_NR,DEVICE_NAME,&s3c44b0_mcp2510_fops;/注册CAN设备CA

12、N驱动程序的退出函数:void_exits3c44b0_mcp2510_exitvoidunregister_chrdevMAJOR_NR,DEVICE_NAME;printkMCP2510Eixt!n;编写CAN设备驱动程序各个操纵例程:1.ioctl函数:Staticints3c44b0_mcp2510_ioctlstructinodeinode,structfilefile,unsinedcmd,unsignedlongargswitchcmdcaseSETBAND:/设置波特率MCP2510_SetBandRateBandRate,TRUE;break;caseSETLPBK:/设置工

13、作方式MCP2510_WriteCLKCTRL,MODE_LOOPBACK|CLK|CLK1;break;caseSETID:/设置标识符MCP2510_Write_Can_IDRXF0SIDH,U8ID,0;break;caseSETFILTER:/设置屏蔽码MCP2510_Write_Can_IDRXM0SIDH,0x1ff,0;break;2.open函数翻开设备:staticints3c44b0_mcp2510_openstructinodeinode,structfilefileprintkdeviceopenn;return0;3.write函数发送数据:staticssize_t

14、s3c44b0_mcp2510_writestructfilefile,constcharbuffer,size_tcount,loff_tpposcopy_from_user&temp,buffer,sizeofmcpcan_data;canWritetemp.id,temp.data,temp.DataLen,temp.IdType,temp.BufNo;/发送数据函数4.read函数接收数据:staticssize_ts3c44b0_mcp2510_readstructfilefile,charbuffer,size_tcount,loff_tpposRevdata0x66,datas,

15、0x08;/接收数据函数copy_to_userbuffer,Receivedata.data,0x08;returncount;3.5.2穿插编译CAN驱动程序穿插编译驱动程序需要一台装了RedHatLinux的宿主机。安装穿插编译工具的方法请参考相关文档穿插编译工具:arm-elf-tools-20030314.sh。驱动程序的使用可以按照两种方式进展编译,一种是静态编译进内核,一种是编译成模块以供动态加载。由于uclinux不支持模块动态加载,所以这里只介绍将驱动程序静态编译进内核的方法。为了让编译器编译所添加的驱动程序,需要修改相关文件。1.修改/linux-2.4.x/driver/

16、char/Makefile文件,增加:Ifeqtab键$CONFIG_MCP2510,Y换行Obj-y+=akaeled.oEndif/这几句话的意思是假如配置了mcp2510,那么把mcp2510.o加进内核。2.修改linux-2.4.x/driver/char/mem.c,在文件中增加如下代码:#ifdefCONFIG_MCP2510换行externvoidmcp2510_init;#endif/通过该文件告诉内核调用相应的CAN驱动程序#ifdefCONFIG_MCP2510换行mcp2510_init;换行#endif3.修改linux-2.4.x/driver/char/Confi

17、g.in文件,在字符字段内添加如下代码:Boolmcp2510supportCONFIG_MCP2510这样在makemenuconfig时将出现mcp2510的配置选项。4.修改/uClinux/vendor/Samsung/44b0/Makefile在DEVICES局部添加内容:can,c,125,0。这句话的意思是在device中注册一个字符设备can,该设备主设备号为125,次设备号为0。在makemenuconfig时进入Characterdevices,选中里面的supportmcp2510。在root权限下执行以下命令编译内核:1、#makedep;2、#makelib_only

18、;3、#makeromfs;4、#makeimage;5、#make4CAN驱动程序的测试4.1编写应用程序为了验证所添加的驱动程序的正确性,编写一个应用程序CAN2510.C进展测试,在应用程序中使用下面函数创立一个线程用来发送数据:pthread_creat&id,NULL,voidcansend,&sendata;在cansend函数中用write函数调用驱动程序s3c44b0_mcp2510_write实现数据的发送,用read函数调用驱动程序s3c44b0_mcp2510_read接收节点发送过来的数据,用printf输出节点发送过来的数据,验证接收到的数据是否正确。4.2编译CAN

19、应用程序编译应用程序有两种方法:一是放到内核中编译,这种方法需要写一个Makefile文件,还需要修改相应文件,比拟费事;另外一种方法是单独编译,把编译产生的可执行文件添加到uclinux文件系统romfs中的bin文件夹下,重新编译内核。本实验采用了后者。执行:#arm-elf-gccelf2fltcan2510.cocan2510lpthread其中arm-elf-gcc是编译器,增加参数elf2flt是由于uclinux只支持flat格式的可执行文件,-0是对编译进展优化,can2510是编译产生的可执行文件名称。把can2510复制到/home/cai/uclinux/romfs/bi

20、n目录下,重新编译内核,把产生的映像文件image.rom或者image.ram下载到目的板,运行can2510进展CAN驱动测试。本文的创新点:在分析Linux设备驱动程序工作原理和构造的根底上,独立添加了CAN总线设备驱动程序到嵌入式操纵系统Linux中。经实验说明嵌入式系统下扩展CAN总线传输数据可靠、抗干扰强,在工业控制场合有很大的使用价值;同时,CAN设备在嵌入式操纵系统linux下驱动程序的成功实现,为在嵌入式系统中扩展其他硬件设备驱动程序提供了很好的参考价值。1张维刚.基于CAN总线构造的并联液压混合动力车控制系统J.微计算机信息.2006.2:1-32刘淼.嵌入式系统接口设计与Linux驱动程序开发M.北京航空航天大学出版社,2006.53RUBINTA,CORBETJ.LINUX设备驱动程序第二版M.魏永明,骆刚,姜君译.中国电力出版社,20024周立功,陈明计,陈渝.ARM嵌入式Linux系统构建与驱动开发范例M.北京航空航天大学出版社,2006.1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁