CAN总线在嵌入式Linux下驱动程序的实现
《基于CAN总线的嵌入式人机交互终端的设计与开发》范文
《基于CAN总线的嵌入式人机交互终端的设计与开发》篇一一、引言随着嵌入式系统技术的快速发展,人机交互终端在各种设备中的应用越来越广泛。
本文将探讨基于CAN总线的嵌入式人机交互终端的设计与开发,通过结合CAN总线的通信特性和嵌入式系统的处理能力,实现高效、稳定的人机交互功能。
二、系统需求分析在系统需求分析阶段,我们首先需要明确人机交互终端的主要功能,包括数据采集、处理、传输以及与外部设备的通信等。
同时,考虑到实际应用场景,我们需要确保终端具有较高的稳定性和可靠性。
此外,为了满足用户友好的操作体验,我们还需要关注终端的界面设计、交互方式以及响应速度等方面。
三、硬件设计在硬件设计方面,我们选择以嵌入式处理器为核心,搭配CAN总线控制器、存储器、输入输出设备等组成硬件平台。
其中,CAN总线控制器负责与其他设备进行通信,嵌入式处理器则负责数据的处理和传输。
此外,为了满足实时性要求,我们还需要确保硬件平台的功耗、体积和成本等方面的优化。
四、软件设计在软件设计方面,我们采用模块化设计思想,将系统划分为数据采集模块、数据处理模块、通信模块以及界面显示模块等。
每个模块都具备独立的功能,并通过接口进行相互通信。
此外,为了确保系统的稳定性和可靠性,我们还需要进行软件优化和异常处理等方面的设计。
五、CAN总线通信设计CAN总线作为一种高效的通信协议,在嵌入式系统中得到了广泛应用。
在本文中,我们采用CAN总线作为终端与外部设备之间的通信方式。
在通信设计方面,我们首先需要确定通信协议和帧格式,然后进行节点地址分配和通信速率设置等。
此外,为了确保通信的实时性和可靠性,我们还需要进行数据传输的校验和错误处理等方面的设计。
六、人机交互界面设计人机交互界面是终端与用户之间的桥梁,其设计直接影响用户体验。
在界面设计方面,我们首先需要明确用户需求和操作习惯,然后进行界面布局、控件选择和交互逻辑等方面的设计。
此外,为了满足不同用户的个性化需求,我们还需要提供丰富的界面主题和个性化设置选项。
【IT专家】基于MCP2515的Linux CAN总线驱动程序设计(一)
本文由我司收集整编,推荐下载,如有疑问,请与我司联系基于MCP2515的Linux CAN总线驱动程序设计(一)2017/06/06 0 时间:2016-12-12作者:华清远见1.前言 CAN(Controller Area Network)总线,即控制器局域网总线,是一种有效支持分布式控制或实时控制的串行通信网络。
由于其高性能、高可靠性、及独特的设计和适宜的价而广泛应用于工业现场控制、智能楼宇、医疗器械、交通工具以及传感器等领域,并已被公认为几种最有前途的现场总线之一。
CAN总线规范已经被国际标准化组织制订为国际标准ISO11898,并得到了众多半导体器件厂商的支持。
本文使用华清远见FS2416平台。
FS2416使用Socket网络设备驱动和字符设备驱动两种方式向Linux内核提供MCP2515的驱动,本文详细介绍了使用Socket方式设计的基于MCP2515的Linux CAN总线驱动程序。
2.FS2416简介 图1 FS2416开发板 FS2416采用的是三星公司的ARM926EJ内核CPU S3C2416,无论从性能上,还是成本上, S3C2416都强于2440,是2440的最完美替代者。
作为32/16 bit RISC指令集、低成本、低功耗、高性能的微处理器。
S3C2416使用了65nm的制作工艺从而降低成本、功耗及提高性能,其使用的ARM926EJ的核心,集成了2D图形加速,添加了低功耗模式,支持内部ROM/RAM引导,支持moviNand启动和低功耗音频编解码。
此外相对于其他ARM9芯片,它的外设也得到了升级,有更多的资源。
图2 FS2416板级资源介绍 3.MCP2515简介 MCP2515是一种独立的CAN总线通信控制器,是Microchip公司首批独立CAN 解决方案的升级器件,其传输能力较Microchip公司原有CAN控制器(MCP2510)高两倍,最高通信速率可达到1Mbps。
波特率自适应的CAN驱动在嵌入式Linux下的实现
波特率自适应的CAN驱动在嵌入式Linux下的实现史小燕;朱建鸿【摘要】Based on the experimental platform whose main controller is Samsung S3C2410 chip, this article designs and implements a more efficient baud rate adaptive CAN driver. In this paper, the CAN drive structure is introduced and the principle of baud rate adaptive CAN driver is explained in detail. This scheme is combined with the common polling method and sampling method. At the same time, a new scheme is proposed to improve the efficiency of the drive by adding the user's input to the baud rate adaptive process. Finally, this paper carries out the data communication test and the performance analysis for this driver.%基于三星S3C2410芯片为主控制器的实验平台,设计实现了一款匹配效率更高的波特率自适应CAN驱动.文中介绍了CAN驱动结构并详细解释了波特率自适应CAN驱动的原理,结合常用的轮询法和采样法进行自适应.同时方案提出了新的改进,将用户影响加入波特率自适应流程来提高驱动工作效率.最后本文对该驱动进行了数据通讯测试以及性能分析.【期刊名称】《计算机系统应用》【年(卷),期】2018(027)001【总页数】4页(P231-234)【关键词】嵌入式Linux;波特率自适应;CAN总线;设备驱动【作者】史小燕;朱建鸿【作者单位】江南大学物联网工程学院, 无锡 214122;江南大学物联网工程学院, 无锡 214122【正文语种】中文控制器局部网(CAN-CONTROLLER AREA NETWORK)是BOSCH公司推出的一种多主机局部网[1].它是一种非常有效的分布式控制串行通信网络,并且具有传输速度快、可靠性高、通信方式灵活等特点,因此在工业控制现场被广泛应用[2].CAN 总线工作时要求通讯双方波特率一致,实现CAN波特率自适应将有效提高CAN总线的灵活性和使用效率.本文实现了一种基于嵌入式Linux的波特率自适应方法,该方法通过融合直接测量法和波特率表轮询法来加快波特率的配适速度;同时,加入波特率优先级的概念,保存用户选择数据并将其利用到波特率初始值设置中,增加了一次性命中正确波特率的概率.1 CAN总线硬件平台介绍硬件平台采用三星S3C2410芯片作为系统微控制器.CAN总线规范定义了OSI模型的数据链路层和物理层.这两层通常由CAN总线控制器和CAN总线收发器实现[3].本文CAN总线控制器和收发器分别采用Microchip的MCP2510和Philips 的P82C50,二者通过SPI总线实现与控制器的数据传输.S3C241X系列是由Samsung公司设计生产的低功耗,高集成微处理器芯片,能够对WINCE,EPOC32,LINUX系统提供支持.芯片接口资源丰富,可通过SPI同步串行接口和MCP2510相连.MCP2510是带有SPI接口的CAN总线控制器,支持回环、正常、监听、睡眠、配置5种工作模式,满足CAN总线使用需求.P82C50是Philips公司生产的can总线收发器,芯片作为CAN控制器与物理总线间的接口,提供对总线的差动发送和接收功能.当使用P82C50作为CAN收发器时,同一网络中允许挂接110个节点.CAN收发器,控制器与微控制单元之间的关系如图1所示. 图1 CAN总线器件示意图2 Linux下CAN驱动软件结构Linux设备驱动是硬件设备和应用程序之间的接口,它为用户提供了统一的设备访问方式.Linux内核一般把驱动程序分为4种类型,而CAN总线设备属于其中的字符型设备,它以设备文件的方式建立在文件系统中的/dev目录下,并且可以像文件一样被访问[4].Linux下设备驱动程序可以以模块的形式动态的加载和卸载,字符设备驱动程序一般包含5个部分:头文件、file_operation结构体变量、中断函数、加载函数以及卸载函数.file_operation结构体变量存储驱动内核模块提供的对设备进行各种操作的函数的指针,该结构体的每个域都对应着驱动内核模块用来处理某个被请求的事务的函数的地址.<linux/fs.h>对file_operations数据结构中各个变量做了详细定义[5].当用户调用如open(),read()等API接口时,系统将参数传递给file_operation结构体的成员函数,最终获得参数实控权的将是系统调用函数.加载函数以及卸载函数为驱动提供了动态使用模式,系统通过调用module_init()来加载驱动,通过调用module_exit()来卸载驱动.module_exit()只在动态编译时有意义,因为静态加载时驱动已经被编译进内核,无法进行卸载.中断函数即中断服务程序,它响应系统中断并作出相应的处理.本文所设计的波特率自适应方式就是通过中断服务程序来实现.Linux中断处理程序可以分为上半部和下半部[6].上部中断处理紧急中断任务,它应该尽量短小简单以便程序能迅速处理完中断并及时返回.底部中断用来处理较长的非紧急任务,linux2.6版本内核提供了三种底部中断处理方式:softirq、tasklet和work queue.tasklet和softirq都是基于软中断机制实现,而work queue则是依靠内核线程实现.这三种处理方式各有优缺点,如果专注性能提高应使用softirq,对底部中断处理的调度有特殊要求则必须使用work queue,除此之外,最优选择tasklet处理方式.3 波特率自适应CAN驱动软件设计CAN波特率自适应的一般方法有两种:轮询法和探测法.本方案将结合这两种常用检测法来设计自适应CAN驱动.轮询法即将常用波特率记录进一张波特率轮询表中,然后将测试波特率按序填入CAN驱动,通过判断能否正确接收CAN数据帧决定是否进行下一次轮询.探测法即对接收数据进行采样,通过采样数据来获得正确波特率.由于CAN波特率有一定容错空间,所以当MCU自带捕捉功能时,即使采样波特率有一定误差,很大程度上也能获得正确波特率.这两种方法各有利弊,前者可以保证在波特率表范围内找到正确值,但因为要对数据依次轮询,所以往往耗时较长.后者虽然时耗短,但对设备有特殊要求,且如果偏差值超过波特率容错范围,则会造成无法获得正确波特率的错误.基于此本文将两种方法相结合,实现一种平均耗时短、匹配成功率高的波特率自适应CAN驱动.3.1 CAN控制器MCP2510MCP2510是一款独立CAN控制器,它的存在大大降低了软件开发的难度.MCP2510具有8个中断源,寄存器CANINTE是中断使能寄存器,它包含了各个中断源的中断使能位;寄存器CANINTF是中断标志寄存器,它包含了各个中断源的中断标志位.寄存器各个位设置如表1所示.表1 中断寄存器CANINTE,CANINTFBit7 Bit6 Bit5 Bit4 INTE MERRE WAKIE ERRIE TX2IE INTF MERRF WAKIF ERRIF TX2IF Bit3 Bit2 Bit1 Bit0 INTE TX1IE TX0IE RX1IE RX0IE INTF TX1IF TX0IF RX1IF RX0IFBit0–Bit1:接收中断位.MCP2510有两个接收缓冲寄存器,缓存器0和缓存器1,驱动将接收数据读入这两个寄存器再传递进用户层.在这两个位使能的情况下,若RX0IF 置位,则缓存器0已满;若RX1IF置位则缓存器1已满.Bit2–Bit4:发送中断位.MCP2510有三个发送缓存器,缓存器0,1和2.在这三个位使能的情况下,若TX0IF置位,则发送缓存器0是空;以此类推.Bit5–Bit6:错误中断位和唤醒总线活动位.Bit7:报文错误中断位.如果报文发送和接收过程中发生错误,将触发该位中断.该中断功能在与监听模式联用时被用来加快波特率的确定.MCP2510提供五种工作模式:配置模式,正常模式,睡眠模式,监听模式,回环模式.这五种模式通过设置CANTCRL寄存器的值来切换,其中波特率必须在配置模式下才能成功设置;CAN总线的通信运行在正常模式下;监听模式仅接受数据帧而不能发送数据,应该在该模式下进行波特率自适应.3.2 波特率自适应软件原理本文所使用的硬件平台将外部中断4作为CAN专用中断引脚,SPI 总线将差分信号传输到 MCU 的外部中断引脚,驱动对该中断做出一系列响应从而得到传输数据.首先对MCP2510 的CANINIE进行设置,使能中断.当信号来临时会根据相应中断对中断标志寄存器进行设置,在中断服务程序中读取CANINIF寄存器的值并进行判断,完成中断响应.通讯双方波特率相匹配时,中断服务程序将会设置工作模式为正常模式并接收数据;波特率设置有误时,中断服务程序将会设置工作模式为正常模式并进入波特率自适应阶段.在波特率自适应阶段,驱动首先对数据进行采样以获得预判波特率.中断触发方式有边沿触发和电平触发,边缘触发分为高电平触发和低电平触发.驱动中可调用set_irq_type函数对触发方式进行设置,do_gettimeofday函数可在高低电平触发时分别获得一个当前时间值.do_gettimeofday是系统函数,用户层函数gettimeofday实际调用的便是该函数,它可以实现微秒级的时间获取.将获得的当前时间与前一次获得的时间相减并不断比较可获得一个最小时间差Tmin.由于CAN总线采用反向不归零编码(NRZ),该种编码方式采用位填充的方法确保至少每6位时间发生一次跳变,即Tmin可以是实际码元长度的1–5倍.从提高驱动效率的角度出发,实际出现长时间不跳变的情况较少,所以本文仅考虑Tmin就是实际码元长度的情况.获得预判波特率以后即使用该波特率进行测试,若再次进入报文错误中断,则依据该波特率所在位置对其周围波特率进行左右轮询直至波特率最终匹配成功.波特率自适应流程图如图2.图2 CAN波特率自适应流程图当产生报文错误中断后,首先获取波特率预测值并对该波特率进行测试.该预测值往往有一定的误差,将波特率表中的各值之间的中间值作为判定该值的边界,可使获得的波特率归束到波特率表中存在的值中.若再次进入报文错误中断,则进行波特率轮询.确定该波特率在波特率表中的位置,根据错误计数值的奇偶性向左右两个方向进行轮询,即一回合向左,下一回合向右.若一方先达到边界值,则专注向另一方向轮询直至找到正确值.轮询部分交由Linux底部中断完成.波特率匹配成功后进入接收中断,对CANINIF寄存器的接收缓存标志位进行问询,若缓存器0,1有空闲空间,则读取数据;若缓存器满,则唤醒等待队列,将数据传递到用户层.在中断服务程序执行完毕后,需要手动清除中断标志位,否则中断会一直响应陷入死循环.清除中断标志位最好使用按位清除的方式,以防未被响应的中断标志被一并清除.3.3 用户优先级的设置CAN波特率的设置与距离有关,波特率越高,能够稳定通信的距离越短.即在距离一定的情况下,往往波特率的设置区间也受到了一定的限制.CAN总线在不同波特率下允许的最大通讯距离是:6.7 km(10 Kbps)、1.3 km(50 Kbps)、620 m(100 Kbps)、530 m(125 Kbps)、270 m(250 Kbps)、130 m(500 Kbps)、40 m(1Mbps)[7].在CAN驱动中,波特率初值固定地设置为波特率表的第一个值,这对于波特率自适应来说是一种资源的浪费.基于此,本文将用户使用频率的影响添进波特率初始值的设置,增加了一次碰撞即可获得正确波特率的概率,提高了波特率匹配效率.用户数据需要具有能够反复读取、即使驱动关闭也能继续存留数据的功能,因此仅将其作为变量写入驱动是不够的.在本方法中用户数据被写入文件,在驱动打开时读入数据,接收中断里进行优先级判定,驱动关闭时保存数据.驱动层调用读写程序之前需要使用set_fs()函数对内核空间进行保护.用户数据中保存一个二维数组,该数组放置了波特率表中的各波特率及其所属优先级,程序每进入一次接受中断,证明该次波特率匹配成功,对该波特率进行判断并将其对应的优先级增加1,再进行排序后便可获得一个新的波特率优先级表.该表存放在一个掉电不擦除的目录下,每次初始化时读取到驱动中的数组里,使用后在关闭驱动时原路保存.4 实验结果分析本设计方案为用户设定了16个常见波特率,满足一般情况下的通讯需求.通过实验平台串口调试功能检测驱动运行情况,驱动初始化阶段打印优先级信息,userlist是波特率枚举值,priority为对应优先级信息.用户层运行CAN数据收发程序,进入波特率调试阶段,驱动首先获得波特率探测值再根据该值进行轮询.图3首先以十六进制形式向ARM开发板发送一组随机数据AA 76 07 54 65 34 53 55,成功匹配波特率后顺利接收;然后ARM端向PC端发送如图4所示三组数据. 图4接收数据为ASSIC码转换而成.经过测试,本文所设计CAN驱动匹配时间基本维持在3秒以内,而仅使用轮训方式匹配波特率会有首尾波特率轮询时间差距大的情况出现,如文献[6]中波特率自适应时间从4 s到12 s时间不等.且本设计增加了用户选择频率的影响,当所设置波特率为常用波特率时,有很大几率会一次命中正确波特率.在实际实验中,当用户优先级第一的波特率被选中时,匹配时间会被缩短到1 s以内,驱动能够在毫秒级时间内完成波特率匹配,这进一步提高了波特率匹配效率. 图3 驱动匹配测试图图4 驱动数据收发测试图5 结语本文在对CAN驱动结构进行分析的基础上设计了一款可以实现CAN波特率自适应的驱动.以S3C2410微处理器为主控制器、MCP2510芯片为CAN控制器的嵌入式设备为实验硬件平台.设计方案融合了两种常用波特率自适应方法并增加了用户使用频率对波特率自适应的影响,文章对这部分内容进行了详细的解释.经过实验验证了该方案比原本的方法耗时更短,该驱动正常工作时数据能正确传输.参考文献【相关文献】1 冯军,王耀南,刘宏立.Linux系统下CAN总线通信的设计及实现.微计算机信息,2008,24(32):71–72,81.[doi:10.3969/j.issn.1008-0570.2008.32.031]2 田小刚,蔡启仲,邬军伟.基于嵌入式Linux下CAN设备驱动程序设计.微计算机信息,2009,25(17):155–157.3 黄辉,范霁月,张明.CAN总线接口设计与应用.轻工科技,2013,(1):61–62.4 陈在平,许东辉.Linux下S3C2440微控制器的CAN驱动设计与实现.化工自动化及仪表,2011,38(8):985–988.5 张雪松,王鸿磊,徐钊.嵌入式Linux2.6内核的CAN驱动设计与实现.计算机工程与设计,2010,31(15):3396–3398,3426.6 曾祥文,宋树祥,宾相邦.嵌入式Linux下波特率自适应的CAN总线驱动的实现.测控技术,2015,34(8):104–107.7 谢云山,杨安种,龚建宇,等.自适应CAN总线波特率转换器设计.自动化与仪器仪表,2013,(5):62–63.。
嵌入式系统课程设计题目
嵌入式系统课程设计题目1.ARM系统在LED显示屏中的应用(利用ARM系统控制彩色LED显示屏)2.ARM-Linux 嵌入式系统在农业大棚中的应用(温度、湿度和二氧化碳浓度是影响棚栽农作物生长的3 大要素。
为了实现农业大棚中这3 种要素数据的远程实时采集,引入了当前嵌入式应用中较为成熟的ARM9 微处理器和Linux 嵌入式操作系统技术, 采用温度传感器PH100TMPA、湿度传感器HM1500 和二氧化碳浓度传感器NAP221A ,设计一种基于TCP/ IP 协议的嵌入式远程实时数据采集系统方案。
从硬件设计和软件实现2方面对该系统进行具体设计。
)3.ARM 嵌入式处理器在智能仪器中的应用(设计一种基于ARM 嵌入式处理器系统的智能仪器的硬件和软件设计方案, 并结合uc/o s2II或者Linux嵌入式实时操作系统, 给出一套完整的任务调度和管理的方法, 最后用实例说明)4.ARM系统在汽车制动性能测试系统中的应用(采用ARM系统构建一个路试法的汽车制动性能测试系统)5.ARM 嵌入式控制器在印染设备监控中的应用(针对拉幅热定型机,设计一种基于485 总线的分布式监控系统。
用ARM 嵌入式控制器实现主、从电机的同步运行和烘房温度的控制;在PC 机上用VB6. 0 设计转速和温度的监控画面;实现ARM、变频器和PC 机之间的数据通信。
)6.基于ARM系统的公交车多功能终端的设计(完成电子收费、报站、GPS定位等功能)7.基于ARM9的双CAN总线通信系统的设计(设计一种基于ARM9内核微处理器的双路CAN总线通信系统。
完成系统的总体结构、部分硬件的设计,系统嵌入式软件的设计,包括启动引导代码U - boot、嵌入式L inux - 操作系统内核、文件系统以及用户应用管理软件四个部分。
)8.基于ARM9 和Linux 的嵌入式打印终端系统(嵌入式平台上的打印终端的外围电路连接设计、嵌入式Linux 的打印机驱动程序开发和应用程序的开发)9.基于ARM 的车载GPS 终端软硬件的研究(重点研究基于ARM 的导航系统的软硬件设计)10.ARM系统在B超系统中的应用(完成系统软件硬件设计,包括外围电路)11.基于ARM 的嵌入式系统在机器人控制系统中应用(提出一种基于ARM、DSP 和arm-linux 的嵌入式机器人控制系统的设计方法, 完成控制系统的功能设计、结构设计、硬件设计、软件设计)12.基于ARM的视频采集系统设计(完成系统软件硬件设计,包括外围电路,采用USB接口的摄像头)13.基于ARM的高空爬壁机器人控制系统(构建一种经济型的爬壁机器人控制平台, 与上位机视觉定位和控制系统结合,使其适用于导航与定位、运动控制策略、多机器人系统体系结构与协作机制等领域。
基于μClinux的火灾报警系统CAN总线设备驱动程序设计
最早 是 由德 国公 司 B sh推 出 的一 种用 于 汽 车 内部 oc 测量 与执 行 部 件 之 问 的数 据 通 信 协议 . 为 一 种 技 作 术先进、 可靠 性 高 、 能 完 善 、 本 合 理 的远 程 网 络 功 成 通讯 控制 方 式 ,A C N总 线 已被广 泛 应 用 于 各 个 自动
a d c r igo t h o n ar n u e c mmu i ain a d c n r lo AN e y t n c t n o t fC o o n t.R s ac h w h tt e s se i smp e i tu t r ,h v n e e r h s o s ta h y t m s i l n sr cu e a i y
化控制系统 中.例如 , 在汽车 电子 、 自动控制 、 智能 大厦 、 电力 系 统 、 防监 控 等各 领 域 中 , A 安 C N总 线 具
有不 可 比拟 的 优 越 性 . ̄lu p i x是 免 费 的 、 码 公 开 Cn 源 的嵌 入式 实 时 内核 . 于 开 发 计 算 机嵌 入 式应 用 产 对 品 的技术人 员来 说是 一个 实 用 价值 很 高 的 实 时嵌 入 式 操 作 系 统 E T S( m eddR a t eoeao R O E bde el i prtn m i
Ab ta t h r ii n r d c s a d sr ue r lr s s m a e n tC i t mb d e p r t g s se s r c :T ea h c e I t u e iti td f e aa m y t b s d o L l L e e d d o ea i y tm. Gii g a o b i e nx n vn
嵌入式操作系统下CAN总线驱动实验设计
人才 。
关键 词 : A 总 线 ; 入式 Ln x 设 备 驱 动 ;MC 2 1 C N 嵌 iu ; P 55
吕 巍 ,于 新 波
(.吉 林 大 学 计 算机 科 学 与技 术 学 院 ,吉林 长 春 1 0 1 ; 1 3 0 2
2 .中 国 石 油 集 团 吉 林 油 田 分 公 司 热 电 厂 ,吉 林 松 原 1 8 0 ) 3 00
摘
要 : AN 总线 是 工 控 领 域 普 遍 采 用 的 现 场 总线 之 一 。 随 着 嵌 入 式 操 作 系统 在 工 控 领 域 应 用 日趋 广 泛 , C
2 .Th r lP we a t i n Oi Fil mp n e ma o rPln ,J l l ed Co a y,CNPC,S n y a 3 0 0,Ch n ) i o g un1 8 0 ia
Ab ta t sr c :CAN u swelr c g ie s o eo i l u e d l s d i n u t il o t o. Ase e d d o — b si l e o n z d a n ff d b s s wi e y u e n i d s ra n r 1 e c mb d e p c a i g s se i b c mi g i c e sn l p ra tis e h o i a i n o mb d e n r t y t m e o n n r a i g y i o t n s u ,t e c mb n to fe e d d OS a d CAN o to l r n s m cnrl e t o v h e l r b e srsn .Th x e i n fCAN u rv r i mb d e n x i d sg e n m— o s l et e r a o l msi iig p e e p rme to b s d ie n e e d d Li u s e i n d a d i p e e t d i r e o ma es u e t n e s a d t ec n e t n b t e mb d e n x a d CAN u o t o — lm n e n o d rt k t d n su d r t n h o n c i e we n e e d d Li u n o b sc n r l lr e .Th x e i n a a d r u p rs a i fa wo k o o t r ,t e fo o e e p rme t lh r wa e s p o t ,b ss r me r fs fwa e h l w fCAN u rv r a d t e b sd ie n h t s i g me h d r r p s d n h x e i n a e n s c e s u p l d i e c ig p a tc . Me n i , e t t o sa e p o o e ,a d t ee p r n me t sb e u c s f l p i n t a h n r c ie h a e a wh l e t e e p r n ,t o ee tn ,h se h n e h e c i g lv l f mb d e u ,a d p t o wa d h e h x ei me t o s m x e t a n a c d t et a h n eso e e e d d b s n u sf r r st en w c n e t n b t e mb d e n i l u ,wh c ep u tv t r f s i n l r s i g d v lp n o o n c i e we n e e d d OS a d fed b s o ih h l s c l a e p o e so a s g a pn e e o me t f r i e e d d b stc n lg . mb d e u e h o o y
Linux中基于MCP2515的CAN总线驱动程序开发
O C 0 8 0 , 表 示 地 址 从 O C 0 0 0 开 始 到 xO0 00 则 xO 00 0
O C 0 8 0 ,共有 3 船 空间。然后设置 自解压代 xO00 0 2 码 的起始地址和 内核解压后代码输出起始地址 ,即
在 a c/ r / o t目录下根 据电路对 Z E TD R和 rh a m b o TX AD Z EAD R L D R变 量进行适 当设 置。最后 在适 当 的地 方
维普资讯
计算枧技术应用
《 电技术》2 0 机 0 7年第 4期
L n x中基 于 M P 5 5的 C N总线 驱动 程 序 开发 iu C2 1 A
卢光 宝 蔡 信健 胡兴 涛
30 1) 5 0 4 ( 建 工程 学 院 电子 信 息与 电气 工程 系 ,福 建 福 州 福
L nx iu 内核 向A M 平 台的移植,完成 了在Ln x A 总线驱动程 序的开发 。并将 其应用在嵌入式五轴数控磨削系统中, R9 iu 中C N 取
得 了 良好 的数 据 传 输 效 果 。 关 健 词 :Ln x C N 线 iu A 总 驱动 程 序
中 图分 类 号 :T 3 6 文 献 标 识 码 :A 文 章编 号 : 17 -4 0 2 0 )0 — 3 0 P3 6 2 8 1( 0 7 4 0— 3
此 移植 变 得 更加容 易 。L n x 2 4 内核 的移植 i ̄ 一 .
过 程 ,首 先 在根 目录 下 通过 修 改 M k f l a e i e文 什
加 入 关 于 中 断和 时钟 设 备 的相 关代 码 以及 增 加 ¥ C 4 0处 理器 的相关 支持 信息 。 32 1 在完成 移植之 后 还 需要对 L n x内核进行必要 的编 译 ,编译 内核 iu
CAN总线在深海集矿机嵌入式控制系统中的应用
( 中南大学 信息科学与工程学 院, 湖南 长沙 4 0 8 ) 10 3 摘 要: 深海集矿机 以 C AN总线为通信平台 , 集成三块 L C2 9 构成多处理器控制系统 。本文重点介绍 了 C P 22 AN总线在该控制系统
中的应用 , 以及在嵌入式实时操作系统 C O — I / S I 环境 下 C AN总线驱动程序设 计技术。 关键词 : AN总线 ;深海集矿机 ;u / S I;驱动程序设计 C C O —I 中途分类号 : P 3 T 36 文献标识码 : B 文章编号 :0 3 7 4 (0 70 — 0 8 0 10 — 2 12 0 )7 0 7 — 3
的核心基础 。本文着重探讨在 u / S I环境下如何实现 C N C O -I A
总线实时、高质量通信 的设计方法。
2 车载C N总线控 制网络 系统 结构 A
图 1 车载控制器网络结构框 图 车载控制器控制 网络结构框 图如图 l 。 微处理器 L C 22 ( P 2 9 参见 L C 2 2的用户手册 )是菲利浦 P 29
维普资讯
《 动 技 与 用 20 年 卷 期 自 化 术 应 u n t i l s a d Ne wor s k
CAN 总 线在 深 海 集 矿 机 嵌 入 式 控 制 系 统 中 的 应 用 ★
基金项 目:国际海底 区域研 究开发 “ 十五 ”项 目 ( Y1 —0 —0 — D 5 0 3 2
0 ) ;国家重点基础研 究发 展规划项 目 ( 0 B 1 0 ) 6 2 2 3 2 0 c 2 3
收 稿 日期 : 0 —0 — 9 2 1 0 06
Ap laino p t f i o c CAN Bu eDe p-e l co si t e — aCo tr h n s l e
嵌入式毕业设计题目
嵌入式毕业设计题目篇一:嵌入式方向本科毕业论文题目论文题目汇总表2、“题目类别”:设计、论文;3、“题目性质”:结合科研、结合生产、结合实验室建设、结合社会实践、理论研究、其它。
篇二:嵌入式毕业设计课题课题一:嵌入式远程视频实时监控实现原理:通过在s3c2440(samsung 的arm9芯片)上植入嵌入式web服务器boa及嵌入式数据库SQLite,搭建一个视频webserver,使得PC或者智能手机可以利用网页方式访问摄像头采集的实时视频,达到远程监控录像等应用!涉及到的知识点:①原理图,PCB,元器件的认识,通过开发板的原理图及CPU的datasheet写程序;②arm架构的理解,arm cpu的工作原理,汇编代码级调试理解;③2440 cpu的GPIO,UART,I2C,SPI,AD,WATCHDOG,RTC,lcd等接口技术原理,C代码级调试理解;④嵌入式linux(linux-2.6.30)系统工作原理,驱动框架结构以及摄像头驱动实现;⑤嵌入式linux(linux-2.6.30)下,webserver的实现,包括,SDL,mjpg-streamer应用软件的移植。
团队组织:实现该项目可以按一下方式组队(考虑到学生可能动手能力有限,每个模块安排两个人,这样有讨论,该分配方法供参考)Linux系统部分,三个人:一个人负责硬件部分,也不是设计原理图,此人需要电子专业,要能看懂原理图,负责各个模块能在开发板正常运行;一个人负责软件部分,linux系统编译问题,负责给第一个人完好的镜像文件;第三个人,协调软硬件,需要既懂硬件也懂软件;驱动部分,两个人:同时进行,做相同的事情,目的在于一起讨论,要看image sensor(通俗的说叫摄像头)的数据手册,搞清楚芯片工作原理,成像原理,以及参考驱动进行移植工作,会设计到信号不同,编译问题,协同工作!Webserver,两个人:在嵌入式linux系统上搭建webserver,涉及到一些应用软件的整合移植工作,主要是SDL,Mjpg-streamer,其中SDL 是一个非常有名的开源库,3D就是通过它来实现的,而Mjpg-streamer是一个流媒体的开源库,实现视频流在网上的传输,这连个库在企业用得很多。
Linux系统下CAN 总线通信的设计及实现
Linux系统下CAN总线通信的设计及实现冯军,王耀南,刘宏立(湖南大学电气与信息工程学院,湖南长沙410082)项目颁发部门:国家自然科学基金委项目名称:大规模环境下移动机器人自主探索与高精度地图创建模式项目编号:60775047项目申请人: 王耀南摘要:本设计为光电稳定跟踪平台开发CAN驱动,以实现CAN总线上设备间的通信。
分析了linux下标准设备驱动机制和CAN总线通信模型,给出了光电稳定跟踪平台中CAN总线通信的硬件设计,实现了带SPI接口的CAN控制器MCP2510的驱动。
关键词:Linux;CAN总线;光电稳定跟踪平台;设备驱动;SPI接口中图法分类号:TP316. 2 文献标识码:ADesign and Implementation of CAN Driver in linuxFeng Jun,Wang Yao-nan ,LIU Hong-li(College of Electrical and Information Engineering,Hunan University,Changsha Hunan 410082,China)Abstract:CAN driver is implemented for optical-electronic stabilization and tracking platform, to advance the communication between devices on CAN bus. The mechanism of standard device driver and the model of CAN bus communication in Linux was analyzed firstly. Then the hardware design for CAN bus communication was presented in optical-electronic stabilization and tracking platform. Lastly, the driver for CAN controller MCP2510 with SPI was implemented.Key words:Linux; CAN bus; O-E stabilization and tracking platform; device driver; serial peripheral interface0.引言控制器局部网(CAN-CONTROLLER AREA NETWORK)是BOSCH公司为现代汽车应用领先推出的一种多主机局部网,以其卓越性能现已广泛应用于工业自动化、多种控制设备、交通工具、医疗仪器以及建筑、环境控制等众多部门。
嵌入式操作系统VxWorks下CAN驱动程序开发
通 过 设 置 时钟 分 频 寄存 器 实现 。 ( ) 片 内 部 寄存 器 与 初 始 化 2芯
S A1 0 J 0 0控 制 器 工 作 模 式 的设 定 、 送 数 据 和 接 收 数 据 都 发
目前 流行 的控 制 嵌 入 式 操 作 系统 有很 多 种 ,但 是用 于 控 制 开 发 , 作 系统 的 实 时性 和 健 壮 性 是最 根 本 的要 求 , V W ok 操 而 x rs 操 作 系 统 就 是在 工 控 应 用 中运 行 的 很 成 功 的 一 套 嵌 入 式 实 时 操 作 系统 。同 时 ,在 工 控 领 域 正 在掀 起 用 现 场 总 线 控 制 系 统 F S C 改 造集 散 控 制 系统 DC S的 热 潮 。在 众 多 现 场 总 线 协 议 中 , AN C
分 数 据 中 , 有 仲裁 场 、 制场 和 数 据 场 是需 要 在 程 序 开 发 中 具 只 控
S A1 0 J 0 0具 有 两 种 工 作 方 式 :基 本 C N 工 作 模 式 B sc A ai — C N, 种 模 式 是 S A1 0 的 默认 工 作 模 式 ; 强 型 工 作 模 式 A 这 J 00 增
维普资讯
3 0
嵌 入 式 操 作 系统 V Wok x rs下 C N 驱 动程 序 开 发 A
嵌人式操作系统 V Wok 下 C N驱动程序开发 x rs A
E eo v lpme t o CAN Dr e n e n f i ru d rEmb d e ea in S se V W o k v e d d Op rt y tm x rs o
嵌入式Linux2.6内核的CAN驱动设计与实现
ZHAN G e s n , W AN G n . i Xu .o g Ho g 1 , XU h o e Z a
(. co l fnoma o d lc i l n i ei , C i nvri f n gadTcn l y u h u 2 0 8 1 Sh o o Ifr t n n etc g er g hn U iesyo Mii eh o g ,X z o 10 , i a E r aE n n a t n n o 2
C ia . pr n fnom ̄ o n i e n ,X zo ol e fn uta T c ooy uh u 2 0 6 hn) h ;2 Deat t Ifr in gn r g uh uC l g Id sil eh lg,X zo 10 ,C ia n me o E ei e o r n 2
具 体步骤 、 A C N总线驱 动初始化 和 中断控制 的设计 方法 以及 C N驱 动加 载步骤 。最后通 过实例验证 了 C 总 线驱 动设计 A N A
的正确 性。
关键 词 : 嵌入 式;Lnx .;S I C N总 线;驱 动程序 iu26 P; A
中图法分类 号: P 6 . T 3 81
0 引 言
在 嵌入式领域 中,i x . Ln 26内核 除 了 提 高 其 实 时 性 能 , u 系 统地 移植 更 加 方便 , 时添 加 了新 的 体 系 结 构 和 处 理 类 型 , 同 可
slcan linux c 协议代码
slcan linux c 协议代码摘要:1.SLCAN 简介2.Linux C 协议代码概述3.SLCAN 在Linux 中的实现4.使用Linux C 协议代码的注意事项正文:1.SLCAN 简介SLCAN(Simple Linux CAN)是一种简单的Linux CAN 驱动程序,它允许Linux 系统与CAN 总线进行通信。
SLCAN 提供了一种通用的硬件抽象层(HAL),使得不同的硬件平台都可以使用同一套驱动程序。
这使得Linux 系统在嵌入式领域中的应用更加广泛。
2.Linux C 协议代码概述Linux C 协议代码是指在Linux 系统中实现CAN 总线通信的一组API。
这些API 提供了一种标准的方式来配置、打开、关闭和发送/接收CAN 数据。
通过使用这些API,开发人员可以在Linux 系统中轻松实现CAN 总线通信。
3.SLCAN 在Linux 中的实现SLCAN 在Linux 中的实现主要是通过内核模块(kernel module)和用户空间库(user-space library)来完成的。
内核模块负责处理底层硬件操作,如总线初始化、错误处理等。
用户空间库提供了一组API,方便开发人员在用户空间中实现CAN 总线通信。
4.使用Linux C 协议代码的注意事项在使用Linux C 协议代码时,需要注意以下几点:(1)确保硬件支持:所使用的硬件平台需要支持SLCAN,并且需要正确配置硬件。
(2)正确安装和配置SLCAN 内核模块:需要将SLCAN 内核模块加载到内核中,并在/etc/modules 文件中添加相应的配置。
(3)使用正确的API:在使用Linux C 协议代码时,需要根据实际需求选择合适的API,如配置、打开、发送和接收等。
(4)错误处理:在使用Linux C 协议代码时,需要正确处理可能出现的错误,如总线错误、发送/接收错误等。
总之,SLCAN 为Linux 系统提供了一种简单易用的CAN 总线通信方案。
CAN总线在嵌入式Linux下驱动程序的实现
CAN总线在嵌⼊式Linux下驱动程序的实现 1引⾔ 基于嵌⼊式系统设计的⼯业控制装置,在⼯业控制现场受到各种⼲扰,如电磁、粉尘、天⽓等对系统的正常运⾏造成很⼤的影响。
在⼯业控制现场各个设备之间要经常交换、传输数据,需要⼀种抗⼲扰性强、稳定、传输速率快的现场进⾏通信。
⽂章采⽤,基于嵌⼊式系统32位的,通过其SPI, CAN扩展CAN;将嵌⼊式操作系统嵌⼊到S3C44B0X微中,能实现多任务、友好图形⽤户界⾯;针对S3C44B0X微处理器没有管理单元MMU,采⽤uClinux嵌⼊式操作系统。
这样在嵌⼊式系统中扩展CAN设备关键技术就是CAN设备在嵌⼊式操作系统下驱动程序的实现。
⽂章重点解决了CAN总线在嵌⼊式操作系统下驱动程序实现的问题。
对于⽤户来说,CAN设备在嵌⼊式操作系统驱动的实现为⽤户屏蔽了硬件的细节,⽤户不⽤关⼼硬件就可以编出⾃⼰的⽤户程序。
实验结果表明驱动程序的正确性,能提⾼整个系统的抗⼲扰能⼒,稳定性好,最⼤传输速率达到1Mb/s;硬件的错误检定特性也增强了CAN的抗电磁⼲扰能⼒。
2系统硬件设计 系统采⽤S3C44B0X微处理器,需要扩展CAN控制器。
常⽤的CAN控制器有和,这两种都⽀持CAN2.0B标准。
SJA1000采⽤的总线是地址线和复⽤的⽅式,但是嵌⼊式处理器外部总线⼤多是地址线和数据线分开的结构,这样每次对SJA1000操作时需要先后写⼊地址和数据2次数据,⽽且SJA1000使⽤5V逻辑电平。
所以应⽤MCP2510控制器进⾏扩展,采⽤。
MCP2510控制器特点:1.⽀持标准格式和扩展格式的CAN数据帧结构(CAN2.0B);2.0~8字节的有效数据长度,⽀持远程帧;3.最⼤1Mb/s的可编程波特率;4.2个⽀持过滤器的接受缓冲区,3个发送缓冲区;5.SPI⾼速串⾏总线,最⼤;6.3~5.5V宽电压范围供电。
MCP2510⼯作电压为,能够直接与S3C44B0X微处理器I/O⼝相连。
基于ARM Linux平台的CAN设备驱动程序设计与实现
廉 、 性高 、 干 扰能 力 强 、 信 方式 灵 活 等特 点 。 可靠 抗 通 目前 已经 广
王彦 堂 , 贻斌 , 李 宋 锐
W ANG n t n L - i S Ya - a g, I Yi b n, ONG 院 , 南 2 0 6 济 50 1
S h o fC nrlS in e a d E gn e n , h n o g Unv ri ,in n 2 0 6 , hn c olo o t ce c n n ie r g S a d n ies y J’ a 5 0 1 C ia o i t
l 引 言
C N(o t l rA e e ok 是一 种 非 常有 效 的支 持 实 时 A C nr l raN t r) oe w 控 制 和分 布式 控 制 的 串行 通 信 网络 。C N 总 线 由 于其 成 本 低 A
而 C N控 制 器通 过 C N收 发器 连 接到 C N 总线 网络上 , A A A C N 收 发 器 实 现 C N 总线 数 据 的 差 动 发 送 和 接 收 , 最 终 提 A A 它 供 了 C N 控制 器 与 物 理 总 线 的 连接 。 A
d s r e . t i d d s u s n r ma e o t e g n rl meh d f d v c r e e in n n ARM L n x n mp e n a in o e c b d Deal ic s i s a e i e o d n h e e a t o o e i e d v r d sg ig i i i u a d i l me t t f o C d vc rv rE p rme t n iae t a hs y t m s d q a ey t b l n ei be, u i a i l t cu e a d e s AN e ie d e . x e i i n s i d c t h t t i s se i a e u t l sa i a d r l l b t w t smp e sr tr n a y e a h u i lme tt n mp e na i . o Ke r s ARM i u ; N u ; e ie d v r p o r m y wo d : L n x CA b s d vc r e r g a i
Linux下基于MCP2515的CAN总线驱动程序设计
Linux下基于MCP2515的CAN总线驱动程序设计随着物联网技术的不断发展,嵌入式系统和传感器网络在各领域得到了广泛应用。
在这些系统中,可以利用CAN总线进行数据通信,实现设备之间的无缝连接和数据交换。
本文将介绍一种基于Linux系统的MCP2515的CAN总线驱动程序设计。
一、MCP2515MCP2515是一种SPI接口的CAN控制器,具有很高的集成度和灵活性。
它包括CAN控制器、CAN收发器和SPI接口。
MCP2515通过SPI接口与主控制器进行通信,可以实现CAN 节点之间的数据通信。
此外,MCP2515还支持各种标准和扩展CAN帧格式。
二、CAN总线驱动程序设计1、编写SPI驱动程序由于MCP2515是通过SPI接口与主控制器进行通信的,所以需要编写SPI驱动程序。
在Linux系统中,可以通过SPI驱动程序来实现与MCP2515的通信。
SPI口的驱动程序可能会因为系统的不同而有所差异。
2、编写CAN驱动程序在Linux中,可以使用SocketCAN实现CAN总线驱动程序。
SocketCAN是Linux内核自带的CAN协议栈,提供了丰富的API和工具,方便开发者开发CAN应用程序。
在编写CAN驱动程序时,需要先对MCP2515进行配置,设置CAN通信参数以及滤波器参数。
通过SocketCAN提供的API函数可以实现CAN帧的发送和接收,从而实现数据通信。
三、示例代码以下是基于Linux系统的MCP2515的CAN总线驱动程序设计的示例代码:1、SPI驱动程序可以通过spidev接口进行使用:```#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <sys/ioctl.h>#include <linux/spi/spidev.h>#define SPI_DEVICE "/dev/spidev0.0"int spi_fd;int spi_open(){if ((spi_fd = open(SPI_DEVICE, O_RDWR)) < 0){printf("Cannot open %s\n", SPI_DEVICE);return -1;}int mode = SPI_MODE_0;int bits_per_word = 8;int speed = 1000000;if (ioctl(spi_fd, SPI_IOC_WR_MODE, &mode) < 0)return -1;if (ioctl(spi_fd, SPI_IOC_WR_BITS_PER_WORD,&bits_per_word) < 0)return -1;if (ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) return -1;return 0;}int spi_close(){close(spi_fd);return 0;}int spi_write_read(char *buf, int len, int speed_hz){int ret;struct spi_ioc_transfer transfer;transfer.tx_buf = (unsigned long)buf;transfer.rx_buf = (unsigned long)buf;transfer.len = len;transfer.speed_hz = speed_hz;transfer.bits_per_word = 8;transfer.delay_usecs = 0;ret = ioctl(spi_fd, SPI_IOC_MESSAGE(1), &transfer); return ret;}```2、CAN驱动程序可以通过SocketCAN提供的API函数实现:```#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <sys/ioctl.h>#include <net/if.h>#include <linux/can.h>#include <linux/can/raw.h>int can_fd;int can_init(const char *ifname){if ((can_fd = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {perror("Socket error\n");return -1;}struct ifreq ifr;strcpy(ifr.ifr_name, ifname);if (ioctl(can_fd, SIOCGIFINDEX, &ifr) < 0){perror("SIOCGIFINDEX error\n");return -1;}struct sockaddr_can addr;memset(&addr, 0, sizeof(addr));addr.can_family = AF_CAN;addr.can_ifindex = ifr.ifr_ifindex;if (bind(can_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0){perror("Bind error\n");return -1;}return 0;}int can_deinit(){close(can_fd);return 0;}int can_send(unsigned int id, unsigned char *data, unsigned char len){struct can_frame frame;memset(&frame, 0, sizeof(struct can_frame));frame.can_id = id;frame.can_dlc = len;memcpy(frame.data, data, len);int ret = write(can_fd, &frame, sizeof(struct can_frame));if (ret != sizeof(struct can_frame)){perror("Write error\n");return -1;}return 0;}int can_recv(unsigned int *id, unsigned char *data, unsigned char *len){struct can_frame frame;int ret = read(can_fd, &frame, sizeof(struct can_frame));if (ret < 0){perror("Read error\n");return -1;}*id = frame.can_id;memcpy(data, frame.data, frame.can_dlc);*len = frame.can_dlc;return 0;}```四、结语在Linux系统中,基于MCP2515的CAN总线驱动程序设计相对较为简单,可以利用SocketCAN实现。
基于Can总线的嵌入式网络控制节点的设计与实现
A ME T L公 司 生 产 的 一 款 高 性 能 的 A 9处 理 M R
器 , 它 是 一 款 通 用 工 业 级 AR 芯 片 , 主 频 为 M
10 8 MHz2 0 P ,已 经在 工业 控 制 、智 能仪 器仪 /0 MIS 表等领 域 内得 到 了大量 的成 功应 用 。 C AN控 制 器 选 用 的是 S A10 J 0 0芯 片 ,它 是
1 节点的接 口电路设计
本文设 计 的 C AN 总 线 节 点 是 某 工 业 控 制 系 统 的 一 个 子 模 块 , 同 时 综 合 考 虑 其 它 相 关 需 求 和 功 能 扩 展 , 因 此 选 用 了 A 9 R 2 0处 理 器 T l M9 0 作 为 系 统 的 核 心 处 理 单 元 。A 9 R 2 0 T 1 M9 0 …是
中 ,C AN( o t l r raNe r)是 B sh公 司 C nr l e t k oeA wo oc
在 现 代 汽 车 应用 技 术 中领 先推 出 的一 种 串 行通 信
网络 。C N 主 线 采 用 多 主站 工 作 方 式 ,根据 优 先 A
权 进 行 总 线 访 问仲 裁 ,能 够 检 测 出通 信 过 程 产 生
性 ,进 一步降低上 层应用程序 的开发难度 。本文 以A 9 R 9 0处理器为例 ,对基于A M T 1 M 20 R 芯 片的 高性 8C N 块的具体设计过程 进行了介绍 ,对硬件 设计中的关键性问 题和 A M— i x  ̄A 模 R Ln u 系统下C N 制器驱 动程序的 实现 结构作 了详细分析 。本文给出 的设 计示例也 为基于其他嵌 A控 入式设备的C N A 模块开发提供了参考 ,有一定借鉴价值 。 关键 词 ; A 9R 20 A ;S A 0 T 1 M90 ;O N J 10 ;设备 驱动程序 0
嵌入式Linux2_6内核的CAN驱动设计与实现
33962010,31(15)计算机工程与设计Computer Engineering and Design0引言在嵌入式领域中,Linux2.6内核除了提高其实时性能,系统地移植更加方便,同时添加了新的体系结构和处理类型,可以支持大容量内存模型、微控制器,同时,还自带了很多总线驱动程序,虽然Linux 并非一个真正的实时操作系统,但2.6内核的改进能够满足大部分的应用需求,所以Linux2.6内核将会在嵌入式系统领域中大展身手[1]。
CAN (controller area network )是一种有效支持分布式控制或实时控制的串行通信网络,CAN 协议的最大特点是数据块的标识码可由11位或29位二进制数组成,可定义211或219个不同的数据块,使得CAN 总线构成的网络节点的数据通信实时性更强,提高了系统的可靠性和灵活性[2]。
传统的嵌入式系统CAN 总线驱动设计是基于嵌入式Linux2.4内核,本文着重研究和实现了在嵌入式Linux2.6内核的S3C2410开发板上使用Linux2.6自带的SPI 驱动实现CAN 总线的开发,并详细分析了在嵌入式Linux2.6.24内核下加载和声明SPI 总线的具体步骤,CAN 总线驱动初始化和中断控制的设计方法,以及CAN 驱动加载步骤。
1系统硬件设计系统硬件设计主要由微处理器S3C2410、带SPI 接口的独立CAN 控制器MCP2510与高速CAN 收发器TJA1050等器件组成[3]。
1.1芯片介绍(1)S3C2410:S3C2410是一款为手持设备和一般类型应用提供的一款高性能、低功耗、低价格微处理器。
内部采用高级微控制总线(AMBA )体系结构,主频高达203MHz ,集成3通道UART ,4通道DMA ,2通道的SPI [4]。
(2)MCP2510:MCP2510完全支持CAN 总线V2.0A/B 技术规范,能够发送和接收标准和扩展报文,同时具备验收过滤以及报文管理功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CAN总线在嵌入式Linux下驱动程序的实现时间:2009-11-05 09:41:22 来源:微计算机信息作者:黄捷峰蔡启仲郭毅锋田小刚1 引言基于嵌入式系统设计的工业控制装置,在工业控制现场受到各种干扰,如电磁、粉尘、天气等对系统的正常运行造成很大的影响。
在工业控制现场各个设备之间要经常交换、传输数据,需要一种抗干扰性强、稳定、传输速率快的现场总线进行通信。
文章采用CAN总线,基于嵌入式系统32位的S3C44B0X微处理器,通过其SPI接口,MCP2510 CAN控制器扩展CAN总线;将嵌入式操作系统嵌入到S3C44B0X微处理器中,能实现多任务、友好图形用户界面;针对S3C44B0X微处理器没有内存管理单元MMU,采用uClinux嵌入式操作系统。
这样在嵌入式系统中扩展CAN设备关键技术就是CAN设备在嵌入式操作系统下驱动程序的实现。
文章重点解决了CAN总线在嵌入式操作系统下驱动程序实现的问题。
对于用户来说,CAN设备在嵌入式操作系统驱动的实现为用户屏蔽了硬件的细节,用户不用关心硬件就可以编出自己的用户程序。
实验结果表明驱动程序的正确性,能提高整个系统的抗干扰能力,稳定性好,最大传输速率达到1Mb/s;硬件的错误检定特性也增强了CAN的抗电磁干扰能力。
2 系统硬件设计系统采用S3C44B0X微处理器,需要扩展CAN控制器。
常用的CAN控制器有SJA1000和MCP2510,这两种芯片都支持CAN2.0B标准。
SJA1000采用的总线是地址线和数据线复用的方式,但是嵌入式处理器外部总线大多是地址线和数据线分开的结构,这样每次对SJA1000操作时需要先后写入地址和数据2次数据,而且SJA1000使用5V逻辑电平。
所以应用MCP2510控制器进行扩展,收发器采用82C250。
MCP2510控制器特点:1.支持标准格式和扩展格式的CAN数据帧结构(CAN2.0B);2.0~8字节的有效数据长度,支持远程帧;3.最大1Mb/s的可编程波特率;4.2个支持过滤器的接受缓冲区,3个发送缓冲区;5.SPI高速串行总线,最大5MHz;6.3~5.5V宽电压范围供电。
MCP2510工作电压为3.3V,能够直接与S3C44B0X微处理器I/O口相连。
为了进一步提高系统抗干扰性,可在CAN控制器和收发器之间加一个光隔6N137。
其结构原理框图如图1:图1.S3C44B0X扩展CAN结构框图图2.字符设备注册表3 CAN设备驱动程序的设计Linux把设备看成特殊的文件进行管理,添加一种设备,首先要注册该设备,增加它的驱动。
设备驱动程序是操作系统内核与设备硬件之间的接口,并为应用程序屏蔽了硬件细节。
在linux中用户进程不能直接对物理设备进行操作,必须通过系统调用向内核提出请求,由内核调用相应的设备驱动。
因此首先建立Linux设备管理、设备驱动、设备注册、Linux 中断这几个概念。
3.1 Linux的设备管理Linux支持各种各样的外围设备,对这些设备的管理通称为设备管理。
设备管理分为两部分:一部分是驱动程序的上层,与设备无关的,这部分根据输入输出请求,通过特定的设备驱动程序接口与设备进行通信;另一部分是下层,与设备有关的,通常称为设备驱动程序,它直接与硬件打交道,并且向上层提供一组访问接口。
Linux设备管理为了对设备进行读、写等操作,把物理设备逻辑化,把它看成特殊的文件,称为设备文件,采用文件系统接口和系统调用来管理和控制设备。
Linux把设备分为三类,块设备、字符设备和网络设备。
每类设备都有不同管理控制方式和不同的驱动程序,这样方便于对系统进行裁减。
Linux内核对设备的识别是根据设备类型和设备号。
在字符设备中使用同一个驱动程序的每种设备都有唯一的主设备号。
CAN设备通过在/vendor/Samsung/44b0/Makefile文件下设置设备类型和设备号分别为can、125。
3.2 file_operations结构体Linux对设备操作的具体实现是由设备驱动程序完成。
设备驱动程序加载到系统中通过设备注册实现。
Linux驱动程序对文件的操作通过file_operations结构体来完成。
file_operations结构体是文件操作函数指针的集合。
在设备管理中该结构体各个成员项指向的操作函数就是设备驱动程序的各个操作例程,编写驱动程序实质上就是编写该结构体中的各个函数。
对不同的设备可以配备其中全部或部分的操作函数,不使用的函数指针置为NULL。
下面是CAN设备file_operations结构体:Static struct file_operations {write: s3c44b0_mcp2510_write,//写操作read: s3c44b0_mcp2510_read,//读操作ioctl: s3c44b0_mcp2510_ioctl,//读写之外的操作open: s3c44b0_mcp2510_open,//打开设备release: s3c44b0_mcp2510_release};//关闭设备这个结构的每一个成员的名字都对应着一个系统调用。
用户进程利用系统调用,来调用自己的驱动接口,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。
3.3 设备注册在linux中,当一种设备安装到系统时必须向系统进行注册,设备注册的主要任务是把设备驱动程序加载到系统中。
Linux对不同的设备(如字符设备和块设备)分开进行注册管理。
每个设备描述符包括两个指针:name指向设备名字符串,fops指向文件操作函数结构file_operations,该结构体中包含着指向驱动程序各个操作例程的指针。
图2给出了linux 字符设备注册表的示意图。
CAN字符设备的注册函数是内核函数:register_chrdev(MAJOR_NR,DEVICE_NAME,&s3c44b0_mcp2510_fops);其中参数DEVICE_NAME表示设备名,s3c44b0_mcp2510_fops表示指向file_operations结构体的指针,即指向设备的驱动程序。
3.4 Linux中断的处理在linux系统里,对中断的处理是属于系统核心部分,因而如果设备与系统之间以中断方式进行数据交换,就必须把该设备的驱动程序作为系统核心的一部分。
设备驱动程序通过用request_irq函数来申请中断,通过free_irq来释放中断。
由于本实验未用到中断,因此在此不作详细介绍。
3.5 CAN驱动程序的实现3.5.1 编写驱动程序操作例程CAN设备属于字符设备,对于CAN总线设备,除了发送(使用write方法)、接受(使用read方法)以外,还需要控制CAN总线通信的波特率、设置工作模式、设置ID等,所以使用ioctl是最合适的方法。
CAN驱动程序的入口函数:int __init s3c44b0_mcp2510_init(void){ARMTargetInit();//初始化ARMinit_MCP2510(BandRat125kbps);//初始化CAN控制器ret=register_chrdev(MAJOR_NR,DEVICE_NAME,&s3c44b0_mcp2510_fops);}//注册CAN设备CAN驱动程序的退出函数:void __exit s3c44b0_mcp2510_exit(void){unregister_chrdev(MAJOR_NR,DEVICE_NAME);printk("MCP2510 Eixt!n");}CAN总线在嵌入式Linux下驱动程序的实现时间:2009-11-05 09:41:22 来源:微计算机信息作者:黄捷峰蔡启仲郭毅锋田小刚编写CAN设备驱动程序各个操作例程:1.ioctl函数:Static int s3c44b0_mcp2510_ioctl (struct inode * inode,struct file *file, unsined cmd ,unsigned long arg){switch(cmd){case SETBAND://设置波特率MCP2510_SetBandRate(BandRate,TRUE);break;case SETLPBK://设置工作方式MCP2510_Write(CLKCTRL, MODE_LOOPBACK| CLK| CLK1);break;case SETID://设置标识符MCP2510_Write_Can_ID(RXF0SIDH,U8 ID,0);break;case SETFILTER: //设置屏蔽码MCP2510_Write_Can_ID(RXM0SIDH,0x1ff,0);break;}}2.open函数(打开设备):static int s3c44b0_mcp2510_open(struct inode *inode,struct file *file){printk("device openn");return 0;}3.write函数(发送数据):static ssize_t s3c44b0_mcp2510_write(struct file *file,const char *buffer,size_t count,loff_t*ppos){copy_from_user(&temp,buffer,sizeof(mcpcan_data)); canWrite(temp.id,temp. data,temp.DataLen,temp.IdType,temp.BufNo);}//发送数据函数4.read函数(接收数据):static ssize_t s3c44b0_mcp2510_read(struct file *file,char *buffer,size_tcount,loff_t *ppos){Revdata(0x66,datas,0x08);//接收数据函数copy_to_user(buffer,Receivedata.data,0x08);return count;}3.5.2交叉编译CAN驱动程序交叉编译驱动程序需要一台装了Red Hat Linux的宿主机。
安装交叉编译工具的方法请参考相关文档(交叉编译工具:arm-elf-tools-20030314.sh)。
驱动程序的使用可以按照两种方式进行编译,一种是静态编译进内核,一种是编译成模块以供动态加载。
由于uclinux 不支持模块动态加载,所以这里只介绍将驱动程序静态编译进内核的方法。
为了让编译器编译所添加的驱动程序,需要修改相关文件。