基于PCI总线的数据采集卡设计 - 电子芯片应用技术

分享到:
477
下一篇 >

 0 引言

  随着计算机软硬件技术和控制、丈量技术的不断发展,很多工程技术职员都将PC机作为控制、丈量开发的**平台。而PCI(Peripheral Component Interconnect,即外围部件互连)总线作为一种高性能、通用的局部总线,是目前计算机插卡式外设总线的事实标准。PCI总线具有32/64位总线宽度。地址线和数据线复用,支持猝发传输,传输速率高达132MB/s;系统占用率低,具有较好的兼容性;有完备的即插即用(PnP)治理体制,可同时支持多组外围设备。固然PCI总线也经历了从PCI、PCI-X到PCI Express的发展,但PCI总线由于存在时间长,开发工具、开发资料众多,在对数据吞吐量要求不是很高的产业控制、丈量领域仍有着顽强的生命力。笔者在学习了相关设计资料的基础上,设计了基于PCI总线的数据采集卡,可以完成8路数字量I/O及4路差分14位A/D采集功能。本文将根据笔者的实际经验,先容PCI接口扩展卡的软硬件设计流程。

  1 PCI总线工作方式简介

  PCI总线标准由INTEL于1991年提出,后由PCI-SIG(PCI Special Interest Group)接替了PCI规范的发展。PCI总线是一种时分复用的双向应答总线,传输发起方称为主设备,接收方称为从设备。其主要信号定义如下:

  RFAME:由主设备驱动,为低,指示一次传输的开始。

  DEVSEL:由从设备驱动,为低,指示响应传输请求。

  ADO~AD31:地址、数据复用信号。PCI总线的数据传输以帧为单位,每次传输由一个地址周期和多个数据周期组成。首先给出本次传输的首地址,后面紧跟一个或多个4字节宽的数据,连续传输多个数据时,其地址自动递增。

  C/BE0~C/BE3:这4根线在地址传送周期,传输的是总线命令,C/BE0~C/BE3的不同组合指示在AD0~AD31上将要进行何种类型的操纵,其代表的总线命令见表1;在数据传送周期,传输的是字节始能信号,用来表示在整个数据期间,AD31~AD0上的哪些字节为有效数据。

  IRDY、TRDY:分别表示主设备预备好和从设备预备好。在传输过程中,只有IRDY和TRDY同时有效,传输才能继续;否则**等待周期,用于在不同速度的设备之间协调工作。


  表1地址传送周期时。C/BE0~C/BE3所代表的总线命令PRSNT1、PRSNT2:PCI板对电源的请求信息,具体含义见表2。


  将PCI接口卡**计算机插座,加电后,BIOS会根据PCI接口卡上的配置信息,为其分配相应的I/O端口、存储器空间、中断及DMA等计算机资源。

  2 PCI接口卡的硬件设计

  笔者设计的PCI数据采集卡使用的PCI接口芯片是CH365,CH365可将32位高速PCI总线转换为简便易用的类似于ISA总线的8位主动并行接口,支持240字节的I/O端口映射、32 K字节的存储器映射、扩展ROM以及中断。本数据采集卡仅使用了I/O端口映射及中断功能。本PCI数据采集卡使用MAXIM公司的4通道14位、差分、同时采样ADC:MAX1338,实现A/D转换功能,并将MAX1338的/EOLC引脚与CH365的INT_REQ引脚相连,以便在ADC转换完成后,向PC机发出中断申请。使用两片74HC273作为输出,一片用作8路I/O输出,另一片用作对MAX1338控制命令的输出。使用两片74HC373作为输进,一片用作8路I/O输进,另一片采集MAX1338的状态指示信号。使用TLP521-4对8路I/O输进、输出进行光电隔离。使用74LS138作为地址译码。

  在制作印制板时,CH365的VCC与GND间应就近放置容量为0.1 μF高频、低ESR的多层瓷片电容,连接PCI总线的电源线引脚可以自由选择,但数目不宜少于4对。CH365属于高频数字电路,应该考虑信号阻抗匹配,在设计PCB板时需要参考PCI总线规范。建议CH365的PCI信号线的长度都小于35 mm,尽量走弧线或者45度线,避免直角或者锐角走线,并且尽量将信号走线布在元件面;CH365的PCI时钟线CLK的长度尽量保持在50 mm~65 mm之间,并且不宜靠近其它信号线;在PCB背面保存大面积的接地覆铜,以减少周边信号线的干扰。固然PCI总线规范推荐使用四层板,但考虑本钱等因素,可使用双面板,双面覆铜接地。笔者做的PCI数据采集卡即为双面板,经实验验证在产业现场环境下,该卡能够稳定工作。

  3 PCI接口卡驱动程序及软件设计

  在Windows系统中,为避免因不当的硬件操纵而导致系统崩溃,应用程序不再具有直接的硬件访问权,假如要操纵硬件,必须借助设备驱动程序。驱动程序主要功能是完成对硬件板卡的内存映像地址、I/O地址的存取,并正确处理来自板卡的硬件中断。

  Microsoft为设备驱动程序的编写提供了“Windows De-vice Drivers Kit”(简称DDK)工具,它包含了驱动开发所需的各种类型的定义和内核函数库。用DDK编制的驱动程序有很高的运行效率,但是开发难度大,测试流程繁琐。为减轻驱动***的负担,很多第三方厂商提供了简化驱动开发的软件。如Numega公司的DriverStudio软件,J ungo公司的WinDriver/KernelDriver软件等。尤其是WinDriver/KernelDriver不要求***非常熟悉操纵系统平台,把握核心开发、调试知识,即可在几分钟之内开发出相应的驱动程序。但WinDriver的运行效率较低,因此,在对运行效率较高的场合,可使用KernelDriver进行开发,以进步运行效率。

  由于本采集卡的数据吞吐量不高,因此采用WinDri-ver6.21进行驱动程序的开发,其开发过程如下:

  (1)运行Windriver程序,选择"Create a new driver pro-ject”;

  (2)在弹出的“Select Your Device”窗口中,从列表中选择自己的硬件设备。由于CH365的默认厂商标识(Vendor-ID)为4348H,设备标识(DeviceID)为5049H,因此选中“PCI:VendorID 4348 DeviceID5049”的PCI设备(如图1)。


  (3)单击“Generate.INF file”按钮,产生采集卡的驱动安装信息文件。留意:需选中“Automatically Install the INFfile”复选框,以便可以在(4)步中测试采集卡(如图2)。


  (4)在“Define and Test Resources for Your Device”窗口中,设置采集卡的I/O地址及变量名,对于即插即用(Plug-and-play)设备,Windriver会自动发现其所用到的硬件资源(如:I/O范围,存储器范围及中断号等)(如图3)。在此可对采集卡的I/O地址进行读写测试,以便验证硬件设计是否正确。


  (5)在“Select Code Generation Options”窗口中,选中合适的开发语言及开发平台。在此选择“Ms Developer Studic6,5”(即Microsoft VisualC++6/5),以便Windriver天生合适的驱动程序框架及相应的API函数(如图4)。


  (6)保存Windriver产生的驱动开发工程后,Windriver会自动打开相应的开发环境(此处为:Microsoft VisualC++6),以便开发职员进行后续开发。

  通过以上步骤,Windriver天生一个基于Visual C++语言的程序框架,开发职员可以在此框架的基础上进行修改,加进自己的程序,实现对硬件的操纵。现以笔者编制的程序(工程文件名为ADC)为例进行先容。

  在程序初始化阶段,先调用PCI_Get_WD_handle(),判定驱动程序windrvr6.sys是否已被加载,假如驱动程序已被加载,则调用ADC_LocateAndOpenBoard()函数,打开数据采集卡。在退出应用程序前,需先调用ADC_Close()函数,封闭数据采集卡。

  对MAX1338和8路I/O的寄存器操纵可通过ADC_ReadByte()、ADC_WriteByte()两个函数完成。对CH365内部配置寄存器的读写可通过ADC_Read-PCIReg()、ADC_WritePCIReg()两个函数完成。完成应用程序的开发后,数据采集卡在其他的PC机上工作时,需提供windrvr6.sys、windrvr6.inf、wd_utils.dll、数据采集卡的,inf文件以及自己开发的应用程序或DLL。以便于PC机安装相应的驱动程序,对板卡进行配置、操纵。本文根据笔者的实践经验,扼要先容了PCI扩展卡的开发流程,给出了一套快速可行的解决方案。该方案简单易行、调试方便,可使工程技术职员迅速把握PCI总线的开发技术,从而设计出符合工程需求的PCI扩展卡。


你可能感兴趣: 数据采集卡 设计应用
无觅相关文章插件,快速提升流量