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 的工作参数,如波特 率,报文格式等,在此不作过多介绍。
4 结束语
本文的 CAN 适配卡驱动程序的开发环境:上位机是普通的PC 机,下位机的操作系统 是WinCE,硬件是深圳蓝天工控有限公司的嵌入式PC/104 总线主板PCM3568。驱动程序 已经过测试、验收。CAN 适配卡驱动程序运行可靠、通信稳定。产品已经被多个产家应用 于实际的工业控制领域。