收藏 分享(赏)

基于Can总线的嵌入式网络控制节点的设计与实现(电科院2011).doc

上传人:scg750829 文档编号:6029929 上传时间:2019-03-25 格式:DOC 页数:6 大小:105KB
下载 相关 举报
基于Can总线的嵌入式网络控制节点的设计与实现(电科院2011).doc_第1页
第1页 / 共6页
基于Can总线的嵌入式网络控制节点的设计与实现(电科院2011).doc_第2页
第2页 / 共6页
基于Can总线的嵌入式网络控制节点的设计与实现(电科院2011).doc_第3页
第3页 / 共6页
基于Can总线的嵌入式网络控制节点的设计与实现(电科院2011).doc_第4页
第4页 / 共6页
基于Can总线的嵌入式网络控制节点的设计与实现(电科院2011).doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、1基于 Can 总线的嵌入式网络控制节点的设计与实现2011.8 发表于制造业自动化北大核心期刊摘要: 采用 ARM 芯片替代传统 CAN 总线节点的单片机单元已经是一种理想经济的设计选择,这样不仅提高了硬件的运算处理能力,还可以通过运行嵌入式操作系统增强模块的智能性和扩展性,进一步降低上层应用程序的开发难度。本文以 AT91RM9200 处理器为例,对基于 ARM 芯片的高性能 CAN 模块的具体设计过程进行了介绍,对硬件设计中的关键性问题和 ARM-Linux 系统下 CAN 控制器驱动程序的实现结构作了详细分析。本文给出的设计示例也为基于其它嵌入式设备的 CAN 模块开发提供了参考,有一

2、定借鉴价值。关键词:AT91RM9200; CAN;SJA1000;设备驱动程序中图分类号:TP274+.2 文献标识码:ADesign and Implementation of Embedded Control Unit Based on CAN BusAbstract: Applying ARM processor to replace 8/16-bit MCU as the central processor of the control unit based on CAN bus has been a perfect and economical choice today. By t

3、his means, the capability of control node was greatly improved; especially for many complex cases, the workload of user applications has been obviously simplified by running the embedded operating system on it. Based on AT91RM9200 with ARM-Linux operating system, the paper introduces the whole desig

4、n process of one embedded control unit based on CAN bus in detail, analyzing the key point present in the hardware design and the device-driver implementation of CAN controller. The design present in the paper can also be used in design of CAN devices based on other embedded systems.Key words: AT91R

5、M9200; CAN; SJA1000; Device Drivers0 引 言近年来,基于各种总线标准的网络化控制系统已经在工业控制领域内得到广泛应用。网络化控制系统采用了完全分散化的控制节点结构,将控制的权力很大部分交给了处于控制现场的智能节点,系统内各种交互信息通过现场总线传送。当前已实用化的总线标准有许多种,如WorldFIP、Profibus、LONWORKS、CAN等。其中,CAN(Controller Area Network)是Bosch公司在现代汽车应用技术中领先推出的一种串行通信网络。CAN主线采用多主站工作方式,根据优先权进行总线访问仲裁,能够检测出通信过程产生的任何错误

6、。CAN总线还具有卓越的信号传输性能,当信号传输距离达到10km时,它仍可提供高达50Kbit/s的数据传输速率。另外,CAN协议废除了站地址编码,而采用对通信数据块编码的方式,这样使得网络内的节点个数在理论上不受限制的。目前,CAN总线已经在许多行业得到了广泛的应用,尤其是工业控制领域,并常被认为是最有前途的现场总线之一。常用的CAN总线节点一般采用的是“单片机CAN控制器”的结构,这样由于运算能力的限制,这类节点的智能化程度较低,常是作为工控机节点的从节点。而近年来,以ARM为代表的嵌入式32位微处理器技术得到了飞速发展,无论是在功耗、便携性还是在硬件成本上,许多高性能的ARM芯片已经与单

7、片机相差无几,因此在CAN节点设计中,使用ARM芯片取代传统的8/16位单片机已经是一个非常实用的选择。这样设计的CAN节点,不仅保留了低功耗、低成本和小体积的优点,而性能却得到了大幅提高,若辅以大容量的存储器,同时运行功能强大的嵌入式操作系统,它几乎已可以取代原先的工控机节点。本文则从软硬件两方面详细介绍了上述设计方案的具体实现过程.1 节点的接口电路设计本文设计的 CAN 总线节点是某工业控制系统的一个子模块,同时综合考虑其它相关需求和功能扩展,因此选用了 AT91RM9200 处理器作为系统的核心处理单元。AT91RM9200 1是 ATMEL 公司生产的一款高性能的ARM9 处理器,它

8、是一款通用工业级 ARM 芯片,主频为 180MHz/200MIPS,已经在工业控制、智能仪器仪表等领域内得到了大量的成功应用。CAN 控制器选用的是 SJA10002芯片,它是 Philips 公司生产的一款独立 CAN 总线控制器芯片,专用于移动目标和一般工业环境中控制器局域网络(CAN)。SJA1000 本质上是早期的 PCA82C200 的升级产品,与后者在2管脚、电气特性上完全兼容,而且除具有基本 CAN 工作模式(BasicCAN)外,还增加了一种新的增强工作模式(PeliCAN),这种新模式支持具有许多新特性的 CAN2.0B 协议。SJA1000 的总线接口采用的是地址总线和数

9、据总线复用的方式,这种方式与类似 51 也采用总线复用架构的处理器接口很方便,并在读写时序上也很好配合,但当与数据总线和地址总线分离的微处理器接口时,则需要专门的读写逻辑与之配合,并且还相对比较复杂,基于这个原因,目前许多设计都采用诸如 SPI 等专用接口的CAN 总线控制器,但这种方式使应用受到了诸多限制,如要求微处理器必须有 SPI 接口,同时当系统需要多路CAN 总线接口时,会受到 SPI 端口数的限制等。ARM 架构的数据总线和地址总线是分离的,因此,必须引入专门的控制逻辑,才能实现对 SJA1000 的操作。图 11 SJA1000 的读操作时序(Intel 模式)图 12 SJA1

10、000 的写操作时序(Intel 模式)图 11 和图 12 分别为 SJA1000 读/ 写操作时序。分析其读/写时序,可以看出,无论是读操作还是写操作,首先必须送出操作寄存器的地址,然后读/写数据。在写地址的过程中,片选信号(/CS)和读(/RD) 、写(/WR)均无效(高电平) ,仅 ALE 信号有效(高电平) ,而在读/写数据的过程中,读/ 写信号有效(低电平) ,ALE 信号无效(低电平) ,同时,在操作的过程中,还必须满足信号电平的持续时间。因此,可以采用如图 13 所示的控制逻辑实现。3图 13 SJA1000 操作时序的实现在图 13 所示的 SJA1000 操作时序的实现中,

11、左端的信号如/CS、/RD、/WR、A7 分别为 ARM 微处理器的片选、读、写控制信号,A7 为地址信号(也可以是其它的地址) ,右端产生的ALE_CAN、/CS_CAN 、/WR_CAN、/RD_CAN 分别与 SJA1000 对应的信号相连接,当微处理器对 SJA1000 对应的地址进行读写操作时,即可产生正确的控制逻辑。2 节点的驱动程序开发在工业控制应用中,使用嵌入式操作系统已逐渐成为一个流行的选择。目前,市场上的嵌入式操作系统超过 100 种,其中嵌入式 Linux 是一种非常理想、经济的选择,因为它不仅具有功能强大、高性能、稳定性好等优点,还是免费并开放源代码的。同时 Linux

12、 内核采用了模块化设计,具有非常良好的移植性和可定制性。现在,许多 ARM 生产厂商都已经将 Linux 系统移植到其生产的 ARM 芯片上,并发布了相关源代码供用户免费使用。本系统中采用的操作系统就是 ATMEL 公司发布的支持其 AT912RM9200 处理器的 ARM-Linux 系统的版本,版本号为 2.4.27。CAN 控制器 SJA1000 显然属于 Linux 系统中的字符设备类型,其驱动程序的实现架构类似于系统中字符设备的通用实现结构,关于 Linux 设备驱动开发的详细分析可参考文献3。本小节则以 SJA1000 的增强工作模式(PeliCAN)为例,对 Linux 系统下

13、CAN 设备驱动程序的主要实现部分进行了详细说明,包括主要数据结构的定义、操作函数和中断函数的实现三个部分。2.1 CAN 设备驱动的主要数据结构为方便驱动程序的设计和编写,驱动中定义了两个数据结构体,即协议帧数据结构和缓冲区结构体,下面给出每个结构体的定义及成员变量的解释。 协议帧数据结构struct canmsg_t unsigned short flags; /* 帧类型标识 */unsigned short cob; /* 占位符 */unsigned int id; /* 报文 ID */unsigned int length; /* 数据实际长度 (=8) */unsigned c

14、har data8; /* 报文的数据区 */; 缓冲区数据结构struct canfifo_t wait_queue_head_t readq; /*读操作等待队列*/4wait_queue_head_t writeq; /*写操作等待队列*/struct canmsg_t *buf_tx_entry; /*指向输出缓冲区*/struct canmsg_t *buf_rx_entry; /*指向输入缓冲区*/struct canmsg_t *tx_readp; /*输出缓冲区的读指针*/struct canmsg_t *tx_writep; /*输出缓冲区的写指针*/struct canms

15、g_t *rx_readp; /*输入缓冲区的读指针*/struct canmsg_t *rx_writep; /*输入缓冲区的写指针*/int rx_size, tx_size; /*输入和输出缓冲区的大小(字节)*/volatile int tx_in_prog; /*表征实际发送操作在进行中*/;其中,协议帧结构体是用来对 CAN 网络的报文数据帧进行抽象,驱动中使用该结构体来进行用户与内核空间的数据帧传递及发送/接收数据缓冲区的管理。从缓冲区结构体的定义可以看出,CAN 设备的数据缓冲区由两个独立缓冲区构成,一个用于设备读操作,另一个用于写操作。读缓冲区和写缓冲区都是一个先入先出的环形

16、缓冲区,缓冲区的大小设为协议帧结构体的整数倍,如 64 倍。驱动通过缓冲区的读指针和写指针来进行缓冲区管理。如对于接收缓冲区(读缓冲区),它的读指针指向了当驱动程序从内核空间向用户空间拷贝报文数据帧时,缓冲区中第一个有效数据帧的位置;而缓冲区的写指针则代表了在控制器芯片执行接收数据时,即将数据帧从 SJA1000 的寄存器读到缓冲区,缓冲区的当前可写位置;这样通过读指针和写指针的相对位置及缓冲区的整体长度就可以得到读缓冲区中当前的数据帧个数。写缓冲区的管理与读缓冲区基本相同,其详细机制可参考后面给出的相关伪代码。同时缓冲区中还定义了 volatile int 型变量 tx_in_progres

17、s来表征当前是否有实际的数据发送操作已被启动, “1”标识已启动,否则为“0” 。另外,结构体定义中使用到了 Linux 系统的等待队列结构,关于它的详细机制可参考文献3。2.2 CAN 设备的操作函数字符设备驱动的核心就是实现设备的操作函数结构,所谓的操作函数结构,本质上是定义了应用程序在设备上的所有可能操作。但对于某一具体设备,驱动中只需要实现设备工作所必须的操作。如对于 CAN 设备,本例中共实现了 5 种系统调用函数,即 open、close、read、write 和 ioctl 函数。其中,open 函数是在应用程序打开 CAN 设备时被调用,函数主要实现两部分功能,首先对驱动中的变

18、量和数据结构进行初始化,并分配缓冲区空间;另一部分就是对 CAN 控制器 SJA1000 初始化,即在复位时为芯片的各个寄存器设置正确的初始值。对于 SJA1000 芯片,需要设置的寄存器包括:模式和时钟寄存器;输出控制寄存器;验收代码寄存器和验收屏蔽寄存器;总线定时寄存器;错误计数寄存器;中断使能寄存器。需要注意的是,SJA1000 的配置寄存器只能在复位模式下可写,所以在设置寄存器之前,必须先进入复位模式,所有设置完成后必须返回正常工作模式,关于 SJA1000 芯片寄存器设置的更多内容可参见文献2。CAN 设备的close 调用的实现功能非常简单,即等待缓冲区中已有的数据帧被处理完,然后

19、释放缓冲区,最后关闭设备中断。驱动程序的 write 就是对应于用户写 CAN 设备时的系统调用。它的功能就是完成应用程序在用户空间中的报文发送,即报文数据从用户空间向内核空间的传递。下面给出了实现 write 函数的伪代码:ssize_t can_write()判断指定的数据长度是否满足数据帧格式,若不满足,则提示并返回;通过写指针和读指针的相对位置及缓冲区的整体长度计算输出缓冲区中空闲空间的大小;while 空闲空间长度 一个数据帧大小使用 interruptible_sleep_on_timeout()函数将写进程放入写操作等待队列睡眠,该函数既说明了睡眠可被信号中断,还可以指定进程的最

20、长睡眠时间;睡眠结束后,再次计算空闲空间的大小。若空闲空间长度已大于或等于一个数据帧大小,则可跳出循环,否则继续 while 循环;从用户空间拷贝 N 字节数据到输出缓冲区,其中:N = min(计算的空闲空间大小,数据长度参数),然后更新输出缓冲区的写指针位置;5if 当前无实际的发送操作已被启动,即 tx_in_progress 等于 0置位 tx_in_progress 为 1,同时调用发送初始化函数,即将输出缓冲区中第一个有效数据帧写入到控制器芯片相应的发送寄存器中,同时使能发送操作,完成后,结束 can_write()函数并返回数值 N;else函数直接结束,返回 N需要说明的是,上

21、述伪码中在对临界区变量进行操作和判断时,即计算空闲区长度和判断 tx_in_progress 变量时,必须要在关闭设备中断条件下进行,操作完成后立即重新打开中断,下面描述的读函数中与临界区变量相关的操作也必须采用同样的机制。读函数 read 的功能就是响应用户对 CAN 设备的读操作,如果接收缓冲区中已有了数据帧,则直接从缓冲区拷贝 M 字节的数据返回给用户,其中 M 为用户要求字节数与缓冲区已有数据字节数之间的较小值,更新读指针位置然后函数返回数值 M;而如果当前缓冲区中无有效数据,则需要判断设备文件的读取模式,若为非阻塞模式,则直接返回,否则将读进程放入读操作等待队列睡眠,指定进程的最大睡

22、眠时间并设置为睡眠可被信号中断模式,当任务被唤醒后,再对唤醒方式进行判断,若因睡眠时间结束而唤醒,则函数直接返回相应标识,否则说明缓冲区中已有数据,则执行上述的拷贝动作,并更新缓冲区的读指针位置,函数结束并返回实际读取字节数,具体实现略。设备的 ioctl 函数是用于设备控制的公共接口,可以根据设备的具体需求来实现相应的控制代码,在本文中共实现了三种功能,即清除读/ 写缓冲区、设置总线波特率、设置验收代码寄存器和验收屏蔽寄存器。2.3 CAN 设备的中断函数如上所述,设备的读函数和写函数只是完成用户空间与设备的接收/发送缓冲区之间的数据帧传递,而真正的数据接收和发送工作,即芯片的寄存器与数据缓

23、冲区之间的数据读取和写入,是由设备中断函数来完成。因此,实现中断函数既是驱动程序开发的核心,也是难点。下面是本例中使用的中断函数的伪代码:ssize_t can_isr_handle()读 can 芯片的中断状态寄存器,用来判断中断源类型;if CAN 接收中断读芯片的 RX 帧信息寄存器,然后根据接收的数据帧类型,即标准帧或扩展帧,读取相应的 ID 寄存器和 RX 数据寄存器,并将各数值写入一个数据帧结构体中,再把读取的该数据帧拷贝到接收缓冲区中,缓冲区的写指针就是缓冲区的当前可写位置,拷贝完成后,更新写指针位置;读控制器的状态寄存器,判断 RXFIFO 是否还有可用信息,若还有信息,则重复

24、执行上述的数据读取操作,否则就判断读操作等待队列上是否有睡眠任务,有则唤醒它,中断函数结束;else if CAN 发送中断判断设备的发送缓冲区是否已为空,若为空,则置 tx_in_progress 变量为 0,并判断写操作等待队列上是否有睡眠进程,有则唤醒它,然后中断函数结束;否则继续发送缓冲区中的数据帧,而缓冲区的读指针代表了缓冲区中当前需要发送的数据帧位置,发送完成后,更新读指针位置,并判断写操作等待队列上是否有睡眠进程,有则唤醒它,中断函数退出;else 即为其它中断判断错误类型,并置位相应错误标识,然后分别判断写操作等待队列和读操作等待队列上是否有睡眠进程,有则唤醒它,中断函数退出;

25、当 CAN 控制器发生除接收中断和发送中断外的其它类型中断时,一般是根据具体的应用需求采取相应的处理措施。本例中采用了置位相应标识,由用户程序进行处理的方式。另外,驱动程序除实现上述的操作函数和中断函数,还应在模块初始化函数中完成设备注册、申请中断并注册中断函数及其它初始化工作;在模块清除函数中需要卸载设备并释放中断资源。3 结束语本文从软硬件两方面对基于 ARM9 芯片的 CAN 节点的具体设计过程进行了介绍,对硬件设计中的关键性问题和驱动模块实现结构都作了详细分析。目前,该 CAN 总线节点作为一个子系统已在某高速的网络化数据6采集系统中得到应用,运行结果表明设备在 CAN 总线 2.0B

26、 协议标准(兼容 2.0A)下,数据发送、接收完全正常,满足了系统工作要求。本文给出的示例具有一定的普适性,对基于其它嵌入式设备上的 CAN 模块开发也有一定的参考价值。参考文献:1Atmel Semiconductors. Data Sheet AT91RM9200 EB/OL. http:/, 2005.2 周立功单片机发展有限公司. SJA1000 独立 CAN 控制器应用指南EB/OL. http:/, 2004.3 魏永明,骆刚,姜君(译).Linux 设备驱动程序(第二版)M.北京:北京电力出版社,2002.4邬宽明.CAN 总线原理和应用系统设计M.北京:北京航空航天大学出版社,1996.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 大学论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报