您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 基于Can总线的嵌入式网络控制节点的设计与实现(电科院2011)
1基于Can总线的嵌入式网络控制节点的设计与实现2011.8发表于制造业自动化北大核心期刊摘要:采用ARM芯片替代传统CAN总线节点的单片机单元已经是一种理想经济的设计选择,这样不仅提高了硬件的运算处理能力,还可以通过运行嵌入式操作系统增强模块的智能性和扩展性,进一步降低上层应用程序的开发难度。本文以AT91RM9200处理器为例,对基于ARM芯片的高性能CAN模块的具体设计过程进行了介绍,对硬件设计中的关键性问题和ARM-Linux系统下CAN控制器驱动程序的实现结构作了详细分析。本文给出的设计示例也为基于其它嵌入式设备的CAN模块开发提供了参考,有一定借鉴价值。关键词:AT91RM9200;CAN;SJA1000;设备驱动程序中图分类号:TP274+.2文献标识码:ADesignandImplementationofEmbeddedControlUnitBasedonCANBusAbstract:ApplyingARMprocessortoreplace8/16-bitMCUasthecentralprocessorofthecontrolunitbasedonCANbushasbeenaperfectandeconomicalchoicetoday.Bythismeans,thecapabilityofcontrolnodewasgreatlyimproved;especiallyformanycomplexcases,theworkloadofuserapplicationshasbeenobviouslysimplifiedbyrunningtheembeddedoperatingsystemonit.BasedonAT91RM9200withARM-Linuxoperatingsystem,thepaperintroducesthewholedesignprocessofoneembeddedcontrolunitbasedonCANbusindetail,analyzingthekeypointpresentinthehardwaredesignandthedevice-driverimplementationofCANcontroller.ThedesignpresentinthepapercanalsobeusedindesignofCANdevicesbasedonotherembeddedsystems.Keywords:AT91RM9200;CAN;SJA1000;DeviceDrivers0引言近年来,基于各种总线标准的网络化控制系统已经在工业控制领域内得到广泛应用。网络化控制系统采用了完全分散化的控制节点结构,将控制的权力很大部分交给了处于控制现场的智能节点,系统内各种交互信息通过现场总线传送。当前已实用化的总线标准有许多种,如WorldFIP、Profibus、LONWORKS、CAN等。其中,CAN(ControllerAreaNetwork)是Bosch公司在现代汽车应用技术中领先推出的一种串行通信网络。CAN主线采用多主站工作方式,根据优先权进行总线访问仲裁,能够检测出通信过程产生的任何错误。CAN总线还具有卓越的信号传输性能,当信号传输距离达到10km时,它仍可提供高达50Kbit/s的数据传输速率。另外,CAN协议废除了站地址编码,而采用对通信数据块编码的方式,这样使得网络内的节点个数在理论上不受限制的。目前,CAN总线已经在许多行业得到了广泛的应用,尤其是工业控制领域,并常被认为是最有前途的现场总线之一。常用的CAN总线节点一般采用的是“单片机+CAN控制器”的结构,这样由于运算能力的限制,这类节点的智能化程度较低,常是作为工控机节点的从节点。而近年来,以ARM为代表的嵌入式32位微处理器技术得到了飞速发展,无论是在功耗、便携性还是在硬件成本上,许多高性能的ARM芯片已经与单片机相差无几,因此在CAN节点设计中,使用ARM芯片取代传统的8/16位单片机已经是一个非常实用的选择。这样设计的CAN节点,不仅保留了低功耗、低成本和小体积的优点,而性能却得到了大幅提高,若辅以大容量的存储器,同时运行功能强大的嵌入式操作系统,它几乎已可以取代原先的工控机节点。本文则从软硬件两方面详细介绍了上述设计方案的具体实现过程.1节点的接口电路设计本文设计的CAN总线节点是某工业控制系统的一个子模块,同时综合考虑其它相关需求和功能扩展,因此选用了AT91RM9200处理器作为系统的核心处理单元。AT91RM9200[1]是ATMEL公司生产的一款高性能的ARM9处理器,它是一款通用工业级ARM芯片,主频为180MHz/200MIPS,已经在工业控制、智能仪器仪表等领域内得到了大量的成功应用。CAN控制器选用的是SJA1000[2]芯片,它是Philips公司生产的一款独立CAN总线控制器芯片,专用于移动目标和一般工业环境中控制器局域网络(CAN)。SJA1000本质上是早期的PCA82C200的升级产品,与后者在管2脚、电气特性上完全兼容,而且除具有基本CAN工作模式(BasicCAN)外,还增加了一种新的增强工作模式(PeliCAN),这种新模式支持具有许多新特性的CAN2.0B协议。SJA1000的总线接口采用的是地址总线和数据总线复用的方式,这种方式与类似51也采用总线复用架构的处理器接口很方便,并在读写时序上也很好配合,但当与数据总线和地址总线分离的微处理器接口时,则需要专门的读写逻辑与之配合,并且还相对比较复杂,基于这个原因,目前许多设计都采用诸如SPI等专用接口的CAN总线控制器,但这种方式使应用受到了诸多限制,如要求微处理器必须有SPI接口,同时当系统需要多路CAN总线接口时,会受到SPI端口数的限制等。ARM架构的数据总线和地址总线是分离的,因此,必须引入专门的控制逻辑,才能实现对SJA1000的操作。图1-1SJA1000的读操作时序(Intel模式)图1-2SJA1000的写操作时序(Intel模式)图1-1和图1-2分别为SJA1000读/写操作时序。分析其读/写时序,可以看出,无论是读操作还是写操作,首先必须送出操作寄存器的地址,然后读/写数据。在写地址的过程中,片选信号(/CS)和读(/RD)、写(/WR)均无效(高电平),仅ALE信号有效(高电平),而在读/写数据的过程中,读/写信号有效(低电平),ALE信号无效(低电平),同时,在操作的过程中,还必须满足信号电平的持续时间。因此,可以采用如图1-3所示的控制逻辑实现。3图1-3SJA1000操作时序的实现在图1-3所示的SJA1000操作时序的实现中,左端的信号如/CS、/RD、/WR、A7分别为ARM微处理器的片选、读、写控制信号,A7为地址信号(也可以是其它的地址),右端产生的ALE_CAN、/CS_CAN、/WR_CAN、/RD_CAN分别与SJA1000对应的信号相连接,当微处理器对SJA1000对应的地址进行读写操作时,即可产生正确的控制逻辑。2节点的驱动程序开发在工业控制应用中,使用嵌入式操作系统已逐渐成为一个流行的选择。目前,市场上的嵌入式操作系统超过100种,其中嵌入式Linux是一种非常理想、经济的选择,因为它不仅具有功能强大、高性能、稳定性好等优点,还是免费并开放源代码的。同时Linux内核采用了模块化设计,具有非常良好的移植性和可定制性。现在,许多ARM生产厂商都已经将Linux系统移植到其生产的ARM芯片上,并发布了相关源代码供用户免费使用。本系统中采用的操作系统就是ATMEL公司发布的支持其AT912RM9200处理器的ARM-Linux系统的版本,版本号为2.4.27。CAN控制器SJA1000显然属于Linux系统中的字符设备类型,其驱动程序的实现架构类似于系统中字符设备的通用实现结构,关于Linux设备驱动开发的详细分析可参考文献[3]。本小节则以SJA1000的增强工作模式(PeliCAN)为例,对Linux系统下CAN设备驱动程序的主要实现部分进行了详细说明,包括主要数据结构的定义、操作函数和中断函数的实现三个部分。2.1CAN设备驱动的主要数据结构为方便驱动程序的设计和编写,驱动中定义了两个数据结构体,即协议帧数据结构和缓冲区结构体,下面给出每个结构体的定义及成员变量的解释。⑴协议帧数据结构structcanmsg_t{unsignedshortflags;/*帧类型标识*/unsignedshortcob;/*占位符*/unsignedintid;/*报文ID*/unsignedintlength;/*数据实际长度(=8)*/unsignedchardata[8];/*报文的数据区*/};⑵缓冲区数据结构structcanfifo_t{wait_queue_head_treadq;/*读操作等待队列*/wait_queue_head_twriteq;/*写操作等待队列*/structcanmsg_t*buf_tx_entry;/*指向输出缓冲区*/structcanmsg_t*buf_rx_entry;/*指向输入缓冲区*/structcanmsg_t*tx_readp;/*输出缓冲区的读指针*/structcanmsg_t*tx_writep;/*输出缓冲区的写指针*/structcanmsg_t*rx_readp;/*输入缓冲区的读指针*/structcanmsg_t*rx_writep;/*输入缓冲区的写指针*/intrx_size,tx_size;/*输入和输出缓冲区的大小(字节)*/volatileinttx_in_prog;/*表征实际发送操作在进行中*/};其中,协议帧结构体是用来对CAN网络的报文数据帧进行抽象,驱动中使用该结构体来进行用户与内核空间的数据帧传递及发送/接收数据缓冲区的管理。从缓冲区结构体的定义可以看出,CAN设备的数据缓冲区由两个独立缓冲区构成,一个用于设备读操作,另一个用于写操作。读缓冲区和写缓冲区都是一个先入先出的环形缓冲区,缓冲区的大小设为协议帧结构体的整数倍,如64倍。驱动通过缓冲区的读指针和写指针来进行缓冲区管理。如对于接收缓冲区(读缓冲区),它的读指针指向了当驱动程序从内核空间向用户空间拷贝报文数据帧时,缓冲区中第一个有效数据帧的位置;而缓冲4区的写指针则代表了在控制器芯片执行接收数据时,即将数据帧从SJA1000的寄存器读到缓冲区,缓冲区的当前可写位置;这样通过读指针和写指针的相对位置及缓冲区的整体长度就可以得到读缓冲区中当前的数据帧个数。写缓冲区的管理与读缓冲区基本相同,其详细机制可参考后面给出的相关伪代码。同时缓冲区中还定义了volatileint型变量tx_in_progress来表征当前是否有实际的数据发送操作已被启动,“1”标识已启动,否则为“0”。另外,结构体定义中使用到了Linux系统的等待队列结构,关于它的详细机制可参考文献[3]。2.2CAN设备的操作函数字符设备驱动的核心就是实现设备的操作函数结构,所谓的操作函数结构,本质上是定义了应用程序在设备上的所有可能操作。但对于某一具体设备,驱动中只需要实现设备工作所必须的操作。如对于CAN设备,本例中共实现了5种系统调用函数,即open、close、read、write和ioctl函数。其中,open函数是在应用程序打开CAN设备时被调用,函数主要实现两部分功能,首先对驱动中的变量和数据结构进行初始化,并分配缓冲区空间;另一部分就是对CAN控制器SJA1000初始化,即在复位时为芯片的各个寄存器设置正确的初始值。对于SJA1000芯片,需要设置的寄存器包括:①模式和时钟寄存器;②输出控制寄存器;③验收代码寄存器和验收屏蔽寄存器;④总线定时寄存器;⑤错误计数寄存器;⑥中断使能寄存器。需要注意的是,SJA1000的配置寄存器只能在复位模式下可写,所以在设置寄存器之前,必须先进入复位模式,所有设置完成后必须返回正常工作模式,关于SJA1000芯片寄存器设置的更多内容
本文标题:基于Can总线的嵌入式网络控制节点的设计与实现(电科院2011)
链接地址:https://www.777doc.com/doc-2569083 .html