基于USB接口1553B总线设备检测系统设计
扫描二维码
随时随地手机看文章
1 引言
MIL-STD-1553B军用总线标准,在军事装备,特别是飞机系统中得到了广泛的应用,舰载系统中也正在逐步推广。对于1553B总线传输信息的飞机系统,特别是由该总线网络构成的综合航火控系统、通信系统而言,系统时实监测与在线故障诊断均建立在信息录取的前提下。为了方便录取1553B总线上传输的信息就需要应用1553B总线到计算机标准接口转换器,目前常用转换器有1553B-PCI、1553B-VXI等,但在工程实践过程中,它们存在体积大、价格高、使用不方便等缺陷。相比而言,USB接口具有体积小、携带方便、热插拔等特征,具有不可替代的优势。
本文介绍的1553B设备检测系统就是基于USB接口的。设计包含两大部分:硬件设计和软件设计。硬件设计主要实现1553B接口到USB接口的转换;软件设计主要是USB芯片固件开发、USB接口驱动、开发计算机测试1553B设备软件。
2 硬件系统设计
本系统的硬件设计工作主要集中在1553B与USB总线接口的转换设计。硬件系统分成三部分:1553B接口转换电路、FPGA译码电路和USB接口电路。如图1所示。
图1 硬件组成电路
2.1 1553B接口转换电路
目前,1553B接口芯片种类繁多,根据工程应用场合和实际需要,我们选用DDC公司BU-61580芯片。BU-61580芯片除了具有远程终端(RT)功能外,还可以用作总线控制器(BC)、总线监控器(MT)。其内部功能极强,接口灵活、便于控制,有各种封装形式和供电电压供用户选择。
2.2 FPGA译码电路
FPGA作为现场可编程器件越来越广泛地应用到工程设计中。利用FPGA对系统中信号进行译码可避免由于开始硬件电路设计考虑不周造成的硬件设计错误,而且方便系统的以后的升级。本系统中,FPGA通过1553B接口芯片读取1553B总线上的数据并暂存在FPGA内部RAM中,然后通知USB接口芯片把数据读出;同时,还要通过USB接口接收从PC下发的数据,重新打包,发送到1553B设备。
2.3 USB接口电路
USB接口控制芯片包含两大类:一类是需要外置控制器的芯片,还有一类为内置控制器,如Cypress公司的CY7C64613芯片。本系统选用PHILIP公司的PDIUSBD12芯片,需外置控制器的芯片。
PDIUSBD12芯片是带有并行总线和局部DMA传输能力的全速USB接口器件。片内集成了高性能USB接口器件、SIE、FIFO存储器、收发器以及电压调整器等,可与任何外部微控制器/微处理器实现高速并行接口(2MB/s),完全能匹配1553B总线最高传输速率(1MB/s)[1]。USB 实现模块的核心是PIDUSB12。外置控制器AT89C52的P0口接PIDUSBD12的DATA0~DATA7,用来传输要交换的数据。P0 口所有引脚都要外接上拉电阻。PIDUSBD12的片选信号和复位信号由AT89C52的P1.6与P1.7提供。AT89C52 的P3.6与P3.7作为PIDUSBD12的写读控制端,AT89C52和PIDUSBD12的ALE相连,PIDUSBD12的挂起状态和中断控制都接高电平。 PIDUSB12的D+和D-加上+5V电源|稳压器和地就构成了USB接口,从而能与计算机相连。PDIUSBD12与USB的连接通过1.5K上拉电阻将D+置为高实现,默认状态不与Vcc相连,可用SoftConnect技术通过AT89C52发送专门的命令来实现该连接,允许AT89C52在决定与USB建立连接之前完成初始化时序,USB总线连接可以重新初始化而不需要拨出电缆[2]。随后USB设备识别和通信就要依靠固件程序和驱动程序了。
3 软件设计
1553B设备测试软件首先要实现USB接口与PC之间的通信,然后,再对设备进行性能检测。因此,需要对USB芯片进行固件、PC驱动程序和测试程序设计。
3.1 USB固件设计
AT89C52中的固化程序可采用C51 设计,主要功能是:控制PDIUSBDl2接受USB驱动程序的请求;控制PDIUSBDl2接受应用程序的控制指令;通过PDIUSBDl2存储数据并实时上传PC机。PDIUSBDl2的固件设计成完全的中断驱动,当CPU处理前台任务时USB的传输可在后台进行,确保了最佳的传输速率和更好的软件结构,简化了编程和调试。单片机通过PDIUSBDl2与主机通信的过程简述如下::当PDIUSBDl2接收到主机发来的令牌包后就给单片机发中断,单片机进入中断服务程序。它将数据从PDIUSBD12的内部FIFO取回到CPU存储器并根据中断寄存器判断USB令牌包的类型从而建立正确的事件标志以通知主循环程序进行处理,主循环检查事件标志并进入对应的子程序进行进一步的处理,固件程序流程如图2所示。系统上电后,先检测PDIUSBD12,如检测不成功则报错,要使用者重插USB接口,再次检测。检测成功则根据PDIUSBD12的中断类型设定中断标志位的值,再根据中断位的值调用相应的功能子程序[3]。
图2 固件框架流程图
在本设计中,功能子程序主要包括两部分:
1)通过AT89C52的P0端口从FPGA接收1553B设备数据,重新打包,再经过P0端口写入PC机;
2) 通过P0端口接收PC数据,重新打包,通过AT89C52的P0端口从FPGA写入1553B设备。
3.2 驱动程序
完成驱动程序设计的方法一般有三种:基于DDK开发、基于Windrive开发和基于DriveStudio开发。由于Windrive和DriveStudio开发对DDK中的函数进行了一定程度的封装,它们开发的难度比直接用DDK开发要小,但开发的灵活性不如DDK。本设计使用的驱动是DriveStudio与DDK配合进行开发,开发驱动程序的效率较高。
在驱动程序开发平台搭建成功后,我们利用驱动程序生成向导Driver Wizard,根据硬件设置生成USB设备驱动程序的大体框架。设置如下:①选择 WDM的驱动程序类型和Windows 2000运行平台。②选择 USB总线类型,填写它的VID(供应商ID)和PID(设备ID),这些信息由芯片的供应商提供。③增加端点 1和端点2,它们分别具有IN 和OUT属性。④根据需要选择对设备的操作有:Read、Write、Device Control和CleanUp。⑤选择给端点2产生 BULK Read和Write的代码, 向导会自动产生一套对端点2进行读、写的代码。⑥设置驱动程序的属性,采用WDM接口;在选取读写方式时应遵循一条原则:需要快速传送大量数据时,用 Direct I/O,反之用 Buffer I/O,本设计数据量不大,故选用Buffer I/O;由于无特殊的电源需求,故选用系统默认的Manage Power For This Device。⑦增加IOCTL接口,在其生成的代码框架中加入自己的操作,以实现一个完整的USB 设备驱动程序。最后就生成了一个 WDM 型的 USB 设备驱动程序框架和一个测试该驱动程序的测试程序大体框架。然后在其中添加需要的功能代码。
通过DriveStudio初步建立一个驱动程序框架后,我们只要修改TESTFIRMDevice.h和TESTFIRMDevice.cpp就可以了,修改完毕后,可以发现使用DriveStudio向导生成的USB设备驱动程序,不仅不需要对底层的硬件进行编程,甚至可以忽略与硬件控制紧密相关的复杂的Windows数据结构(如,URB、IPR)、API函数(DriveEntry()、IoCreateDevice()、AddDevice())的使用。
用DriveWizard创建USB框架程序自动生成的两个工程(Project)文件:TESTFIRM驱动程序工程和Test_TESTFIRM应用程序工程,将光标定位在其中一个工程上之后,单击右键,选择“set as Acnve Pmiect”即可设置该工程为当前活动工程。对于驱动程序编译,不用进行任何设置,单击Build图标即可生成USB驱动程序TESTFIRM.sys文件。
3.3 通信程序
因为DriveStudio已经替我们把核心驱动程序基本开发完了,在本设计中,只要掌握WriteFile和ReadFile两个函数的使用就可以进行简单的USB通信了。由于DriveStudio所用的类库是对DDK函数一定程度的封装,必须在 VB、VC++等软件开发环境中编译,创建自己的库文件,所以很容易为程序增加了图形界面,使用户操作更加方便。本设计测试软件流程如图3所示。
图3 测试软件主流程图
当USB设备与PC通信时,USB设备是从设备,PC是主设备。PC机通过检测USB总线数据端电平判断是否接入或拔出USB设备。PC检测到USB设备后,调用USB设备函数。如果设备被正确打开,软件开启监听USB设备线程,以20ms周期轮询USB接收数据接口。一旦接收到数据,数据就被分析并且回显到界面上,直到线程被中断。
4 结论
1553B总线是当前飞机系统中广泛应用的总线类型,将它与USB总线融合起来具十分重要的实际意义。在开发过程中,利用DriveStudio与DDK配合进行开发USB驱动程序,大大提高了开发的效率。本设计在实际设备测试中,板卡可以稳定工作,测试软件工作正常,满足项目设计要求。