利用LM3S2965芯片实现CAN总线节点的设计方案

描述

引言

CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由研发和生产汽车电子产品着称的德国BOSCH公司开发了的,并最终成为国际标准(ISO118?8)。是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。近年来,其所具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强和振动大的工业环境。

CAN总线具有通信速率高、可靠性高、连接方便和性能价格比高等诸多特点。CAN(Controller Area Network,控制器局域网)属于总线式通信网络,它是一种专门用于工业自动化领域的网络,不同于以太网等管理和信息处理用网络,其物理特性及网络协议特性更强调工业自动化的底层监测及控制。它采用了最新的技术及独特的设计,可靠性和性能超过了已陈旧的现场通信技术,如RS485、BITBUS等。

多数采用微处理器结合CAN控制器芯片的硬件方案,软件实现上是对CAN控制器芯片的寄存器编程,比较繁琐。Luminary Micro公司(现已被TI公司收购)所提供的Stellaris系列是基于ARM Cortex-M3的控制器,它们为对成本尤其敏感的嵌入式微控制器应用方案带来了高性能的32位运算能力。其中,LM3S2000系列是针对控制器局域网(CAN)应用方案而设计的一组芯片,它在Stellaris系列芯片的基础上扩展了Bosch CAN网络技术——短距离工业网络里的黄金标准。

目前,很多系统需要称重数据。本文介绍一种利用LM3S2965芯片设计的CAN总线节点的软硬件方案,可以直接将仪表与传感器组成的称重系统接人现有的分布式网络中。

1 系统硬件设计

基于CAN总线的分布式控制网络系统如图1所示。采用现场总线式集散控制系统(Field Distributed Control Svstem,FDCS)结构,由CAN总控中心、控制节点以及CAN现场控制网络组成。CAN总控中心主要完成在线系统监控,多个智能节点各自独立完成数据采集、系统设定、运行显示控制等,通过CAN现场总线,在操作站和智能节点之间交换各种数据和管理控制信息。图中的任何一个控制节点都可能是称重系统,由称重传感器和称重仪表组成。通过这个控制网络,总控中心就可以监控、操作各个称重单元的工作状态。

CAN总线

本文利用TI公司生产的LM3S2965设计了一种CAN总线系统智能节点。节点包括A/D转换、显示、按键输入、CAN接口等多个部分,根据系统的要求还可以增加更多的模块。本文仅介绍CAN接口部分,其硬件电路如图2所示。该电路主要包括CAN总线收发器SN65HVD1050D、高速光电耦合器6N137以及与微控制器LM3S2965的接口部分。LM3S2965通过内置CAN控制器极大地简化了硬件设计和软件编程,加速了实现方案的设计,且稳定可靠性得到保证。

CAN总线

为了增强CAN总线节点的抗干扰能力,LM3S2965的TXO和RXO通过高速光耦6N137与CAN收发器SN65HVD1050D相连,很好地实现了总线上各CAN节点间的电气隔离。电源的完全隔离可采用小功率电源隔离模块或带多5 V隔离输出的开关电源模块实现,这些部分虽然增加了节点的复杂程度,但却提高了节点的稳定性和安全性。6N137光耦合器的使用需要注意两点:第一,6N137的第6脚输出电路属于集电极开路电路,必须接一个上拉电阻;第二,6N137内部的第2脚和第3脚之间是一个LED,必须串接一个限流电阻。

CAN总线有如下基本特点

废除传统的站地址编码,代之以对通信数据块进行编码,可以多主方式工作;

采用非破坏性仲裁技术,当两个节点同时向网络上传送数据时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响继续传输数据,有效避免了总线冲突;

采用短帧结构,每一帧的有效字节数为8个,数据传输时间短,受干扰的概率低,重新发送的时间短;

每帧数据都有CRC校验及其他检错措施,保证了数据传输的高可靠性,适于在高干扰环境下使用;

节点在错误严重的情况下,具有自动关闭总线的功能,切断它与总线的联系,以使总线上其他操作不受影响;

◎可以点对点,一对多及广播集中方式传送和接受数据。

CAN总线的优点

具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点;

采用双线串行通信方式,检错能力强,可在高噪声干扰环境中工作;

具有优先权和仲裁功能,多个控制模块通过CAN 控制器挂到CAN-bus 上,形成多主机局部网络;

可根据报文的ID决定接收或屏蔽该报文;

可靠的错误处理和检错机制;

发送的信息遭到破坏后,可自动重发;

节点在错误严重的情况下具有自动退出总线的功能;

报文不包含源地址或目标地址,仅用标志符来指示功能信息、优先级信息。

2 系统软件设计

CAN总线节点的软件设计主要包括3部分:CAN节点初始化、报文发送和报文接收。初始化程序设计对于CAN总线节点的正常工作相当重要。它主要包括工作方式、时钟输出寄存器、接收屏蔽寄存器、接收代码寄存器、总线定时器、输出控制寄存器和中断允许寄存器的设置。

LM3S2965及其系列芯片由厂家提供了底层的API,用于访问Stellaris CAN模块的函数集。这些函数用于对CAN控制器、报文对象进行配置,对CAN中断进行管理,大大简化了编程的复杂性,也增强了软件的移植性。

Stellaris CAN模块提供了CAN数据链接层的硬件处理。因为可以被配置成具有报文过滤器并能预载报文数据,所以它能在总线上自动发送和接收报文,并相应地通知应用。它能自动地处理CRC的产生和检查、错误处理以及CAN报文的重发。

报文对象存放在CAN控制器中,并且它能提供CAN总线上的CAN模块的主接口。这32个报文对象中的每一个都能被编程成可以处理一个独立的报文ID,或能在同一个ID上被一起链接成一个帧序列。报文标识符过滤器提供了能被编程为与任何或全部报文ID位相匹配的屏蔽和帧类型。CAN API提供了应用所需要用来实施一个中断驱动CAN堆栈的全部函数。可使用这些函数控制Stellaris微控制器的任何一个可用的CAN端口,并且函数能与一个端口使用而不会与其他端口造成冲突。

默认时CAN模块被禁止,因此在调用任何其他的CAN函数前,必须要先调用CANInit()函数。这样就能在使能CAN总线上的控制器前把报文对象初始化到一个安全的状态。同样,在使能CAN控制器前,必须对位时序值进行编程。在位时序值被编程为一个适当的值时,应该要调用CAN总线的CANSetBitTiming()函数。一旦调用完这两个函数,就可使用CANEnable()将CAN控制器使能,如有需要,稍后可使用CANDisable()将其关闭。调用CANDisable()并不会重新初始化一个CAN控制器,因此可以使用它来暂时把CAN控制器从总线上移除。

CAN控制器具有很高的可配置性并且包含32个报文对象,在某些条件下这些报文对象能被编程为自动发送和接收CAN报文。报文对象允许应用程序自动执行一些操作而无需与微控制器进行交互。

CAN 总线的位数值表示与通信距离 CAN 总线上用显性(Dominant)和隐性(Recessive)两个互补的逻辑值 表示 0 和 1。当在总线上出现同时发送显性位和隐性位时,总线上数值 将出现显性。如图所示,VCAN-H 和 VCAN-L 为 CAN 总线收发器与总线之间 的两接口引脚,信号是以两线之间的“差分”电压形式出现。在隐性状 态,VCAN-H 和 VCAN-L 被固定在平均电压附近,Vdiff 近似于 0。在总线空闲 或隐性位期间,发送隐性位。显性位以大于最小阈值的差分电压表示。

以下是这些操作的一些范例:

①立即发送一个数据帧;

②当在CAN总线上发现一个正在匹配的远程帧时,发送一个数据帧;

③接收一个特定的数据帧;

④接收与某个标识符样式匹配的数据帧。

为了把报文对象配置成可以执行这些操作中的任何一个操作,应用程序必须首先要使用CANMessageSet()来设置32个报文对象中的其中一个。这个函数能把一个报文对象配置成可以发送数据或接收数据。每一个报文对象可以被配置成在发送或接收CAN报文时产生中断。

当从CAN总线接收到数据时,应用程序可以使用CANMessageGet()函数读取到所接收到的报文。同样,该函数也能读取这样一个报文:在改变报文对象的配置前,报文已被配置以便定位一个报文结构。使用这个函数读取报文对象,将会清除任何报文对象中正在挂起的中断。

一旦已使用CANMessageSet()来完成对一个报文对象的配置,那么此函数分配报文对象并继续执行其编程功能,除非通过调用ANMessage-Clear()将其释放。在对报文对象进行新配置前,无需请求应用程序清除报文对象,因此每次调用CANMessageSet()时,它将会覆盖任何之前被编程的配置。

32个报文对象是相同的,优先级除外。最小编号的报文对象具有最高的优先级。优先级以两种方式影响操作:第一种,如果在同一时间准备好多个操作,那么具有最高优先级的报文对象将会首先发生;第二种,多个报文对象正在挂起中断时,如果读取中断状态,则具有最高优先级的报文对象首先出现。由应用负责把32个报文对象作为一个源来管理,并确定分配和释放它们的最佳途径。

CAN控制器在下列条件下能够产生中断:

①当任何一个报文对象发送一个报文时;

②当任何一个报文对象接收一个报文时;

③满足警告条件,如一个错误计数器达到了限值,或出现多个总线错误时;

④满足控制器错误条件,如进入总线关闭状态时。

图3是CAN总线节点的软件流程。其中的对象就是一组数据的信息,包括下面结构体的信息:

CAN总线

其中,ulMsglD用作11或29位标识符的CAN报文标识符;ulMsgIDMask为在使能标识符过滤器时所使用的报文标识符屏蔽;ulFlags保存多个状态标志和tCANObjFlags所指定的设置;ulMsgLen是报文对象中的数据字节数;pucMsgData是指向报文对象的数据的指针。

此结构是对与CAN控制器中一个CAN报文对象相关的项目进行的压缩。可以直接将这个对象的信息填充,即进行对象的赋值工作。下面的代码是程序中CAN接口部分的初始化部分:

CAN总线

上面的这些函数都已经通过提供的API函数完成工作,CANConfigureNetwork函数要自己编写,代码如下:

CAN总线

这里仅仅是对前文介绍的对象进行赋值,是将系统中真正用到的对象配置成我们需要的对象(包括是发送还是接收)。此处鉴于篇幅只给出了两个对象,一个用于发送数据,一个用于接收数据。上面的函数设置好后就可以通过CAN中断控制器来接收和发送数据。上述程序代码在Keil C3.78版本上调试编译通过,并且已经成功用于产品中。

结束语

本文介绍的CAN总线接口节点设计方案实现非常方便,硬件电路简单,软件设计模块化,可以应用此方案设计实用的系统。本文的接口就是称重仪表的一部分,可以直接将仪表与传感器组成的称重系统接入现有的分布式网络中。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分