当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]基于WinCE 环境的CAN 适配卡驱动程序的设计与实现

摘要:简要介绍了嵌入式实时操作系统WinCE环境下驱动程序的设计原理和CAN总线技术,并详细分析了依托PC/104总线的CAN适配卡底层驱动程序的设计与实现。

1.引言

WinCE 是一种为多种嵌入式系统和产品设计的紧凑、高效、可升级的操作系统,WinCE 采用标准模式,其最主要的特征:为有限的硬件资源提供了多线程、多任务和完全优先级的 计算环境。

WinCE 操作系统支持两种类型的驱动程序:[1]本地驱动程序(Build-In),是把设备驱动程 序作为独立任务实现,直接在顶层任务中实现硬件操作,完成特有专用的驱动程序;流接口 驱动程序,WinCE 的I/O 系统将设备程序作为内核过程实现,这种方式便于实现I/O 子系统 的层次模型,便于文件系统一起把设备作为特殊文件处理,提供统一的管理、统一的界面和 统一的使用方法,并把设备、文件及网络通信组织成为一致的更高层次的抽象,为用户提供 统一的系统服务和用户接口。驱动程序封装了将这些命令转换为它所控制的设备上的适当操 作所需的全部信息。

流接口驱动程序有在启动时加载和动态加载两种方式。本文实现的在 WinCE 环境下流结构的PC/104-CAN 驱动程序是在系统启动时加载的。

2. CAN 总线技术简介

CAN总线是德国Bosch 公司开发的一种串行数据通信协议,CAN 总线属于总线式串行 通讯网络,具有总线为多主方式工作且无需站地址节点信息、CAN 网络上的节点信息分成 不同的优先级、总线冲突仲裁时间低和总线的通信介质选择灵活等优点[2]。 CAN 适配卡的核心工作单元是它的控制器,控制器SJA1000 的组织结构如图1 所示。

 

 

其中,接口管理逻辑(IML):[3]它接收来自微控制器的命令,控制CAN 寄存器的寻址,并向微控制器提供中断和状态信息;发送缓存器:存贮发送到CAN 网络上的完整信息;位 流处理器(BSP):是一个控制发送缓存器和接收缓存器与CAN 总线之间控制数据流的程序 装置,同时具有执行错误检测、仲裁、总线填充和错误处理的能力;位定时逻辑(BTL)单 元:主要监视串口的CAN 总线,并处理与总线有关的位时序,使SJA1000 同步于CAN 总 线上的位流;错误管理逻辑(EML):主要完成接收BSP 的出错报告,并按照CAN 协议完 成错误界定, 从而使 BSP 和IML 进行错误统计。

CAN 适配卡的硬件网络工作环境示意图如图2 所示。

 

 

图2 中,通用微机的操作系统是WinCE,上位通用微机通过PC/104 总线与CAN 接口 适配卡相连,CAN 接口适配卡与具有CAN 接口的串行芯片通过CAN 总线进行数据交换, 所采用的协议是CAN 协议。在CAN 协议中,报文的表示、传送和控制主要由4 种类型的 帧来完成[4]:数据帧,携带数据信息,由发送器发送到接收器;远程帧,主要用于请求发送 具有相同标识符的数据帧,是通过总线发送的;出错帧标识总线错误,由检测出总线错误的 任何总线单元产生;超载帧主要为当前的和后续的数据帧提供附加延迟。

3 CAN 适配卡驱动程序的设计与实现

从引言部分可知,流接口可以为各种设备提供统一的访问接口,可以是字符设备、块设 备、虚拟设备和网络设备等。CAN 适配卡驱动程序的主要流程为[5]:应用程序调用函数 CreateFile 获取CAN 设备句柄,文件系统将会调用CAN 驱动例程中的CAN_Open 来响应应 用程序的请求。当应用程序调用ReadFile 函数读取CAN 设备上的字符时,文件系统将会调 用CAN 驱动例程中的CAN_Read 函数来读取CAN 设备上的字符。

对于本文流接口的驱动程序而言,是通过实现如下几个模块来实现驱动的:CAN_Open、 CAN _Close、CAN _Read、CAN _Write、CAN _IoControl 和CAN _Init 等模块。其中CAN _Init 模块是系统启动时由文件系统自动调用的,主要完成设备的初始化工作。另外,对于流接口 驱动程序可选函数CAN _PowerUp 和CAN _PowerDown,主要实现电源管理的功能。

限于篇幅,本文仅对主要的 CAN_Write 模块、CAN_Read 模块和中断服务线程模块的 实现作如下详细详细讨论。

3.1 CAN_Write 模块的实现

当 CAN 适配卡控制器在发送报文时,发送缓冲区对写操作是锁定的,这样CPU 必须 检查状态寄存器的发送缓冲区状态标志TBS,以确定可以将一个新报文写入发送缓冲区中, 当发送缓冲区被锁定(即标志TBS=0)时,CPU 周期性地查询状态寄存器,等待发送缓冲 区被释放;当发送缓冲区被释放(即标志TBS=1)时,CPU 将新报文写入发送缓冲区中, 并置命令寄存器的发送请求标志TR,该标志导致发送的启动。一旦发送成功中断产生,表 明CAN 报文已经发送成功。重复上面的工作就可以完成发送多个CAN 报文的工作。 CAN_Write 模块的流程图如图3 所示。

 

 

3.2 CAN_Read 模块的实现

如果 CAN 接收到一个报文,该报文通过验收滤波器验收并放入接收FIFO,则产生一个 接收中断。中断服务程序接收到这个中断后,将这个接收到的报文传送到由驱动程序维护的 报文存储区中,并置位命令寄存器的释放缓存区标志RRB。CAN_Read 函数并不等待来自 CAN 控制器的接收报文成功中断,而是读取保存在由驱动程序维护的报文存储区中的报文。 CAN_Read 函数的流程图如图4 所示。

 

 

驱动程序中的另外两个模块主要由 CAN_Close 、CAN_IoControl 函数来完成,前者主 要负责在关闭CAN 句柄时资源的回收任务,后者主要用于设置CAN 的工作参数,如波特 率,报文格式等,在此不作过多介绍。

 

[!--empirenews.page--]

 

4 结束语

本文的 CAN 适配卡驱动程序的开发环境:上位机是普通的PC 机,下位机的操作系统 是WinCE,硬件是深圳蓝天工控有限公司的嵌入式PC/104 总线主板PCM3568。驱动程序 已经过测试、验收。CAN 适配卡驱动程序运行可靠、通信稳定。产品已经被多个产家应用 于实际的工业控制领域。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭