新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > Cortex-M3内核芯片LM3S2965的CAN总线节点设计

Cortex-M3内核芯片LM3S2965的CAN总线节点设计

作者: 时间:2011-02-15 来源:网络 收藏

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总线节点的软件流程。其中的对象就是一组数据的信息,包括下面结构体的信息:

c.JPG

称重传感器相关文章:称重传感器原理


评论


相关推荐

技术专区

关闭