EDN China > 设计实例 > 通信 > TriplePlay > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

汽车ECU标定系统CAN驱动模块的实现

冯辉宗?? 张彧?? 蒋建春?? 陈培然?? 2012年03月20日 ?? 收藏1
1 前言

标定是指根据整车的各种性能要求(如动力性、经济性、排放及辅助功能等),来调整、优化和确定整车上各ECU(如发动机、AT等各子系统 ECU)控制参数的控制算法。标定系统主要是由上位机和底层ECU这二部分组成,因此,上位机和底层ECU的通信方式对整个标定系统的性能起到了至关重要的作用。目前,一般的标定系统都是采用基于串行口的点对点的通信方式,这种通信方式容易实现,但存在着通信速度较慢、可靠性较低等缺陷。这里我们采用的是CAN总线的通信方式,相对串口通信,基于CAN总线的通信方式具有通信可靠[1]、传输速度快、可实现在线编程等优点。

2 总体设计

CAN通信可视为系统的一个I/O字符流设备[3],它在完成普通收发功能的同时,还要能实现驱动程序必备的设备无关性。即驱动程序应将系统所有的硬件特性封装起来,为使用该设备的应用程序提供与硬件无关的、通用的编程接口,应用层程序编写人员无需了解设备的原理,即可顺利实现对设备的控制,通过该设备实现可靠的数据交换。另外,针对CAN通信和嵌入式系统的实时性要求,该驱动程序要求收发数据代码可靠,延迟短,占用系统时间短,中断执行时间短,关闭中断时间短,并在收发错误和发生异常情况时,向应用程序汇报。另外,该驱动程序需要监控CAN控制器的工作状态,在出现致命错误和脱离总线时,为CAN模块复位,并向系统汇报。

图1 驱动程序总体结构图
图1 驱动程序总体结构图

基于以上需求分析,结合其他OS中实现I/O串行设备的驱动方案及CAN的总线要求特点,设计总体驱动程序结构如图1。

3 CAN驱动模块的实现

基于以上总体设计框架,首先定义一个CAN类来封装CAN通信中的数据结构和函数,最下面一层为中断级程序,中断处理程序在每次CAN控制器完成收发时,唤醒驱动程序,进行下一步工作。在中断处理程序中,根据不同的中断向量来确定当前发生的是发送完成中断还是接受完成中断,并完成相应工作。中间一层为底层驱动程序,底层驱动程序主要是通过对CAN控制器寄存器的读写,完成对CAN端口的配置和状态检测等工作,同时为设备无关软件和用户程序提供接口。在这一层中,必须要建立一个环状缓冲结构,该缓冲由一个接收环状缓冲区和一个发送环状缓冲区组成,其数据结构如下代码所示,对于每个环状缓冲区,设计了一个存入指针指向下一个待存入CANMsg的存入地址,一个读出指针指向缓冲区下一个待取出的(最旧的)CANMsg的地址,一个计数器记录目前缓冲区中有多少个CANMsg待取出,一个信号量,用于与应用程序交换消息。接收环状缓冲区用于缓冲接收到的总线消息,等待应用程序处理,发送环状缓冲区用于缓冲应用程序发送出的消息,等待发送中断程序来处理。

typedef struct{ //环形缓冲区的数据结构

INT16U RingBufRxCtr; //接收计数器

OS_EVENT *RingBufRxSem; //信号量

CAN_msg *RingBufRxInPtr; //接收缓冲区的存入指针

CAN_msg *RingBufRxOutPtr; //接收缓冲区的读出指针

CAN_msg RingBufRx[CAN_RX_BUF_SIZE]; //接收缓冲区的消息存储

INT16U RingBufTxCtr; //发送计数器

OS_EVENT *RingBufTxSem;

CAN_msg *RingBufTxInPtr; //发送缓冲区的存入指针

CAN_msg *RingBufTxOutPtr; //发送缓冲区的读出指针

CAN_msg RingBufTx[CAN_TX_BUF_SIZE]; //发送缓冲区的消息存储

}CAN_RING_BUF;

3.1 底层驱动

底层驱动模块为我们应用程序提供了接收和发送消息的接口函数。

图2  CAN接收消息示意图
图2 CAN接收消息示意图

《电子设计技术》网站版权所有,谢绝转载


上一页123下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈