SJA1000和PDIUSBD12都有完善的中断机
微控制器可以通过读它们的中断寄存器获得总线事件。为了提高固件的运行效率,主程序对系统进行实始化后开放中断,在中断服务程序中对事件进行分析和必要的处理,并设置相应的变量标志和数据缓冲区。主程序则循环查询变量标志,调用相应的子程序进行处理。这种程序结构使得主程序能够在前台处理各种数据传送任务,同时又可以通过中断在后台及时处理总线事件。
2.1.1 CAN协议实现
SJA1000支持BasicCAN和PeliCAN两种协议模式。在适配器设计中采用了BasicCAN模式。中断设为电平中断方式,SJA1000中断服务程序框图如图2所示。
2.1.2 USB1.1协议实现
PDIUSBD12支持所有的四种USB数据传输方式。在适配器的设计中使用了控制传输、中断传输和批量传输。控制传输中只用来传递控制信息,固定使用端点0;中断传输使用端点1,用来传送CAN网络状态信息;批量传输用来实现主机和CAN网络节点之间的数据传送,使用端点2。图3是PDIUSBD12中断服务程序框图。
2.2 驱动程序设计
USB驱动程序属于WDM(Windows driver module)类型。WDM驱动程序是分层的,引入了FDO(Function Device Object)和PDO(Physical Device Object)两个新类来描述硬件,每一个物理硬件有一个PDO,但是可以有多个FDO,在驱动程序中直接操作的是PDO和FDO。系统通过全局唯一标识符GUID实现驱动程序的识别。应用程序和WDM驱动程序通信时,系统为每个用户请求打包形成一个I/O请求包发送到驱动程序。
图4是Windows中USB的通信层次结构模型。图4系统软件方块中的底部是Windows系统提供的驱动程序,包括主控制器驱动程序(OPENHCI.SYS或者UHCD.SYS)、HUB驱动程序(USBHUB.SYS)是一个类驱动程序(USBD.SYS)。
Windows2000下驱动程序的设计工具是VC++和Win2000DDK,但是直接使用DDK编程有相当大的难度。目前有第三方软件厂商提供了一些驱动程序开发工具,如Jungo公司的WinDriver、Compuware公司的DriverStudio等。这些工具仍然是基于WindowsDDK的,但是进行了新的封装,提供了驱动程序设计向导。
适配器设计中采用了DriverStudio作为驱动程序开发工具。利用其中的DriverWorks一步步地作出选择并修改少量参数,即可生成驱动程序框架和测试台应用程序框架,对USB设备的通用性部分支持得很好。在程序框架,对USB设备的通用性部分支持得很好。在VC++中对向导生成的代码作修改,并对设备特殊功能部分添加处理代码,然后用VC++编译为*.SYS文件,就是一个完整的驱动程序。SoftIce是DriverStudio的另一个调试工具,可以对驱动程序进行操作系统内核级的跟踪与调试。
生成驱动程序后,编写相应的INF文件是重要的一步。INF文件在操作系统发现新硬件之后向系统指明应该安装的驱动程序、系统向设备提供的服务以及注册表项要修改的内容。
基于USB接口的CAN总线适配器经过试验运行证明:在中小规模和短时大数据块传送时,能够很好地完成网络通信任务。USB接口是计算机外设的发展趋势,目前主要用在中低速场合。随着USB2.0规范的推出,又逐渐向高速应用发展。因此将现场总线网络和计算机接口相连的适配器具有广泛的应用前景。