Cortex-M3内核芯片LM3S2965的CAN总线节点设计
扫描二维码
随时随地手机看文章
摘要:根据CAN总线的特性,给出了基于Cortex-M3内核的LM3S2965芯片中CAN总线节点的硬件电路、软件实现框架及部分代码。初始化代码部分可以直接应用在其他CAN总线的接口设计中。
关键词:CAN;Cortex-M3;称重仪表;现场总线
引言
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现场总线,在操作站和智能节点之间交换各种数据和管理控制信息。图中的任何一个控制节点都可能是称重系统,由称重传感器和称重仪表组成。通过这个控制网络,总控中心就可以监控、操作各个称重单元的工作状态。
本文利用TI公司生产的LM3S2965设计了一种CAN总线系统智能节点。节点包括A/D转换、显示、按键输入、CAN接口等多个部分,根据系统的要求还可以增加更多的模块。本文仅介绍CAN接口部分,其硬件电路如图2所示。该电路主要包括CAN总线收发器SN65HVD1050D、高速光电耦合器6N137以及与微控制器LM3S2965的接口部分。LM3S2965通过内置CAN控制器极大地简化了硬件设计和软件编程,加速了实现方案的设计,且稳定可靠性得到保证。
为了增强CAN总线节点的抗干扰能力,LM3S2965的TXO和RXO通过高速光耦6N137与CAN收发器SN65HVD1050D相连,很好地实现了总线上各CAN节点间的电气隔离。电源的完全隔离可采用小功率电源隔离模块或带多5 V隔离输出的开关电源模块实现,这些部分虽然增加了节点的复杂程度,但却提高了节点的稳定性和安全性。6N137光耦合器的使用需要注意两点:第一,6N137的第6脚输出电路属于集电极开路电路,必须接一个上拉电阻;第二,6N137内部的第2脚和第3脚之间是一个LED,必须串接一个限流电阻。
[!--empirenews.page--]
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总线上发现一个正在匹配的远程帧时,发送一个数据帧;
③接收一个特定的数据帧;
④接收与某个标识符样式匹配的数据帧。
为了把报文对象配置成可以执行这些操作中的任何一个操作,应用程序必须首先要使用CANMessageSet()来设置32个报文对象中的其中一个。这个函数能把一个报文对象配置成可以发送数据或接收数据。每一个报文对象可以被配置成在发送或接收CAN报文时产生中断。
当从CAN总线接收到数据时,应用程序可以使用CANMessageGet()函数读取到所接收到的报文。同样,该函数也能读取这样一个报文:在改变报文对象的配置前,报文已被配置以便定位一个报文结构。使用这个函数读取报文对象,将会清除任何报文对象中正在挂起的中断。
一旦已使用CANMessageSet()来完成对一个报文对象的配置,那么此函数分配报文对象并继续执行其编程功能,除非通过调用ANMessage-Clear()将其释放。在对报文对象进行新配置前,无需请求应用程序清除报文对象,因此每次调用CANMessageSet()时,它将会覆盖任何之前被编程的配置。
32个报文对象是相同的,优先级除外。最小编号的报文对象具有最高的优先级。优先级以两种方式影响操作:第一种,如果在同一时间准备好多个操作,那么具有最高优先级的报文对象将会首先发生;第二种,多个报文对象正在挂起中断时,如果读取中断状态,则具有最高优先级的报文对象首先出现。由应用负责把32个报文对象作为一个源来管理,并确定分配和释放它们的最佳途径。
CAN控制器在下列条件下能够产生中断:
①当任何一个报文对象发送一个报文时;
②当任何一个报文对象接收一个报文时;
③满足警告条件,如一个错误计数器达到了限值,或出现多个总线错误时;
④满足控制器错误条件,如进入总线关闭状态时。
图3是CAN总线节点的软件流程。其中的对象就是一组数据的信息,包括下面结构体的信息:
[!--empirenews.page--]
其中,ulMsglD用作11或29位标识符的CAN报文标识符;ulMsgIDMask为在使能标识符过滤器时所使用的报文标识符屏蔽;ulFlags保存多个状态标志和tCANObjFlags所指定的设置;ulMsgLen是报文对象中的数据字节数;pucMsgData是指向报文对象的数据的指针。
此结构是对与CAN控制器中一个CAN报文对象相关的项目进行的压缩。可以直接将这个对象的信息填充,即进行对象的赋值工作。下面的代码是程序中CAN接口部分的初始化部分:
上面的这些函数都已经通过提供的API函数完成工作,CANConfigureNetwork函数要自己编写,代码如下:
这里仅仅是对前文介绍的对象进行赋值,是将系统中真正用到的对象配置成我们需要的对象(包括是发送还是接收)。此处鉴于篇幅只给出了两个对象,一个用于发送数据,一个用于接收数据。上面的函数设置好后就可以通过CAN中断控制器来接收和发送数据。上述程序代码在Keil C3.78版本上调试编译通过,并且已经成功用于产品中。
结语
本文介绍的CAN总线接口节点设计方案实现非常方便,硬件电路简单,软件设计模块化,可以应用此方案设计实用的系统。本文的接口就是称重仪表的一部分,可以直接将仪表与传感器组成的称重系统接入现有的分布式网络中。