Linux环境下实现基于ARM9的CAN总线通信

发布者:独行侠客最新更新时间:2011-11-19 关键字:Linux环境  ARM9  CAN总线通信 手机看文章 扫描二维码
随时随地手机看文章
  1.  引言

  CAN(Controller Area Network)总线最早是由德国BOSCH公司提出,实现汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。由于其具有成本低,实时性好,容错性高,设计灵活等特点,目前已被广泛的应用于各种工业领域,被公认为是最有前途的现成总线之一。与此同时,随着ARM(Advanced RISC Machines)芯片及嵌入式Linux操作系统的成熟与完善,使得CAN通信的开发更为便利,应用更为广泛。本文就将从硬件,软件两方面介绍一种在Linux环境下实现基于EP9315的CAN总线通信方式。

  2.  硬件介绍及其接口实现

  本设计选用的是Cirrus Logic公司推出的EP9315处理器及PHILIPS公司推出的SJA1000独立CAN控制器。下面先对两款芯片作简要介绍,再对CAN接口硬件电路设计作详细说明。

  2.1  EP9315及SJA1000芯片简介

  EP9315是EP93XX系列微处理器的旗舰产品。内嵌先进的运行于200MHz(工业条件下推荐运行184MHz)的ARM920T微处理器核,以及支持Linux,Windows CE等操作系统的存储器管理单元MMU,16KB指令高速缓存和16KB数据高速缓存可为现有的程序和数据提供零等待时间,或者以锁存的方式确保对关键指令和数据的无延迟存取。EP9315内部集成了MaverickCrunch 数学协处理器和MaverickKey 硬件可编程ID,前者显著提高了ARM920T的浮点,整形运算与信号处理能力,同时它还具有丰富的集成外设接口,包括1/10/100Mbps以太网MAC,3通道USB2.0全速主口,SPI、I S和AC’97串行接口,PCMCIA接口,Raster/LCD接口,图像加速器,带12位A/D转换器的触摸屏接口,键盘接口,UART接口,丰富的GPIO,支持4组32位SDRAM的无缝连接等。

  SJA1000是一款高性能的CAN控制器,支持BasicCAN和PeliCANl两种工作模式,提供INTEL和Motorola两种寻址方式,地址线和数据线分时复用,SJA1000基于寄存器编址,可以通过读写寄存器来操作它。

  2.2  硬件接口电路设计

  EP9315带有16个增强型GPIO,可以通过配置PADR、PADDR寄存器使得EGPIO2控制SJ1000的ALE址锁存信号,EGPIO3接收SJA1000的中断信号,并且可以配置中断类型。由于SJA1000的数据线与地址线分时复用, 当在送地址时,RD、WR、CS信号必须无效,送数据或读数据时,RD、WR、CS信号才有效,因此结合CPLD(EPM7032芯片)或是一些逻辑门来实现该逻辑,并片选两个BANK来分别用于地址操作(nCS5_PHYBASE 0x50000000)和数据操作(nCS3_PHYBASE 0x30000000)。当读SJA1000时,首先由EP9315通过CS选通SJA1000,通过EGPIO2使得ALE有效,锁存地址,并由CS5经CPLD选通FLASH的BANK5,将地址存入映射后的BANK5区域,然后使得ALE为0取消地址锁存,最后置低EP9315的RD信号,经74LV32后使得SJA1000的读信号有效,完成读操作;写操作时,同理选通SJA1000,使能ALE,发送地址并将其锁存在BANK5,然后取消ALE,置低EP9315的WR信号,通过74LV32使能SJA1000的WR信号,接着发送数据置映射后的BANK3,将数据写入SJA1000,完成写操作。

  3.  软件分析及实现

  本文采用Linux系统,内核版本为2.4.21-rmk1,搭建ARM-LINUX交叉编译环境同时利用动态模块加载法来进行驱动开发。模块化的优点在于能将内核映像尺寸保持在最小,并且具有最大的灵活性,便于检验新的内核代码而不需重新编译,引导内核。Shell用户应用程序的开发主要采用了GDB远程调试技术,该调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。驱动程序与应用程序的整体流程图如图2所示。


  图2 驱动程序与应用程序的整体流程

  3.1  Linux下CAN驱动的实现

  CAN设备属于字符型设备,是以字节为单位逐个进行I/O操作的设备,在对它发出读写请求时,实际的硬件I/O紧接着就发生了。字符型设备的缓存是可有可无的,而且也不支持随机访问。应用程序可以通过标准系统调用像访问字节流(类似文件)一样来打开,读,写,关闭字符型设备。

  驱动程序主要由一下4个关键环节组成:

  ⑴模块的初始化 module_init(Mysja1000_init)

  模块的初始化函数负责注册模块所提供的任何设施。module_init的使用是强制性的,这个宏会在模块的目标代码中增加一个特殊的段,用于说明内核初始化函数所在的位置。没有这个定义,初始化函数永远不会调用。当模块正常初始化时,在初始化函数中完成了对CAN设备以及设备中断的注册,对SJA1000芯片中相关寄存器的配置,对EP9315中的EGPIO口的初始化设置,并且利用函数void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) 将IO地址空间映射到内核的虚拟地址空间上去,这样就可以像读写RAM那样读写IO内存资源了。

  ⑵服务于I/O请求的子程序

  这部分程序又被称为是驱动程序的上半部分。调用这部分程序是由于系统调用的结果。当该部分程序执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态。由于此部分程序是驱动程序与应用程序的接口,所以必须通过Linux下的一个关键的数据结构file_operations来实现该文件操作接口。file_operations结构中的成员几乎全是函数指针,实质上是一个函数跳转表。例如can_open入口点用来打开CAN设备准备进行I/O操作;can_read入口点用来实现接收CAN数据帧;can_write入口点用来实现发送CAN数据帧;can_ioctl入口点提供了一种执行CAN设备特定操作的方法,通过ioctl来实现对SJA1000寄存器的读写操作,使用户根据需要方便的配置SJA1000状态等等。

  ⑶中断服务子程序

  这部分程序又被称为是驱动程序的下半部分。Linux系统负责接收硬件中断,再由系统调用中断服务子程序,而不是直接从ARM的中断向量表中调用这部分程序。在模块初始化时已经利用request_irq( )函数注册了设备中断,所以当IRQ(中断请求)产生时,ISR(中断服务例程)运行。在中断服务程序中,首先要读取SJA1000的中断寄存器IR的值,识别中断源,比如当接收中断位RI为1则说明是接收中断,进而调用接收函数来接收数据。当CPU读取这个只读存储器时,除了RI位外的所有位都被复位。

  ⑷缓冲区操作

  SJA1000内部设有发送缓冲器TXB(13个字节),接收缓冲器RXB(13个字节)和RXFIFO(64个字节)。其中TXB是CPU和BSP(位流处理器)之间的接口,存储发送到CAN网络上的完整报文。接收缓冲器是接收过滤器和CPU之间的接口,用来接收和存储CAN总线上的报文,RXB是RXFIFO的一个窗口,可被CPU访问。为了提高收发效率,在驱动中开辟软件缓冲区,大小可以根据需要设置,将大量数据经过软件缓冲区后再进行处理。在操作软件缓冲区时,采用生产者/消费者模型,分别设定数据存入与读出的指针,并且利用memcopy函数完成对帧数据的操作。比如读取数据时,首先在操作模式下将SJA1000中起始地址为16的RXB数据读入一个数组,经过一些必要判断,再将此数组中的数据由memcopy函数传入指定的软件缓冲区。硬件缓冲与软件缓冲间一次传递一帧数据,帧有标准帧与扩展帧之分。

  3.2  Shell应用程序的实现

  Shell应用程序主要是为用户提供一系列方便直观的接口,使得用户不必了解硬件工作的细节,不必研究驱动的具体实现,而仅仅根据自身的需要,通过一些简单明了的命令来完成所要求的任务。本文就将在Shell应用程序中实现以下命令功能:

  init初始化寄存器,rsja读取寄存器值,wsja写寄存器,gfrm收数据帧,sfrm发数据帧,conf配置滤波器,help帮助,exit退出。

  在主函数main中,通过int open(const char * filename, int mode)函数打开CAN设备,得到一个文件句柄fd,将此句柄传递给shell函数,这样就可以在各个命令函数中对CAN设备进行操作,比如可以在函数int write_sja1000(int fd,unsigned char addr, unsigned char value)中使用ioctl(fd,SJA_WRITE,®_data)来实现对SJA1000寄存器的写操作。

  在shell应用程序中,可以设定一个字符数组char cmd[5],通过fgets(cmd,5,stdin)来接收用户键入的命令,再经过strcmp函数辨认出用户的命令类型,执行相关操作。为避免输入缓冲区出现垃圾导致命令识别出现错误,需要及时清空输入缓冲,而当gcc中fflush函数无效的情况下,则可以通过while((c=getchar())!='n'&&c!=EOF){ }来清空输入缓冲。

  完成了所有驱动以及应用程序的编写后,用Makfile文件制定编译规则,然后根据规则进行编译,调试成功后可将二进制代码通过超级终端下载到板子运行,至此结束所有工作。

  4. 结语

  本文提供了一种EP9315与CAN控制器SJA1000的接口方案,详细分析了Linux操作系统下驱动与应用程序的原理及开发流程,实现了CAN设备通信,并在实际应用和测试中证明了该设计的正确性和可靠性。由于嵌入式Linux的众多优势以及CAN的实时性,易用性,可靠性等优点,它们将在工业控制及生活的各个领域具有更广泛的应用前景。

  本文作者创新点:利用EP9315与SJA1000实现CAN总线通信,完成了由硬件连接,底层驱动以致上层应用软件的所有工作,利用软件方便稳定的控制CAN通信。

关键字:Linux环境  ARM9  CAN总线通信 引用地址:Linux环境下实现基于ARM9的CAN总线通信

上一篇:基于LVDS总线的高速长距数据传输的设计
下一篇:Molex Impact™ 100欧姆直接正交连接器架构提供最高25 Gbps数据速率

推荐阅读最新更新时间:2024-05-02 21:43

嵌入式Linux环境下MiniGUI的研究与移植
   前言    近年来随着嵌入式设备与市场需求的广泛结合,手机、PDA、DVD播放机等产品的应用对可视化操作界面的简洁和方便提出了更高的要求,这都需要一个稳定可靠的高性能GUI系统来提供支持。图形用户界面(Graphic User Interface,简称GUI)的广泛流行是当今计算机技术的重要成就之一,它极大地方便了非专业用户的使用,人们可以通过窗口、菜单方便地进行操作。由于嵌入式系统实时性要求高,同时嵌入式系统硬件配置又有限,所以对轻型GUI的需求更加突出。另外,嵌入式系统往往是一种订制设备,它们对GUI的需求也各不相同,因此GUI也必须是可订制的。综上所述,嵌入式系统对GUI的基本要求应包括轻型、占用资源少、高性能、高
[嵌入式]
ARM9 (2440A) 从启动代码到应用程序(Main) 1
ARM9(2440A) 从启动代码到应用程序 说一下从启动代码到Main函数的过程,以及到了Main还需要设置些什么,才算是一个完整的应用程序。 启动代码 我们知道,uboot的第一阶段的功能是:(1)定义入口;(2)设置异常向量(exception vector);(3)设置CPU的速度、时钟频率及中断控制寄存器;(4)初始化内存控制器 ;(5)将rom中的程序复制到ram中;(6)初始化堆栈;(7)转到ram中执行; 其实我们要实现的启动代码功能也就是实现这些功能,最后跳转到我们自己的应用程序入口。只是这里的启动代码,我们不用uboot来实现,可以说是根据自己的需求来实现,毕竟uboot代码量不小。 keil下创建
[单片机]
<font color='red'>ARM9</font> (2440A) 从启动代码到应用程序(Main) 1
基于ARM的橡塑机械双层网络监控器设计
0 引言 橡塑机械是现代制造技术中一类重要工具,是一种由数控装置、伺服驱动装置、机床主体和其他辅助装置构成的机电一体化产品,它被广泛应用在橡塑产品加工制造领域。随着科技的进步,橡塑机械正朝着高速度、智能化、多功能化、高可靠性的方向发展。在监控系统方面,尤其是近年来,也发展得更为集成化、网络化。作为提升橡塑机械性能的一个重要组成部分,其监控系统也得到了长足的发展。本文设计了一款基于ARM9、嵌入式Linux以及CAN总线技术的应用于橡塑机械的双层网络监控器,并介绍了成功应用于橡塑机械的实例。 1 双层网络系统整体设计 系统基于工业现场监控集成化、自动化的理念设计了下层CAN总线结构。在现场监控部分,监控器所需要完成
[单片机]
基于ARM9的一种新型馈线自动化终端设计
引言 随着智能电网研究的兴起和城乡电网结构的不断改进,对配电网自动化提出了更高的要求。具有选择性、能快速切除故障、具备故障自愈能力的馈线终端(Feeder Terminal Unit,FTU)成为研究热点。参考文献中基于数字处理器DSP,参考文献中应用ARM与DSP分别开发设计了馈线自动化终端装置。 上述参考文献采用不同的处理器,使用不同的技术,设计了配电网馈线终端,但所设计装置存在着成本高、配置灵活性低和安装布线困难等问题。ARM微处理器具有较强的处理能力,运算速度快、性能高、功耗低、成本低、体积小,是馈线终端核心控制器件的首选。物联网技术是新一代信息技术的重要部分,具有广阔的应用前景,可以实现馈线终端数据无线通信。新型能源太阳
[单片机]
基于<font color='red'>ARM9</font>的一种新型馈线自动化终端设计
基于IPv6和ARM9的地震烈度计开发
以低功耗微型电容式三轴向加速度传感器作为传感部件,采用基于ARM9的嵌入式系统并定制Linux作为总控系统,选择符合802.11b标准的无线通讯技术作为仪器的网络接入方式,研制完成基于无线IPv6的SI一2型地震烈度计,实现了地震烈度的网络化、数字化观测,解决了我国缺乏直接测定地震烈度仪器的问题。   引 言   当前国内外已建设的城市地震灾害速报系统一般以地震烈度计观测系统为主体。日本东京煤气公司在1994年就完成了由331台谱烈度计、20台液化传感器和5台强震仪构成的地震监测与震害快速评估系统(SIGNAL)。阪神地震取得显著的减灾效益后,东京煤气公司于1997年~2007年的十年间布设了3 800个新型地震谱烈度计。
[单片机]
基于IPv6和<font color='red'>ARM9</font>的地震烈度计开发
基于ARM9系统的远程图像无线监控的设计
对图像监控系统,用户常常提出这样的功能需求:希望能够监控距离较远的对象。这些对象有可能分布在郊区、深山,荒原或者其他无人值守的场合;另外,希望能够获取比较清晰的监控图像,但对图像传输的实时性要求并不高,很明显,用传统的PC机加图像采集卡的方式很难满足这样的需求。 在嵌入式领域,ARM9系列微处理器在高性能和低功耗方面提供了最佳的性能,因此选用ARM9嵌入式处理器S3C2440设计实现了一个远程图像光线监控系统通过这个系统,可以远在千里之外控制一个摄像机进行图像采集并回传。如果这个摄像机有一个485接口的云台,还可以通过互联网远程控制摄像机的取景角度、镜头拉伸、聚焦等功能. 除了获取图像数据.系统还提供了多路开关控制和
[单片机]
基于<font color='red'>ARM9</font>系统的远程图像无线监控的设计
基于ARM的嵌入式网络收音机的设计
  收音机作为接收广播的工具,经过漫长的发展过程,由单波段发展到多波段,由电子管,晶体管发展到集成电路,由机械调谐发展到数字调谐功能等,其技术和品质都有了长足的进步。如今,在收音机这个家族中新的成员也在不断加入,如卫星广播接收机等。当社会进入网络时代后,更是出现了网络收音机这种跨越全球的信息接收设备。但是,目前这种网络收音机大多是通过基于PC机上的软件开发来实现的其功能的,也就是说这种网络收音机不能脱离电脑这种相对比较大的和比较昂贵的设备。   为了克服PC机形式的网络收音机的缺点,本文研究了一种基于ARM的嵌入式技术的网络收音机的设计方案。该方案以ARM处理器及其外围模块作为硬件平台,以嵌入式Linux作为操作系统,以Mp
[单片机]
基于ARM的嵌入式网络收音机的设计
嵌入式Web服务器移植与测试
随着计算机技术和现代通信技术的不断发展,设备即网络是后PC时代对嵌入式系统的客观要求,因此也需要建立嵌入式设备的网络Web服务器。嵌入式Web能够实现在各种工业监控、检测、以及自动化控制等领域的远程控制,世界上无论任何地方,只要是存在Internet网络,都能够通过Web服务对各种现场进行管理,甚至可以在有网络的手持设备上对现场进行控制管理操作。传统的Web服务器大多在大型机,PC机上实现,其成本比较高,而且不方便工业现场的应用实施,嵌入式系统以及嵌入式小型Web服务器的出现使得Web服务运行在资源、性能有限的嵌入式设备上提供了条件。本文主要介绍嵌入式Web服务器BOA在arm9嵌入式系统设备板上的移植,并对移植后的BOA服务器进行
[单片机]
嵌入式Web服务器移植与测试
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved