基于PCI总线的数据采集卡设计
扫描二维码
随时随地手机看文章
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作为地址译码。[!--empirenews.page--]
在制作印制板时,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)。
[!--empirenews.page--]
(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扩展卡。