基于Can总线的嵌入式网络控制节点的设计与实现

发布者:SparklingDreams最新更新时间:2016-04-25 来源: eefocus关键字:Can总线  网络控制  节点 手机看文章 扫描二维码
随时随地手机看文章
引言

    近年来,基于各种总线标准的网络化控制系统已经在工业控制领域内得到广泛应用。网络化控制系统采用了完全分散化的控制节点结构,将控制的权力很大部分交给了处于控制现场的智能节点,系统内各种交互信息通过现场总线传送。

    当前已实用化的总线标准有许多种,如WorldFIP, Profibus, LONWORKS, CAN等。其中,CAN(Controller Area Network)是Bosch公司在现代汽车应用技术中领先推出的一种串行通信网络。CAN主线采用多主站工作方式,根据优先权进行总线访问仲裁,能够检测出通信过程产生的任何错误。CAN总线还具有卓越的信号传输性能,当信号传输距离达到l0km时,它仍可提供高达SOKbit/s的数据传输速率。另外,CAN协议废除了站地址编码,而采用对通信数据块编码的方式,这样使得网络内的节点个数在理论上不受限制。目前,CAN总线已经在许多行业得到了广泛的应用,尤其是工业控制领域,并常被认为是最有前途的现场总线之一。

    常用的CAN总线节点一般采用的是“单片机+CAN控制器”的结构,这样由于运算能力的限制,这类节点的智能化程度较低,常是作为工控机节点的从节点。而近年来,以ARM为代表的嵌入式32位微处理器技术得到了飞速发展,无论是在功耗、便携性还是在硬件成本上,许多高性能的ARM芯片已经与单片机相差无几,因此在CAN节点设计中,使用ARM芯片取代传统的8/16位单片机已经是一个非常实用的选择。这样设计的CAN节点,不仅保留了低功耗、低成本和小体积的优点,而且性能得到了大幅提高,若辅以大容量的存储器,同时运行功能强大的嵌入式操作系统,它几乎已可以取代原先的工控机节点。本文则从软硬件两方面详细介绍了上述设计方案的具体实现过程。

1 节点的接口电路设计

    本文设计的CAN总线节点是某工业控制系统的一个子模块,同时综合考虑其它相关需求和功能扩展,因此选用了AT91 RM9200处理器作为系统的核心处理单元。AT91 RM9200,是ATMEL公司生产的一款高性能的ARM9处理器,它是一款通用工业级ARM芯片,主频为180MHz/200MIPS,已经在工业控制、智能仪器仪表等领域内得到了大量的成功应用。

    CAN控制器选用的是SJA 1000芯片,它是Philips公司生产的一款独立CAN总线控制器芯片,专用于移动目标和一般工业环境中控制器局域网络((CAN)。SJA 1000本质上是早期的PCA82C200的升级产品,与后者在管脚、电气特性上完全兼容,而且除具有基本CAN工作模式((BasicCAN)外,还增加了一种新的增强工作模式(PeIiCAN),这种新模式支持具有许多新特性的CAN2.OB协议。

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

    ARM架构的数据总线和地址总线是分离的,因此,必须引入专门的控制逻辑,才能实现对SJA1000的操作。

    图1和图2分别为SJA 1000读/写操作时序。分析其读/写时序,可以看出,无论是读操作还是写操作,首先必须送出操作寄存器的地址,然后读/写数据。在写地址的过程中,片选信号(/CS )和读(/RD )、写(/WR)均无效(高电平),仅ALE信号有效(高电平),而在读/写数据的过程中,读/写信号有效(低电平),ALE信号无效(低电平),同时,在操作的过程中,还必须满足信号电平的持续时间。

    因此,可以采用如图3所示的控制逻辑实现。

 SJA1000的读操作时序(Intel模式) 

    图1  SJA1000的读操作时序(Intel模式)

  SJA1000的写操作时序(Intel模式) 

    图2  SJA1000的写操作时序(Intel模式)
 

 SJA1000操作时序的实现 

    图3  SJA1000操作时序的实现

    在图3所示的SJA1000操作时序的实现中,左端的信号如/CS, /RD, /WR, A7分别为ARM微处理器的片选、读、写控制信号,A7为地址信号(也可以是其它的地址),右端产生的ALE CAN,/CS CAN, /WR_CAN, /RD_ CAN分别与SJA1000对应的信号相连接,当微处理器对SJA100()对应的地址进行读写操作时,即可产生正确的控制逻辑。

2 节点的驱动程序开发

    在工业控制应用中,使用嵌入式操作系统已逐渐成为一个流行的选择。目前,市场上的嵌入式操作系统超过100种,其中嵌入式Linux是一种非常理想、经济的选择,因为它不仅具有功能强大、高性能、稳定性好等优点,还是免费并开放源代码的。同时Linux内核采用了模块化设计,具有非常良好的移植性和可定制性。现在,许多ARM生产厂商都已经将Linux系统移植到其生产的ARM芯片上,并发布了相关源代码供用户免费使用。本系统中采用的操作系统就是ATMEL公司发布的支持其AT912RM9200处理器的ARM-Linux系统的版本,版本号为2.4.27。

    CAN控制器SJA1000显然属于Linux系统中的字符设备类型,其驱动程序的实现架构类似于系统中字符设备的通用实现结构,关于Linux设备驱动开发的详细分析可参考文献。本小节则以SJA1000的增强工作模式(PeIiCAN)为例,对Linux系统下CAN设备驱动程序的主要实现部分进行了详细说明,包括主要数据结构的定义、操作函数和中断函数的实现三个部分。

    2.1  CAN设备驱动的主要数据结构

    为方便驱动程序的设计和编写,驱动中定义了两个数据结构体,即协议帧数据结构和缓冲区结构体,下面给出每个结构体的定义及成员变量的解释。

CAN设备驱动的主要数据结构 

    其中,协议帧结构体是用来对CAN网络的报文数据帧进行抽象,驱动中使用该结构体来进行用户与内核空间的数据帧传递及发送/接收数据缓冲区的管理。

    从缓冲区结构体的定义可以看出,CAN设备的数据缓冲区由两个独立缓冲区构成,一个用于设备读操作,另一个用于写操作。读缓冲区和写缓冲区都是一个先入先出的环形缓冲区,缓冲区的大小设为协议帧结构体的整数倍,如64倍。驱动通过缓冲区的读指针和写指针来进行缓冲区管理。如对于接收缓冲区(读缓冲区),它的读指针指向了当驱动程序从内核空间向用户空间拷贝报文数据帧时,缓冲区中第一个有效数据帧的位置;而缓冲区的写指针则代表了在控制器芯片执行接收数据时,即将数据帧从SJA1000的寄存器读到缓冲区,缓冲区的当前可写位置;这样通过读指针和写指针的相对位置及缓冲区的整体长度就可以得到读缓冲区中当前的数据帧个数。写缓冲区的管理与读缓冲区基本相同,其详细机制可参考后面给出的相关伪代码。同时缓冲区中还定义了volatile int型变量tx_in_progress来表征当前是否有实际的数据发送操作已被启动,“1”标识已启动,否则为“0”。另外,结构体定义中使用到了Linux系统的等待队列结构,关于它的详细机制可参考文献。
 

    2.2 CAN设备的操作函数

    字符设备驱动的核心就是实现设备的操作函数结构,所谓的操作函数结构,本质上是定义了应用程序在设备上的所有可能操作。但对于某一具体设备,驱动中只需要实现设备工作所必须的操作。如对于CAN设备,本例中共实现了5种系统调用函数,即open, close, read, write和ioctl函数。

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

    驱动程序的write就是对应于用户写CAN设备时的系统调用。它的功能就是完成应用程序在用户空间中的报文发送,即报文数据从用户空间向内核空间的传递。下面给出了实现write函数的伪代码:

    ssize t can-write(......)

    {

    .....

    判断指定的数据长度是否满足数据帧格式,若不满足,则提示并返回;

    通过写指针和读指针的相对位置及缓冲区的整体长度计算输出缓冲区中空闲空间的大小,

    while空闲空间长度<一个数据帧大小使用interruptible_sleep_on_timeout()函数将写进程放入写操作等待队列睡眠,该函数既说明了睡眠可被信号中断,还可以指定进程的最长睡眠时间;

    睡眠结束后,再次计算空闲空间的大小。若空闲空间长度已大于或等于一个数据帧大小,则可跳出循环,否则继续while循环;

    从用户空间拷贝N字节数据到输出缓冲区,其中:N = min(计算的空闲空间大小,数据长度参数),然后更新输出缓冲区的写指针位置;

    if当前无实际的发送操作已被启动,即tx_in_progress等于0

    置位tx in_progress为1,同时调用发送初始化函数,即将输出缓冲区中第一个有效数据帧写入到控制器芯片相应的发送寄存器中,同时使能发送操作,完成后,结束c} write()函数并返回数值N;

    else

    函数直接结束,返回N

    }

    需要说明的是,上述伪码中在对临界区变量进行操作和判断时,即计算空闲区长度和判断饮_in_progress变量时,必须要在关闭设备中断条件下进行,操作完成后立即重新打开中断,下面描述的读函数中与临界区变量相关的操作也必须采用同样的机制。

    读函数read的功能就是响应用户对CAN设备的读操作,如果接收缓冲区中已有了数据帧,则直接从缓冲区拷贝M字节的数据返回给用户,其中M为用户要求字节数与缓冲区已有数据字节数之间的较小值,更新读指针位置然后函数返回数值M,而如果当前缓冲区中无有效数据,则需要判断设备文件的读取模式,若为非阻塞模式,则直接返回,否则将读进程放入读操作等待队列睡眠,指定进程的最大睡眠时间并设置为睡眠可被信号中断模式,当任务被唤醒后,再对唤醒方式进行判断,若因睡眠时间结束而唤醒,则函数直接返回相应标识,否则说明缓冲区中已有数据,则执行上述的拷贝动作,并更新缓冲区的读指针位置,函数结束并返回实际读取字节数,具体实现略。

    设备的iOCtl函数是用于设备控制的公共接口,可以根据设备的具体需求来实现相应的控制代码,在本文中共实现了三种功能,即清除读/写缓冲区、设置总线波特率、设置验收代码寄存器和验收屏蔽寄存器。

    2.3 CAN设备的中断函数

    如上所述,设备的读函数和写函数只是完成用户空间与设备的接收/发送缓冲区之间的数据帧传递,而真正的数据接收和发送工作,即芯片的寄存器与数据缓冲区之间的数据读取和写入,是由设备中断函数来完成。因此,实现中断函数既是驱动程序开发的核心,也是难点。下面是本例中使用的中断函数的伪代码:

    ssize_tcan_isr_handle(......)

    {

    ......

    读Call芯片的中断状态寄存器,用来判断中断源类型;

    if CAN接收中断

    读芯片的RX帧信息寄存器,然后根据接收的数据帧类型,即标准帧或扩展帧,读取相应的ID寄存器和RX数据寄存器,并将各数值写入一个数据帧结构体中,再把读取的该数据帧拷贝到接收缓冲区中,缓冲区的写指针就是缓冲区的当前可写位置,拷贝完成后,更新写指针位置;
 

    读控制器的状态寄存器,判断RXFIFO是否还有可用信息,若还有信息,则重复执行上述的数据读取操作,否则就判断读操作等待队列上是否有睡眠任务,有则唤醒它,中断函数结束;

    else if CAN发送中断

    判断设备的发送缓冲区是否已为空,若为空,则置tx_in_progress变量为0,并判断写操作等待队列上是否有睡眠进程,有则唤醒它,然后中断函数结束,

    否则继续发送缓冲区中的数据帧,而缓冲区的读指针代表了缓冲区中当前需要发送的数据帧位置,发送完成后,更新读指针位置,并判断写操作等待队列上是否有睡眠进程,有则唤醒它,中断函数退出;

    else即为其他中断

    判断错误类型,并置位相应错误标识,然后分别判断写操作等待队列和读操作等待队列上是否有睡眠进程,有则唤醒它,中断函数退出;

    }

    当CAN控制器发生除接收中断和发送中断外的其它类型中断时,一般是根据具体的应用需求采取相应的处理措施。本例中采用了置位相应标识,由用户程序进行处理的方式。另外,驱动程序除实现上述的操作函数和中断函数,还应在模块初始化函数中完成设备注册、申请中断并注册中断函数及其他初始化工作;在模块清除函数中需要卸载设备并释放中断资源。

3 结束语

    本文从软硬件两方面对基于ARM9芯片的CAN节点的具体设计过程进行了介绍,对硬件设计中的关键性问题和驱动模块实现结构都作了详细分析。目前,该CAN总线节点作为一个子系统已在某高速的网络化数据采集系统中得到应用,运行结果表明设备在CAN总线2.0B协议标准(兼容2.0A)下,数据发送、接收完全正常,满足了系统工作要求。本文给出的示例具有一定的普适性,对基于其他嵌入式设备上的CAN模块开发也有一定的参考价值。

关键字:Can总线  网络控制  节点 引用地址:基于Can总线的嵌入式网络控制节点的设计与实现

上一篇:STM32处理器存储空间布局解析
下一篇:基于LPC2210的ARINIC429总线测试装置研究

推荐阅读最新更新时间:2024-03-16 14:51

基于CAN总线与ARM的汽车节能控制装置设计
本文以节约能源为切入点,针对城市公交车频繁刹车的特点,设计了一种节能控制装置,通过该装置把汽车刹车时由原来通过摩擦片产生阻力停车,改为带动空气压缩机工作。 把汽车行驶时的动能转化为高压气能,利用能量的转换使汽车停下来。在汽车启动时,利用储存起来的高压气能带动汽车行走,从而达到节约能源的目的。 引言 由于各种原因,公交车总是不断重复加速—减速或停车—再加速的过程。通过加装本节能装置,当汽车需要制动时,在主控单元的控制下,可将汽车行驶时具有的巨大动能通过空气压缩机转化成高压气体的势能并储存起来,从而实现汽车减速或停车。当汽车需要启动或加速时,用储存起来的高压气体势能代替燃油来驱动汽车,从而实现汽车能量的回收再利用,达到节能的效
[单片机]
基于<font color='red'>CAN总线</font>与ARM的汽车节能控制装置设计
SylixOS CAN总线初始化流程解析
概述 本文档是在AT91SAM9X25平台上进行SylixOS CAN总线驱动开发时,对CAN总线初始化流程的分析。 适用于正在学习CAN总线开发的技术工程师。 技术实现 CAN总线的初始化流程可以分成两个部分: 一部分是CAN总线通道资源初始化,主要工作是对通道相关的管脚和中断以及总线编程时需要的时钟等资源的初始化;另一部分是CAN总线的硬件初始化,主要工作是对总线的波特率的设置、接收和发送数据邮箱(相当于缓存区)的初始化以及接收中断和错误中断的使能。 CAN总线通道资源初始化 在AT91SAM9X25平台上,CAN总线通道资源初始化如图 21所示。CAN总线的TX管脚、RX管脚和时钟的使能以及中断服务函数的绑定
[单片机]
SylixOS <font color='red'>CAN总线</font>初始化流程解析
基于CAN总线的电流、电压变送器的设计与实现
     0.引言   现场总线技术和智能化仪表技术是目前自动与控制行业发展最快的两大技术。在现场总线技术中,CAN总线是发展较为迅速的一种协议标准,已经被广泛应用于自动化领域。本文介绍的是一种基于CAN总线的智能变送系统。控制器局域网(ControllerAreaNetwork,CAN)是德国Bosch公司在20世纪80年代初为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种数据通信协议。CAN总线能有效地支持分布式控制或实时控制的串行通信网络。通信介质可以是双绞线、同轴电缆和光导纤维。    1 系统网络构成   为满足该控制系统既要集中管理又要分散控制的要求,基于CAN总线的电流、电压变送系统
[电源管理]
基于<font color='red'>CAN总线</font>的电流、电压变送器的设计与实现
衡量半导体工艺进步的最好方法(上)
在半导体技术领域最著名的就是摩尔定律了。55多年来,这个“定律”一直在描述和预测晶体管的微缩规律,即约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这一定律揭示了信息技术进步的速度 。就像一些基于物理原理的末日时钟一样,随着工程师们设法定期将晶体管数量增加一倍,节点的数量在过去几十年里不断下降。 当Gordon Moore第一次指出以他的名字命名的趋势时,还没有节点这种东西,一块IC上撑死也就经济地集成只有大约50个晶体管。 但是经过几十年的努力和数千亿美元的投资,看看我们已经走了多远!如果你使用的是一款高端智能手机,那么它内部的处理器使用的技术应该是
[半导体设计/制造]
衡量半导体工艺进步的最好方法(上)
基于51单片机can总线头文件定义
#include reg52.h #include intrins.h #include absacc.h #define da ta_ora P1 //MCU P1 ------ LCM #define uchar unsigned char #define uint unsigned int #define NOP _nop_() sbit req =P3^1; //请求信号,H有效 sbit busy=P3^0; //H:已收到数据并在处理中,L:空闲可接收数据 #define SJA_Peli
[单片机]
Cadence发布7纳米工艺Virtuoso先进工艺节点扩展平台
2017年4月18日,中国上海 – 楷登电子(美国Cadence公司,NASDAQ: CDNS)今日正式发布针对7nm工艺的全新Virtuoso® 先进工艺节点平台。通过与采用7nm FinFET工艺的早期客户展开紧密合作,Cadence成功完成了Virtuoso定制设计平台的功能拓展,新平台能帮助客户管理由于先进工艺所导致的更复杂的设计以及特殊的工艺效应。新版Virtuoso先进工艺平台同样支持所有主流FinFET先进节点,性能已得到充分认证;同时提高了7nm工艺的设计效率。 为了应对7nm设计的众多技术挑战,Virtuoso先进工艺平台提供丰富的版图设计功能,包括:支持多重曝光(MPT)的色彩感知的编辑功能、支持FinFET网
[半导体设计/制造]
节点和阴影中的智能视觉检测
适合智慧城市和楼宇应用的ADIS1700x 介绍一种嵌入式视觉检测模块,适用于众多新兴实时、智慧城市和智能楼宇应用,如停车、交通监控和城市照明控制。ADIS1700x将高级成像和智能推向边缘。日志成像器可在极端明亮和黑暗条件下实现清晰、精确的成像。还会在像素级产生输出对比度,大大减轻处理负荷。这样可以通过板载算法提供节点分析,从而准确、可靠地区别不同对象,如人员和车辆。此外,对数据进行本地处理和操作或传输至云的决策现在可在边缘进行,大大改进云应用的延迟、带宽、功耗、成本和有效性。 更好的阴影中成像 传统CMOS成像器 ADVIS200x成像器(SNAP传感器) 目标应用 智慧城市视频分析 停车位监控 停车违章
[嵌入式]
<font color='red'>节点</font>和阴影中的智能视觉检测
基于CAN总线的开关磁阻电机远程控制系统的研究
  0 引 言        由于应用环境的复杂,地域的广阔等不利工作条件,给开关磁阻电机的调速控制与相关参数监控带来了很多影响。因此,设计研制一种基于开关磁阻电机的远程控制系统(SRD)具有十分重要的现实意义。 Controller Area 总线相比,CAN总线的数据通信具有突出的可靠性、实时性和灵活性。本文主要探讨基于RS-485与CAN总线的开关磁阻电机远程监控系统的构成。SRD调速系统通常采用传统PID控制策略,系统很难保守良好性能。目前,神经网络控制与模糊控制技术应用于SRD取得了一定的成绩。 卡尔曼滤算法是一种递推算法,对于系统存在过程及测量噪声,状态变量受到污染,可以利用卡尔曼滤波技术进行处理。
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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