前言
现代以计算机为核心的总线技术发展迅速,各种基于USB、PCI以及ISA等总线的系统已非常普遍,但对于用户的特殊要求却不能很好的满足,往往需要单独设计。单独设计开发无论从成本还是从时间上都是很大的浪费。以PDIUSBD12(以下简单D12)和单片机构成的USB总线接口卡,可以根据用户不同的需要,在不必掌握复杂的USB协议的情况下,使自己设备很容易的应用USB跟计算机交换数据,而且能很方便的改造旧系统,充分享用USB带来的诸多方便,如对一般系统不用外接电源。此接口卡具有通用性好、速度快、成本低廉等特点。
1组成结构
本套系统的核心就是USB接口芯片D12,它可以与微处理器实现无缝接口,微处理器采用的是WINBOND的高性能单片机77E58,控制中枢是CPLD(EPM7064S),实现USB数据传输的DMA功能,系统还预置了用户RAM区,便于用户根据特殊需要灵活的编程控制。
接口卡留给用户使用的接口包括以下几种:a、FIFO入口方向的九位数据线;b、77E58的串行口;c、用77E58的P1口模拟的I2C总线;d、用户控制指令数据接口;e、对用户板操作的八位I/O口。
图1 USB接口卡系统框图
注:双箭头代表数据线,单箭头代表控制线
2工作原理
1)用户接口部分
a、232接口就是使用单片机的TXD和RXD两根线构成,在用户使用此接口之前,可以通过计算机上的软件来设置接口的工作方式及相应的波特率。
b、I2C总线是由两根线组成:SCL和SDA,其中SCL是作为数据传输的时钟线,SDA是作为传输数据的串行线,在本例中,是通过77E58的两个P1口来模拟I2C总线时序的,用P1.0和P1.1两根线分别模拟SDA和SCL。此卡只能作为I2C总线的主机端来使用。
c、九位并行数据线接口。在本例中,把FIFO的一端的数据线开放,留给用户,可以通过此数据线把数据传到FIFO,实现用户板与USB接口卡的通讯,此种接口适用于要求速度比较快的场合。其中,最高位还可作为用户通讯的校验位来使用,提高通讯的质量。
d、控制指令数据接口,即把单片机的数据线对用户开放,可以直接读到控制数据,一般用于传输从PC机下达的指令,便于控制用户板的工作,如AD采集的场合等。
E、对用户板上的I/O口,是从CPLD中接出的,可以根据用户要求,从PC机上传达IO控制,通过单片机把各IO状态直接反映到CPLD的I/O口上。
以上接口所涉及到的并行总线均使用74LS245实现总线隔离,在使用之前,需要用户从计算机上发送选择指令,确定使用哪种通讯方式,再由单片机来控制各个总线的开关,使得整个系统能够顺畅工作,避免引起总线的竞争。
2)USB传输部分
在USB传输部分采用接口芯片D12,是一款性价比很高的USB器件,它通常用作微处理器系统中,实现与微处理器进行通信的高速通用并行接口。符合通用串行总线USB1.1版规范,片内集成了SIE、320字节多结构FIFO存储器收发器,可与任何外部微处理器实现并行接口,数据吞吐量可达2MB/S,拥有完全自治的直接内存存取DMA操作,主端点的双缓冲配置增加了数据吞吐量,能轻松实现实时数据传输。在批量模式和同步模式下均可实现1MB/S的数据传输速率,具有良好EMI特性,还可为用户提供500mA的总线供电能力。
3)、CPLD的控制部分
CPLD程序是采用VHDL语言编写的,主要是配合用户要求,完成数据从FIFO传输到D12的DMA功能,能够实现用户的快速性要求。另外,就是产生对FIFO的读写信号以及产生接口卡对用户板的一些地址片选信号和8bit的I/O控制信号。
D12可以通过中断与单片机进行指令通讯,通过CPLD实现DMA方式的数据传输,把数据从FIFO传输D12中。只要把用户的数据传输到D12的FIFO里面,应用程序就可以通过驱动程序把数据读到计算机的缓存,其具体的传输过程是不需要用户参与的。
3程序设计
在本例中,软件包括以下几个部分:单片机中固件(FIRMWARE)程序、计算机上的驱动程序和用户态的DLL以及调用DLL的范例程序。
1)固件程序设计
固件程序是被固化到单片机中,能够配置D12与计算机实现USB通信的程序。固件程序完成的主要工作可以简化为:当D12从USB总线上检测到主机启动的某一请求时,便通过中断方式将此请求传递给单片机,固件程序进行解析执行相应的操作,以完成与主机的对话。另外还执行用户通过计算机对接口卡的工作方式进行设置的操作。
2)设备驱动程序设计
设备驱动程序负责处理应用程序传下来的I/O请求(如读写设备、传递控制参数等),处理PnP管理器发送给设备的PnP请求(如设备启动请求IRP_MN_START_DEVICE,以及设备删除请求IRP_MN_REMOVE_DEVICE等),这样就可以使系统可支持设备的热插拔和即插即用功能。
开发USB设备驱动程序的常用工具有DDK、WinDriver以及Compuware公司的NumegaDriverstudio等。在本设计中使用的是DDK,因为DDK不但提供了较为详细的帮助文档说明,而且还提供了较好的参考范例。
USB的驱动程序和以往直接控制硬件的Win95的VXD(Virtual Device Driver)驱动程序不同,它属于WDM(Windows Diver Model)类型的。WDM采用分层驱动模型,对于USB设备来说,可分为USB总线驱动程序和USB设备驱动程序。总线驱动由操作系统提供,它位于设备驱动程序的下面,直接控制硬件操作,而设备驱动程序(除了HID类的设备外)需要开发者编写。在设备驱动程序中,通过向总线驱动程序发送包含URB(USB Request Block)的IRP(I/O Request Packet),来实现USB设备信息的发送和接收。在本例中,通过向总线驱动程序发送包含READY_URB和READ_URB两个URB的IRP_MJ_READ,来实现数据的准备工作及数据的传输,并且还可以通过这两个URB向下传递多达16条8bit的控制参数,便于用户传递控制指令。
3)用户态软件的设计
在用户态软件程序中,采用标准的文件操作方法。用API函数CREATFILE来创建并打开设备,READFILE对应功能驱动程序中的IRP_MJ_READ,来实现对设备的控制读写操作请求。在本例中包括两个部分:动态链接库和应用程序。动链接库负责接受应用程序的各种操作参数,与内核态的USB功能驱动程序通信,而应用程序负责对所读取数据的存储与处理。
动态链接库就是那些复杂的调用驱动程序的程序封装成几个函数,便于用户的使用。应用程序是使用此接口卡的程序范例,通过调用动态链接库的函数,实现对接口卡的控制及对用户板的数据读取,用户可以在范例的基础上,稍加修改就能够非常方便的控制接口卡与用户卡的通讯,包括选择通讯方式,向用户板传递控制参数,就可以实现把数据传到相应的内存中,然后再对数据进行处理。
4、小结
此接口卡可以使用户在没有掌握复杂的USB协议及抽象的驱动程序设计的前提下,能够很方便快速的应用USB总线与PC交换数据,