您的当前位置:首页正文

Windows CE的CAN总线驱动程序设计

2022-09-22 来源:伴沃教育
维普资讯 http://www.cqvip.com 111 Wi ndows CE的CAN息线驱动程序设计※ ■北京交通大学 彭少武 宋娟 王立德 介绍一种基于¥3C2410的Windows CE扩展CAN总线接口的方法。利用SPI接口扩展CAN总线接口, 摘要 编写CAN流接口驱动程序;给出硬件接口设计原理图,重点阐述WinCE下独立CAN控制器MCP2510 的驱动程序的实现,并给出软件处理流程。 关键词 CAN总线¥3C2410 SPI接口 流接口驱动程序 MCP2510 Windows CE ARM芯片¥3C2410是Samsung公司生产的一种高 集成度、高性价比的嵌入式处理芯片,已成功用于工控设 种SPI模式。在SPI模式0-0时,命令和数据在SCK的上 升沿通过SI脚送入MCP2510,在SCK的下降沿通过SO 脚送出数据。当执行这些操作时,CS引脚应始终保持在 低电平。CS引脚被置低后送进的第一个字节的数据就是 命令字,紧跟命令字后的是地址和数据。本系统的相关硬 件部分为¥3C2410和CAN控制器芯片MCP2510的连接 与实现。接口的硬件连接如图1所示。MCP2510作为 ¥3C2410的一个从设备,可以将¥3C2410的SPI接口直接 接在MCP2510的SPI接口上。具体接法是:¥3C2410的 接收引脚MISO接MCP2510的发送引脚SO,¥3C2410的 备上。然而,其美中不足的是没有集成CAN控制器,使 其在工控产品的应用中受到了一定的限制。 目前,国内广泛应用的Philips公司的独立CAN控制 器SJA1000存在一定的缺陷,如地址、数据总线的分时复 用常导致接口效率低下;接收、发送缓冲区的个数太少,导 致数据吞吐率不高;帧屏蔽和过滤器的设置不够灵活,不 能满足同时需要更多屏蔽和过滤条件的要求等。 Microchip公司生产的MCP2510是一种带有SPI接 口的独立CAN控制器,支持CAN技术规范V2.OA/B,能 够发送和接收标准的和扩展的信息帧,同时具有接收滤波 和信息管理的功能。MCP2510通过SPI接El与MCU进 行数据传输,最高数据传输速率可达5 Mb/s。采用 MCP2510给S3C2410扩展CAN接El,可以降低硬件电路 的复杂性,保证CAN总线通信的稳定性,并提高效率。下 面以自行开发的人机界面(HMI,H m Machine Inter[ace)中 发送引脚MOSI接的是MCP2510的SI脚;同步时钟SPI— CLK由¥3C2410提供;MCP2510的片选信号CS由 ¥3C2410的标准I/O口GPG2控制,GPG2置低时选通 MCP2510,反之则不选通;中断信号由MCP2510发给 ¥3C2410;MCP2510的复位引脚RESET与¥3C2410相 连,且接在上电复位和按键复位上;MCP2510出来的 VCC2 GND1 VCC1 、1)D TxCAN RESET RxCAN l CS CLKOUT CAN总线通信接口设 计为例进行说明。 I SO TXORTS l SI TX1RTS 13 l SCK TX2I S 12 I INT oSC2 l1 『RXOBF oSC1 1O 一G GNTD2 上 I MCP2551 l RX1BF MCP2510 VSS 1 系统硬件 结构 SPI接口协议是 Motorola公司推出的 一INT 30pFX2Lr丁 —V C1 VCC2 一VCC2 I l VCC1  l GND1 种使用时钟和2根 串行协议。 数据线传输数据的同 步MCP2510将在一个 CS的下降沿选用一 SPICLK0 SPIMOS10 SPIMISO0 GPG2 RESET l I I l 1 1k.O [=]- lVCC2 [=]_ 3啪 0.1uF 图1硬件电路原理 paper@mesnet.tom.cn(投稿专用) 维普资讯 http://www.cqvip.com

_臣 CAN收与CAN发信号和CAN总线收发器MCP2551接 在一起,构成一个完整的CAN总线收发模块。 DC0505是一个5 V一5 V的隔离电源,提供给光耦 V1,修改注册表和CEC文件。 ’。。。。。。。。。。‘’图3只举例说明所有模块 初始化部分。整个模块分为3 部分初始化。 l。Vitua Alloc。。。。。。。。。。。。——虚拟地址映射 ——1一(SPI、I/0) I  6N137和CAN收发器MCP2551,使系统更加稳定、可靠。 陶 2 软件实现 Windows CE把设备驱动程序分成3类 :本机设备 驱动程序、总线驱动程序、流式接口驱动程序。 ①本机设备驱动程序(native driver)也叫作“Build in 2.2本机设备驱动程序 2.2.1虚拟地址映射 由于Windows CE的特 SPI通信初始化 点,在操作系统之上要想让应 用程序通过OEM层到达实际 的硬件进行控制,必须进行虚 CAN初始化 拟内存分配和虚拟地址映射, 复位命令(软复位) 写命令(禁止中断) 写命令(进入配置模式) 写命令(设置波特率) 写命令(进入正常模式) 位修改命令(设置屏蔽位) 驱动程序”,是硬件所必需的,通常由OEM设计硬件时完 成,例如键盘驱动程序、触摸屏驱动程序以及音频驱动程 序等等。该类型的驱动程序有时不支持通用的设备驱动 程序接口,而且用户不能对其接口进行扩展,所以当有新 版本的操作系统发行时,这些驱动程序就要被修改。 ②总线驱动程序(bus driver)用来管理物理总线,它 通过询问总线上的硬件设备来装载适当的驱动程序,如 PCI总线。直接调用ActiveDeviceEx函数以加载设备驱 动程序。但是所加载的设备驱动程序可能通过另一个设 备驱动程序来间接管理硬件;同时,总线驱动程序决定哪 些额外的驱动程序也要被装载进来,以及按照怎样的顺序 来进行装载。 这与单片机形式的直接控制硬 件有很大的不同。管理虚拟内 存的硬件是内存管理单元 MMU(Memory Management Unit)。MMU负责把虚拟地址 映射到物理地址,并且提供一 图3模块初始化 定的内存保护。所以,整个驱动的首要工作是解决如何让 操作系统之上的软件接触到底层硬件。 首先,调用VitualAlloc函数(最底层的分配虚拟地址 空间的函数),如V pSSPregs一(volatile SSPreg )Vir— tualAlloc(0,sizeof(SSPreg),MEM—③流式接口驱动程序(stream interface driver)是指 驱动程序把流式接口函数公开出来,而不考虑驱动所控制 的设备类型。典型的流式接口驱动有:文件系统驱动 (iostream、fstream),COM,LPT等。 RESERVE,PAGE— NOACCESS)。在Samsung公司提供的BSP的头文件 ¥241O.H中,SSPreg表示SPI寄存器的结构体。此语句 分配一块SSPreg大小的空间,并将首地址返回给 v_本系统采用流接口方式编写驱动程序,主要涉及3部 分:本机设备驱动程序、导出流接口函数和修改注册表部 分,如图2所示。 应用程序 pSSPregs,供后续调用。 之后,用VitualCopy函数,将¥3C2410中的SPI寄存 器结构体基地址SSP_BASE映射到刚刚分配的虚拟地址 空间中,如VirtualCopy((PVOlD)v—pSSPregs,(PVOID) ssPBASE,sizeof(SSPreg),PAGEREADWRITE  lPAGE _——f文件系统API 一… ~卜 ● f流接口函数I。流接口  mvdowsCE 卜—.1 兰竺呈兰lf本机设备l 1一L—— I驱动程序I 'NOCACHE))。此时,便可给V pSSPregs赋值,以修改 SPI寄存器,正常启动SPI通信。 . 2.2、2 SPI初始化 虚拟地址映射成功后,开始设置与SPI功能相关的 ¥3C2410的4个多功能复用引脚,分别为SPISCK(SPI同 步时钟)、SPIMOSI(主入从出)、SPIMISO(主出从入)和 ● 中断事件 硬件平台 + ● + 图2 CAN总线流接口驱动程序框图 GPG2(片选CS);接下来设置SPI波特率、主模式、查询方 式、提供时钟、0-0模式。 SPI正常工作后,就可通过SPI对MCP2510的寄存 器进行设置。归结起来,对SPI的操作仅需两条基本命令 2、1软件处理流程 软件的实现,首先要确保¥3C2410的SPI口可以正常收 发,然后才可以利用SPI口对MCP2510的寄存器进行设置。 所以第1步是对¥3C2410的SPI口初始化,之后用SPI口对 MCP2510进行初始化;第2步开始编写CAN控制器的收发 程序;第3步开始写出CAN流接口函数形式;最后导出流接 就可以组合出来,就是读命令和写命令。写命令为: unsigned char SpiWrite(unsigned char Data){ —v—pSSPregs一>rSPTDAT0一Data; //向SPI发送缓冲器写入待发内容 80《丰‘;机 入式牵诧应用》___—珥圈_唧 adv@mesnet.eom.cn(广告专用) 维普资讯 http://www.cqvip.com

while(!(vpSSPregs一>rSPSTA0 —1)); 位ID),id为写入的ID值;rxRTR表示是否远程帧;data 表示要写入的数据;dlc表示数据长度。 编者注:驱动程序源代码见本刊网站www.mesnet. corn.cn。 //查询判断SPI状态,是否发完 return(UINT8)vpSSPregs一>rSPRDAT0; —//返回接收的数据 l 写命令中包含了读取SPI总线接收缓冲器,所以SPI 2.4导出流接口函数 流接口驱动程序实现CAN—Init()、CAN—IOControl ()以及CAN—PowerUp()等一组标准的函数,用来完成标 读命令内容,只需用写命令向要查询的寄存器写入0xFF (SPI正常模式),就可以读出该寄存器的内容。 2.2.3 CAN初始化 根据厂家MCP2510芯片的技术规定,采用以下操作 准的文件I/0函数和电源管理等,要生成一个DI I 。 在对设备进行读操作之前,首先要通过执行CreatFile ()函数来调用CAN—Open()打开设备。CAN—Open()所 需的第1个参数是应用程序初始化时由CAN—Init()返回 的设备句柄;而CAN—Read()需要的第1个参数是Creat— File()执行成功后返回的驱动引用实例句柄。第2个和第 3个参数分别是用于从驱动中读数据的缓冲区地址和长 度。应用程序通过ReadFile()函数来调用CAN—Read()。 最后建立一个“MCP2510.def”的文件,将D1 L中的函 数输出,并将此文件添加到流接口驱动程序的工程里面。 步骤对芯片进行初始化。先发复位命令(软复位),接下来 分别是写命令(禁止中断)、写命令(进入配置模式)、写命 令(设置波特率)、写命令(进入正常模式)和位修改命令 (设置屏蔽位)。 由于篇幅关系,现仅对最常用的写命令进行解释。如 向MCP2510指定地址写入一个字节为: void 2510Write(unsigned char address,unsigned char value){ 一25i0CS_L; 一SpiWrite(2510INSTRU—WRITE); —SpiWrite(address); —2.5修改注册表 具体的流接口驱动程序跟注册表是分不开的,写一个 注册表文件通过添加组件的方式添加到Windows CE内 SpiWrite(value); _2510CS_H; _) 2510一CS L和2510一CS—H分别为CS引脚的置低和 核中。下面为注册表修改处内容:[HKEY—LOCAI 一 MACHINE\Drivers\Buildln\MCP2510] ”Index”=dword:l 置高,这是对MCP2510进行操作的开始和结束的必不可 少的环节。参考Microchip公司的MCP2510芯片手册, 对其寄存器操作必须先写入指令操作码(操作方式),然后 写入寄存器地址和内容。所以这里用SPI向MCP2510先 写入指令写操作码MCP2510INSTRU—WRITE(头文件中 定义为0X02),然后是地址address和内容value,这样一 ”Prefix”一”CAN” ”D11”一?”CanDriver.dll” ”Order”=:dword:0 个写命令就完成了。其他命令类似。 3 结 论 本设计采用ARM芯片¥3C2410集成的SPI接口扩 2.3 CAN收发实现 针对CAN总线协议 和MCP2510 。 的芯片特性 CAN的收发函数都要包括ID和数据。下面对CAN总线 发送数据函数举例展开: void 2510CanWrite(UINT8 nbuf,int IsExt,UINT32 id,int 一—展CAN总线接口,在不改变CAN总线自身的特点的前 提下,使得系统硬件设计简单,增强了系统的可靠性。实 现扩展的CAN总线接口通过回环测试和联网测试,效果 良好,证明了该方案的正确性和可靠性。簟 参考文献 EI]周毓林.Windows CE.NET内核定制及应用开发EM].北 京:电子工业出版社,2005. rxRTR,UINT8*data,UINT8 dlc){ UINT8 mcpaddr一(nbuf<<4)+0x3i; —25i0Swrite(mcp—addr+5,data,dlc); 一2510WriteID(mcp—addr,id,IsExt); 一_if(rxRTR)一dlc l=RTR—MASK; [2]邬宽明.CAN总线原理和应用系统设计[M].北京:北京航 空航天大学出版社,2001. 2510Write((mcp—addr+4),dlc); [3]Microsoft公司.Microsoft Windows驱动程序模型设计 MCP2510有3个TXBUF(发送缓冲区),参数nbuf [M].北京:北京大学出版社,2000. (收修改稿日期:2007—06—20) 为使用第几个发送缓冲区;IsExt表示是否是扩展总线(29 paper@mesnet.conr.cn(投稿专用) Micr。c。ntr。11ers&Embedded Systems 8 1 

因篇幅问题不能全部显示,请点此查看更多更全内容