基于uCOSII的CAN驱动程序设计.doc
- 文档编号:236114
- 上传时间:2022-10-07
- 格式:DOC
- 页数:8
- 大小:453.50KB
基于uCOSII的CAN驱动程序设计.doc
《基于uCOSII的CAN驱动程序设计.doc》由会员分享,可在线阅读,更多相关《基于uCOSII的CAN驱动程序设计.doc(8页珍藏版)》请在冰豆网上搜索。
基于uC/OS-II的CAN驱动程序设计
成进施国梁
摘要:
实时性是衡量CAN现场总线系统性能的一个重要标准。
本文提出了一种采用uC/OS-II并结合I-CAN协议在应用层面上提高CAN总线系统实时性的驱动程序设计方案,并以分层的方式逐层阐述CAN驱动程序的设计过程。
关键字:
CAN总线,uC/OS-II,实时性,驱动程序
CAN-DriverDesignBasedonuC/OS-II
ChengJinShiGuoliang
(CollegeofElectronicandInformation,SoochowUniversity,Suzhou215006)
Abstract:
Real-timeisanimportantstandardofmeasuringtheperformanceofCANfieldbussystem.ThispaperpresentsacandriverdesignbyusinguC/OS-IIincombinationwithI-CANprotocolwhichimprovethereal-timeofCANbussystemattheapplicationlevel,anddescribesCANdriverdesignprocesslayerbylayeredapproachdescribedinhierarchicalway.
Keywords:
canbus;uC/OS-II;real-tine;drivers
引言
CAN-BUS是德国Bosch公司于1983年为汽车应用而开发的一种能有效支持分布式控制实时控制的串行通信网络,属于现场总线的范畴。
通信距离与波特率有关,最大通信距离可达10Km,最大通信波特率可达1Mbps。
CAN总线仲裁用11位(CAN2.0A协议)和29位(CAN2.0B协议)标志和非破坏性仲裁总线结构机制,可以确定数据块的优先级,保证在网络节点冲突时最高优先级节点不需要冲突等待。
CAN总线上任何节点可在任意时刻主动向网络上其他节点发送信息而不分主次,因此可实现各节点之间的自由通信。
目前,CAN总线协议已被国际标准化组织认证,技术比较成熟,已被大量应用于汽车、工业环境、高速网络和低价位多路连线的应用中。
uC/OS-II是JeanJ.Labrosse开发的一种小型的嵌入式操作系统,它实质上是基于优先级的可剥夺型内核,系统中的所有任务都有一个唯一的优先级别,它适合应用在实时性要求较强的场合。
正是由于uC/OS-II的这些特点,笔者采用它来设计CAN的驱动程序以满足系统的实时要求。
1CAN节点的硬件设计
CAN节点是分布在CAN网络进行相互通信的基本单元。
它主要有主控制器、CAN控制器和CAN收发器组成。
本设计的节点结构如图1所示。
图1CAN节点基本结构框图
CAN节点采用NXP公司的LPC2368作为主控制器。
LPC2368是一款基于ARM7TDMI-S内核的RISC处理器,它包含两个兼容CAN2.0B规范的CAN控制器。
每个CAN控制器拥有双重接收缓冲器和三态发送缓冲器,快速的硬件实现的搜索算法,支持大量的CAN标识符。
在电压兼容方面,由于LPC2368是一款3.3V器件,虽然其对应的CAN收发器接口引脚能够承受5V电压,但为了让CAN节点能够更稳定得运行,这里采用TI公司的3.3伏CAN收发器SN65HVD230D与之配合使用。
SN65HVD230D的高输入阻抗特性可以在一条总线上支持多达120个CAN节点,并且能够和5V的CAN收发器良好地兼容。
由于硬件设计不是本文的重点,所以这里不再详述。
下面将详细介绍CAN驱动程序的设计。
2CAN驱动程序设计总体思想
为了使软件可移植性强、易维护,采用分层的方法编写CAN驱动程序。
驱动程序分层结构见图2。
图2驱动程序分层结构图
双向线表示实时操作系统uC/OS-II与CAN驱动程序之间的数据交换。
单向箭头表示上层软件对下层软件的调用。
这样的驱动程序结构分明,可读性强且易于维护。
下面将从下往上分析各层软件的设计和实现方法。
3CAN设备控制层和接口控制层
CAN设备控制层主要任务是:
初始化主控制器与CAN控制器之间的连接配置、复位CAN控制器、建立主控制器和CAN控制器之间的通信函数。
由于LPC2368内部集成了CAN控制器,CPU通过内部APB总线接口能够对CAN控制器的所有寄存器进行访问,所以不再需要编写设备控制驱动层程序,已经完全由硬件实现了。
CAN接口控制层主要任务是实现CAN控制器的各种功能。
如设置控制模式、发送数据、释放接收缓冲区、配置验收滤波器等等。
这些操作都是通过对CAN控制器的内部相关寄存器的读写来实现。
程序清单3.1展示的是应用层中实现CAN控制器初始化操作的程序,内部调用的函数都是在这一层中进行编写。
程序清单3.1CAN初始化程序
voidCAN20B_Init()
{
#ifCAN1_EN>0
while((CAN1MOD&CAN_MOD_RM)!
=1)
CAN1_MOD_RM();//进入复位模式
CAN1_BTR();//配置总线定时寄存器
ID_RAM();//配置验收滤波器
while((CAN2MOD&CAN_MOD_NM)!
=1)
CAN1_MOD_NM_SET();//进入正常模式
CAN1_INT_EN();//中断使能寄存器设置
#endif
}
为了使程序更加简洁,可读性强,一般可以通过宏定义的形式进行编写。
例如:
#defineCAN_MOD_RM()CAN1MOD|=1,CAN1MOD是CAN控制器的模式寄存器,对它的最低位置1使CAN控制器进入复位模式,这种模式下可以对控制器的所有寄存器进行写操作。
其他的对于CAN控制器内部寄存器的操作可以参照LPC2368的技术手册,这里不再详述。
4CAN协议层
从OSI网络模型的角度来看,现场总线网络一般实现了第1层(物理层)、第2层(数据链路层)、第7层(应用层)。
而CAN现场总线仅仅定义了第1层、第2层,这两层分别由CAN收发器和CAN控制器实现。
CAN没有规定应用层,本身并不完整,需要一个高层协议来定义CAN报文中的11/29位标识符、8字节的使用。
目前已经存在一些国际上标准的CAN-BUS高层协议,例如DeviceNet协议和CANopen协议。
但是这个协议规范比较复杂,理解和开发难度都比较大,对于一些并不复杂的基于CAN总线的控制网络不太适合。
本设计采用国内周立功CAN开发组织根据实际应用制定的一简单的CAN应用层协议I-CAN协议作为软件设计的CAN协议层。
I-CAN协议中的29位帧标识符定义如表4.1所示。
位
符号
功能描述
28:
21
SrcMACID(源节点编号)
发送节点的编号
20:
13
DestMACID(目标节点编号)
接收节点的编号
12:
5
FUNCID(功能码)
指示报文的功能
4:
0
SourceID(资源节点编号)
指示操作设备内部单元
表4.1I-CAN协议中的标识符定义
CAN总线仲裁是从标识符的最高位(28位)开始逐位进行。
每一个发送器都对发送位的电平与被监控的总线电平进行比较。
如果电平相同,则这个单元可以继续发送。
如果发送的是“隐性”(逻辑1)电平而监控到为“显性”(逻辑0)电平时,那么该单元就失去了仲裁,必须退出发送状态。
再根据I-CAN源节点编号部分可以看出,节点的地址编号越小优先级也就越高,在仲裁时能够优先获得总线使用权。
在CAN网络系统中越重要的节点应该分配优先级越高的地址编号,譬如车载网络中的发动机电控单元就应该比定向大灯电控单元的优先级高,这样才能保证重要的报文及时传送出去。
在节点接受到报文之后,应用程序依据I-CAN协议解析报文标识符并实现其指定的功能。
5应用层
应用层实现CAN控制器的所有功能。
CAN设备控制驱动层、CAN接口驱动层和CAN协议层都在应用层的控制之中。
应用层主要实现的任务包括:
(1)初始化CAN控制器以及初始化应用层相关的全局变量。
(2)编写CAN控制器的中断服务程序。
(3)报文处理任务。
该任务基于I-CAN协议来解析报文,并实现报文指示的功能。
(3)报文发送任务。
该任务存储未能发送的报文,并在发送缓冲区可用的情况下自动发送报文。
初始化CAN控制器的程序可以参照程序清单3.1,这里不再详述。
但是由于初始化CAN控制器直接和CAN物理层及链路层的性能挂钩,必须要依据具体应用环境正确地配置CAN控制器才能使系统稳定地运行。
5.1中断服务程序
中断服务程序判断CAN控制器的中断类型,作出相应的响应。
其函数见程序清单5.1。
程序清单5.1中断服务程序
voidCAN1_ISR()
{
INT32Ucan1_i_st;
VICVectAddr=0x0;//更新VIC优先级硬件
OSIntEnter();
can1_i_st=CAN1ICR;//读中断和捕获寄存器
if(can1_i_st!
=0)
{
if(can1_i_st&CAN_RI)//接受中断
CAN1_RI_HANDLE();
if(can1_i_st&CAN_TI1)//发送中断1
{if(TX_CNT>0)
OSSemPost(CAN_TX_OVER);}
if(can1_i_st&CAN_TI2)//发送中断2
{if(TX_CNT>0)
OSSemPost(CAN_TX_OVER;}
if(can1_i_st&CAN_TI3)//发送中断3
{if(TX_CNT>0)
OSSemPost(CAN_TX_OVER);}
if(can1_i_st&CAN_BEI)//总线错误中断
CAN1_BEI_HANDLE();
}
OSIntExit();//中断级任务切换
}
这里只对接受中断发送中断以及总线错误中断进行阐述,其他类型的CAN中断处理应根据具体系统进行针对性设计,不具有通用性。
CAN1_RI_HANDLE()负责接收报文,并将报文发送到任务的消息队列中。
其代码如程序清单5.2所示。
程序清单5.2接受中断处理函数
voidCAN1_RI_HANDLE()
{
RI_DATA.FRAME=CAN1RFS;
RI_DATA.ID=CAN1RID;
RI_DATA.DataA=CAN1RDA;
RI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 uCOSII CAN 驱动程序 设计