×
接口总线驱动 > 总线 > 详情

基于WINCE的CAN总线设备驱动研究

发布时间:2020-05-28 发布时间:
|

    目前嵌入式车载网络系统一般采用LINUX嵌入式操作系统,以ARM7s3c44Bo为微控制器,SJAl000为CAN控制器的解决方案,实现LINUX下的CAN通信.在WINCE平台下,CAN卡的研究已经有很多。也取得了不错的应用效果,但以ARM9s3c2440为嵌入式系统硬件核心,外围扩展CAN控制器SJA1000,嵌入式操作系统采用WINCE的应用方案几乎没有,所以值得研究.

1 嵌入式车载网络的构成

    嵌人式车载网络由若干个子节点控制器和主控制单元组成,其中主控单元对子节点进行监视与控制,实现不同的CAN数据总线系统问的数据交换,网络的拓朴结构如图1所示.

图1系统网络拓扑结构

2系统采用的驱动模型

    目前基于WINCE的两种驱动模型是本机设备驱动程序和流接口驱动程序,不同的驱动模型只能通过它们支持的软件接口来区别.

    本系统采用的是流接口驱动程序,图2给出了流接口驱动的工作结构.流接口驱动模型由设备管理器统一加载、管理和卸载,应用程序通过文件系统的API函数调用流接口函数,然后由流接口驱动程序调用本机驱动或者通过设备管理器与系统内核或外围设备进行信息交流。

图2流接口工作结构

3车载网络主控单元硬件平台实现

    本车载网络主控单元的硬件平台采用的是嵌入式处理器ARM9s3c2440,CAN控制器SJAlooO,CAN总线收发器82C250,人机界面采用触摸屏.系统的硬件组成结构如图3所示.

图3系统硬件组成结构

    车载网络主控制单元同时跨接在两个CAN网络之间,实现对高速、低速CAN网络的监控和数据的共享,相当于一个CAN的HUB.ARM9s3c2440和SJA1000之间的部分硬件原理下面将简单描述.

    本系统采用的XC95144是xILINX公司的复杂可编程逻辑器件(CPLD).由于系统还要提供许多其他接盯,如USB和PCMICA,为了更高效利用ARM9s3c2440的系统资源,特别是中断资源,在系统硬件的设计中采用了CPLD.CAN控制器SJAl000的中断引脚连接到CPLD,通过编制CPLD的一些逻辑控制程序,产生SJA1000的片选信号与中断信号,若CAN-INT中断,则触发ARM处理器的EINT0引脚,EINT0的硬件中断后,ARM捕捉到此中断信号.82C250是CAN总线收发器,在本系统的设计中82C250与SJA1000间采用了光耦器件来进行连接.

4流接口驱动相关函数的实现

4.1 WINCE下访问SJAl000寄存器的实现

    根据硬件平台,得到ARM9s3c2440与SJA1000连接的硬件地址,即SJA1000的物理基地址,再结合SJA1000各寄存器与基地址的偏移关系.可以得到寄存器的所有物理地址.

    在WINCE下,由于有MMU管理单元,因此不能使用物理地址,而只能采用虚拟地址(VA)来访问该寄存器.调用WINCE的系统函数VirtualAlloc,VirtualCopy把物理地址转化为程序可以访问的虚拟地址,然后通过SJA1000的虚拟地址来设置SJA1000的工作状态.SJA1000的基本工作流程如图4所示.[page]

图4 SJA1000工作流程

4.2 WINCE下流接口驱动的接口函数实现

    WINCE下每个流接口驱动都必须实现一组标准的接口函数,以下仅重点介绍部分接口函数及其实现.

    a.DWORD CAN—Init(DWORD dwContext):设备管理器初始化CAN设备时调用这个函数.CAN—Init的实现原理是:初始化CAN控制器SJA1000,创建一个WINCE的系统中断用来响应SJAl000的硬件中断,创建中断服务线程,此线程等待WINCE对应的系统中断发生,然后响应中断.图5是CAN—Init函数的实现流程.

图5 CAN-Init函数的实现流程

    b.WORD CAN—Open(DWORD hDeviceContext.DWORD AccessCode,DWORD ShareMode):打开一个CAN设备驱动程序时应用程序通过createFile()来调用此函数.

    c. BOOL CAN—IOControl (DWORD hopenContext,DWORD dwCode,PBYTE pBufIn, DWoRDDwLenIn, PBYTE pBufOut,DWoRD dwLenout,PDWoRD pdwActualOut):应用程序通过DeviceIocontrol()函数来调用此函数.

    d.DWORD CAN—Write(DWORD hOpenContext, LPCVOID DSourceBvtes, DWORD NumberOfBytes):当cAN设备驱动程序处于打开状态时由应用程序通过writeFile()来调用这个函数.

    e.中断服务线程(Can Thread)的实现原理:硬件中断后,触发ISR(中断服务例程),ISR只做部分处理工作(发送事件消息),IST(中断服务线程)收到触发消息后才开始工作.中断服务线程Can-Thread的实现流程如图6所示.

图6中断服务线程工作流程

    一个具体的流接口驱动程序跟注册表部分是分不开的,因此代码编制完成后,要建立一个can.reg文件保存到流接口驱动程序的目录里.

4.3应用程序对硬件设备的操作

    应用程序直接通过文件操作来访问硬件设备,文件操作会自动调用系统的流接口驱动程序的函数.比如:文件操作的ReadFile函数会自动调用底层的Can-Read等函数.本研究完成了基于WINCE嵌入式车载网络的CAN总线管理单元的设计,实现了CAN网络的连接,并成功地运用到嵌入式车载网络上,实践证明这种实现方式具有良好的特性和一定的使用价值 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
FPGA芯片对全彩LED大屏幕系统的控制设计