DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 718|回复: 0
打印 上一主题 下一主题

[接口电路] μC/OS-II的CAN驱动程序设计

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-16 17:20:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

                    ???? 摘要:实时性是衡量CAN现场总线系统性能的一个重要标准。本文提出一种采用μC/OS-II操作系统和I-CAN协议,在应用层面上提高CAN总线系统实时性的驱动程序设计方案,并以分层的方式逐层阐述CAN驱动程序的设计过程。
  引言
  CAN总线是德国Bosch公司于1983年针对汽车应用而开发的,一种能有效支持分布式控制和实时控制的串行通信网络,属于现场总线的范畴。其通信距离与波特率有关,最大通信距离可达10 km,最大通信波特率可达1 Mbps。CAN总线仲裁采用1l位(CAN2.OA协议)和29位(CAN 2.OB协议)标志,以及非破坏性仲裁总线结构机制,可以确定数据块的优先级,保证在网络节点冲突时最高优先级节点不需要冲突等待。CAN总线上的任何节点均可在任意时刻,主动向网络上其他节点发送信息而不分主次,从而实现各节点之间的自由通信。目前,CAN总线协议已被国际标准化组织认证,技术比较成熟,已广泛应用于汽车、工业、高速网络和低价位多路连线等领域中。
  μC/OS-II是Jean J.Labrosse开发的一种小型嵌入式操作系统。它实质上是基于优先级的可剥夺型内核,系统中的所有任务都有一个唯一的优先级别,适合应用于实时性要求较强的场合。本文采用μC/OS-II来设计CAN的驱动程序,以满足系统的实时要求。
  1 CAN节点的硬件设计
  CAN节点是分布在CAN网络中进行相互通信的基本单元,主要由主控制器、CAN控制器和CAN收发器组成。本设计中,节点的基本结构如图1所示。在CAN网络中,ECU(ElectrONic Control Unit)是指一个具有完整功能的CAN节点。




  3 CAN设备控制层和CAN接口控制层
  CAN设备控制层的主要任务是:初始化主控制器与CAN控制器之间的连接配置,复位CAN控制器,建立主控制器和CAN控制器之间的通信函数。由于LPC2368内部集成了CAN控制器,CPU可以通过内部APB总线接口对CAN控制器的所有寄存器进行访问,所以不再需要编写设备控制驱动层程序,已经完全由硬件实现了。
  CAN接口控制层主要任务是:实现CAN控制器的各种功能,如设置控制模式、发送数据、释放接收缓冲区、配置验收滤波器等。这些操作都是通过读写CAN控制器的内部相关寄存器来实现的。
  CAN控制器初始化程序(在应用层中实现,内部调用的函数也都是在该层中编写的)如下:




  CAN总线仲裁是从标识符的最高位(28位)开始逐位进行的。每一个发送器都对发送位的电平与被监控的总线电平进行比较:如果相同,则这个单元可以继续发送;如果发送的是“隐性”(逻辑1)电平,而监控到的却为“显性”(逻辑O)电平,那么该单元就失去了仲裁,必须退出发送状态。根据I-CAN源节点编号部分可以看出,节点的地址编号越小,优先级也就越高,在仲裁时能够优先获得总线使用权。在CAN网络系统中,节点越重要,分配的地址编号的优先级相应地也越高。譬如,车载网络中的发动机电控单元就应该比定向大灯电控单元的优先级高,这样才能保证重要的报文及时传送出去。在节点接收到报文之后,应用程序依据I-CAN协议解析报文标识符,并实现其指定的功能。
  5 CAN应用层
  CAN应用层实现CAN控制器的所有功能。CAN设备控制驱动层、CAN接口驱动层和CAN协议层都在应用层的控制之中。应用层主要实现的任务包括:
  ①初始化CAN控制器,以及与应用层相关的全局变量。
  ②编写CAN控制器的中断服务程序。
  ③报文处理任务。该任务基于I-CAN协议来解析报文,并实现报文指示的功能。
  ④报文发送任务。该任务存储未能发送的报文,并在发送缓冲区可用的情况下自动发送报文。
  初始化CAN控制器的程序详见第3节。由于初始化CAN控制器直接和CAN物理层及链路层的性能挂钩,因此只有依据具体应用环境正确地配置CAN控制器,才能使系统稳定地运行。
  5.1 中断服务程序
  中断服务程序用来判断CAN控制器的中断类型,并作出相应的响应。具体程序如下:




  其中,RI_DATA为定义的结构体CAN_MSG变量;CANlRFS、CANlRID、CANlRDA和CANlRDB分别为CAN控制器存储接收报文帧信息、标识符、数据字节的寄存器。CAN_MSG结构体如下所示:




  如果需要发送CAN报文,首先要查询是否有可用的发送缓冲区:若有则可用就直接发送,无须通过消息队列作为中介,从而提高程序运行效率;若都被锁定,则调用OSQPost()将报文发送到报文发送函数的消息队列MESSAGE_TX中,并执行TX_CNT++操作。
  ②在繁忙的CAN网络中,节点可能会由于仲裁丢失而无法及时将数据传输,因此必须要对待发送的数据进行存储,等待节点获得总线使用权时再发送出去。LPC2368的CAN控制器有一个三态发送缓冲区,最多能够存储3个报文。若3个缓冲区都处于锁定状态(报文正在等待发送或正
  处于发送过程),而又有一个报文需要发送,则需要额外的缓冲区先将它存储起来,以待节点获得总线使用权时再发送。
  定义一个指针数组,把建立的消息数据缓冲区的首地址存入这个数组中,然后再调用OSQCreate()函数来创建一个用于存储发送报文的消息队列MESSAGE TX,最后通过OSTaskCreate()函数建立一个负责发送报文的任务。该任务由一个请求消息队列函数OSQPend()和一个请求信号量函数OSSemPend()组成。报文发送函数如下:




  再结合CAN链路层的仲裁机制,就可以保证优先级别高的节点优先发送报文,并被接收节点优先处理。至此,CAN驱动程序的整个脉络已经非常清晰,其总体流程略——编者注。
  结语
  本文基于μC/OS-II操作系统、针对实时性要求较高的CAN系统编写的CAN驱动程序简洁、高效,在不同的应用环境下只需添加相应的用户代码,就可以组成完整的CAN驱动程序。但在提高高优先级节点实时性的同时,在一定程度上也降低了低优先级节点的实时性,所以在工程应用中应根据实际需要兼顾高低优先级节点的实时性能。
            
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-4-28 17:32 , 耗时 0.086705 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表