EDN China > 设计实例 > 汽车电子 > 总线技术 > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

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

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

3.2 中断服务程序

根据前面谈到发送和接收消息的软件结构,在CAN初始化时就要求CAN的接收中断处入开启状态,而发送中断仅仅是在发送缓冲区里面有了第一则消息后再开启的,因此在这里设计两个接口函数,CAN.TxIntEn()和CAN.TxIntDis(),分别将发送屏蔽位置1(允许发送完成中断)和置0(禁止发送完成中断)。

图4  发送接收中断程序流程图
图4 发送接收中断程序流程图

中断级程序的核心就是CANRX_ISR()和CANTX_ISR(),它们由初始化时对该模块的中断设置寄存器设置的中断级别。如图4所示,若为接收完成中断,则清除中断源,将接收到的消息放入接收缓冲区;将该消息存入接收缓冲区存入指针所指向的地址,将该指针向下移动,接收缓冲区计数器加1,并发出信号量通知应用程序有新的消息已经接收到,若有任务正在等待CAN上的新消息,则该任务进入就绪状态等待OS的调度。若为发送完成中断,则将发送缓冲区的待发送消息读出;将有待发送消息且优先级最高的一个中读取最旧的消息(缓冲区取出指针所指向的消息),发送缓冲区计数器减1,发出信号量通知应用程序有一个消息被发出,并汇报当前发送缓冲区的状态;还应判断是否为最后一个待发送的消息,若不是,则清除中断源并将消息发送到总线上,若是最后一个,则禁止发送完成中断后发送该消息,将这个发送完成中断保留到应用程序下一次发送消息的时候允许并产生。

3.3 应用

该驱动程序的应用,如下代码所示,这里使用的是uCOS-II,首先定义一个CAN消息对象(msg)和一个环状缓冲区数据结构(CANRingBuf),在主程序中,初始化OS以后调用Ringbuf_Init()函数初始化环形缓存区,然后调用CAN_Init()函数初始化CAN端口。在启动OS后,用户就可用在任何任务中调用CAN_PutMsg(CAN_msg *msg)和CAN_GetMsg(CAN_msg *msg)发送和接收总线消息了。

CAN_msg msg;

CAN_RING_BUF CANRingBuf;

void main(void) {

OSInit();

Ringbuf_Init();

CAN_Init();

/* Creat task1 */

OSStart(); }

void task1 (void * data)

{ CAN_PutMsg(&msg;);

CAN_GettMsg(&msg;);

}

4 结束语

通过改变芯片总线频率、CAN通信速率这样多次反复不断的调试,此CAN驱动在实时操作系统上运行稳定可靠,未出现数据丢失,较好的实现了上位机与ECU的通信,因此,具有很强的实用价值。

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


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


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

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

相关文章

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