>
首页 » 业界动态 » 基于PCI9052的X射线能谱数据采集卡的PCI改造

基于PCI9052的X射线能谱数据采集卡的PCI改造

作者:卢国强,曾立波,吴琼水  时间:2007-02-05 21:59  来源:

摘 要: 利用PCI接口芯片PLX9052,结合CPLD技术,成功地将基于ISA总线的X射线能谱数据采集卡改造为PCI总线模式。详细介绍了PCI接口芯片PLX 9052的硬件连接、译码和配置方法,以及应用DriverWorks进行WDM驱动程序开发的过程。

关键词: PCI9052;PCI总线;WDM驱动程序;X射线能谱数据采集卡

1. 引言

PCI(Peripheral Component Interconnect)总线是一种高性能的32/64位地址数据线复用的局部总线,它与CPU和时钟频率无关,可同时支持多组外围设备,支持自动配置,具有很高的数据传输速率,峰值传输速率可达132 MB/s(32位,33 MHz)。自1995年PCI局部总线规范2.1版本发布后,PCI总线由于其极高的性能及良好的兼容性而受到业界的广泛重视和支持,并逐步取代了流行一时的ISA总线。

武汉大学仪器工程技术中心原来开发的X射线能谱数据采集卡为ISA总线模式,端口地址0x220H-0x23fH,总线宽度16位,具有中断功能,驱动程序为VXD模式。随着计算机的更新换代和新的操作系统的使用,该ISA卡的局限性逐步体现出来:因其使用固定的端口地址和中断号,易与其它板卡冲突;现在流行的计算机多不含ISA插槽,因此在流行的计算机上不能用;VXD驱动程序只能工作在Windows Me及以前版本的操作系统,而在流行的Win 2000和Win XP下不能工作。因此我们对该卡进行了PCI改造,同时对驱动程序也进行了流行的WDM模式开发。改造后的采集卡从根本上克服了原ISA卡存在的局限性,并与原X射线能谱分析系统软件具有良好的兼容性,且采集系统的响应速度和各项性能较以前都有大大的提升。

2. 分析

由于PCI总线具有很严格的规范,总线协议比较复杂,直接采用CPLD或FPGA开发难度较大,需要投入专业人员进行开发。 PCI通用接口芯片对PCI总线的良好支持,以及提供给设计者的良好接口可以大大减少PCI总线开发人员的工作量,在实现PCI总线高性能的同时降低开发成本,节约开发时间。现有的PCI通用接口芯片主要有AMCC公司的AMCC59XX系列和PLX公司的PLX系列。

PCI 9052是PLX公司继PCI 9050后新推出的一种性能优秀且价格低廉的PCI总线目标接口芯片,符合PCI2.1规范,能够实现ISA总线与PCI总线的无缝连接。因此使用PCI 9052可以快速方便地将ISA适配器转换到PCI总线上。采用PCI 9052可使适配卡上的I/O数据传输速率从ISA总线的8MHz提高到33MHz,从而可达到最高132MB/s的数据传输能力。而且其提供的具有非常强大功能的局部总线接口,在实现高性能的同时可以进一步简化PCI板卡的开发过程。

本例即采用PCI 9052实现原ISA总线到PCI总线的转换,不需改动或极少改动原采集卡电路模块即可将其工作于PCI总线模式。依靠重新开发的硬件驱动程序,只需将原X射线能谱分析系统程序的调用模块作相应的改动即可实现改造后的采集卡与原采集系统的良好兼容,而且充分利用了PCI总线的高效、高速资源,不需任何优化即可使程序的性能得到很大的提升。

2.1 硬件设计

原能谱采集卡的板级模块包括:信号采集和放大,基线检测,峰值检测,A/D转换和信号保持模块,D/A转换模块,系统时钟及控制模块。其中控制模块由CPLD芯片实现,并通过CPLD与计算机ISA总线的直接连接实现与计算机之间的通信。

改造后,在原电路中加入一片PCI 9052芯片,其局部总线引脚与CPLD直接连接,PCI总线引脚与计算机PCI总线相应引脚连接,配置芯片采用93LC46。其中PCI 9052采用C工作模式连接。改造后的电路模块如图1所示。

1 改造后的PCI板电路模块连接示意图

PCI9052有三种工作方式,分别是C模式、ISA模式、J模式(地址和数据总线复用模式),引脚连线不同则工作方式也不一样。ISA模式时钟频率一般为8MHz左右,因此速度太慢,J模式由于采用总线复用模式,因此相对要复杂一些。这里我们选用C模式,时钟频率可达33MHz,因此数据传输速率最高可达132 MB/s。

PCI 9052只有经过正确的连接才能正常工作,其功能引脚在C模式下,应将MODE(68脚,总线复用模式)接地,BCLKO(63脚,PCI总线经过缓冲的33MHz时钟)通过50欧姆电阻与LCLK(135脚,9052局部总线工作时钟),LRDY#(128脚,局部总线准备就绪信号)接地。另外其配置引脚EEDO、EEDI、EESK、EECS为上电时配置芯片加载PCI 9052配置信息时的信号引脚,应将其与EEPROM的相应引脚连接。

PCI 9052的PCI总线引脚与相应的计算机PCI总线引脚连接。它们的引脚定义可以通过PLX公司的数据手册和PCI2.0规范查到。

PCI 9052的局部总线连接如表1所示:

1 PCI 9052局部总线引脚连接

引脚号

名称

说明

74-79,82-91

LAD15-LAD0

局部数据总线,双向传输

92-98

LA2-LA8

局部地址总线,输出

125

WR#

写允许,输出

126

RD#

读允许,输出

130

CS0#

片选信号0,输出

131

CS1#

片选信号1,输出

132

LRESET#

局部复位端,上电时产生的复位信号

137

LINTi1

局部中断信号1,通过10K电阻下拉接地。

138

WAITO#

等待信号,输出,低电平表示需等待,高电平允许读写信号。

2.2 EEPROM的配置

与ISA总线相比,PCI总线除了支持内存空间、I/O空间外,还多了一个配置空间。当系统加电时,BIOS软件会检测PCI总线,确定PCI总线上的设备及其配置信息,并根据这些信息由系统统一进行系统资源分配,从而避免各设备的地址和中断产生冲突。

对于PCI 9052,其配置信息固化在一个外置的串行EEPROM中,并在芯片复位时自动加载。配置信息包括设备号DID、制造商VID、子设备号SDID、空间描述、片选响应、中断控制和状态以及局部响应控制等信息。配置信息的固化可以通过编程器对EEPROM进行编程或通过PLX公司的专用软件PLXMON进行在系统(In-System)配置。配置信息一般采用二进制编辑器进行编写,不仅十分的繁琐,而且很不直观,为此,我们自主开发了一个专用的的配置EEPROM向导程序,利用该向导程序可以快速方便的编写和修改配置信息。

本例中设备号DID为0x9050,制造商VID为0x10B5,子设备号SVID为0x9052,子制造商SVID为0x10B5。这是本卡的特征标志信息,在随后开发的驱动程序将依据此标志信息寻找相应设备,并对其端口进行读写操作。

2.3 端口地址的译码

由于ISA卡和PCI卡的端口地址有很大的不同,因此,译码的方法也存在很大的差别。在ISA总线中采用IOR、IOW和AEN作为读写允许信号,而PCI总线采用RD#、WR#和WAITO#作为读写允许信号,本例中还要用到片选信号CS0#和CS1#。另外ISA模式的端口为绝对地址寻址方式(这也是为什么ISA板卡容易产生冲突的原因,本例的ISA采集卡的端口即定义为0x220-0x23f,安装时很容易与声卡冲突而有时不得不屏蔽掉声卡)。 PCI模式下为基地址加偏移地址寻址方式,其中基地址是计算机根据配置信息中的空间大小信息来自动分配的,这样可以保证每块PCI卡的地址都不会相互重叠。

PCI 9052大大简化了复杂的PCI总线,它把PCI总线分成两个地址空间,一个是PCI地址空间,与计算机相连,一个是PCI局部空间,与外围电路相连。两个空间各有一个基地址。对于PCI地址空间,基地址是由计算机自动分配的,而对于局部空间,基地址是由配置EEPROM来确定的,是固定的。PCI端的地址和局部端的地址是一个简单的位移映射关系,访问的PCI端地址偏离基地址多少,对应的局部端地址也偏移相同的大小。因此,在CPLD译码逻辑中,我们只需要关心偏移地址而不用知道基地址是多少。

另外,与ISA卡译码一个很大的不同的地方是,ISA卡一般所有的地址线都要参加译码,而PCI 9052却不需要这样,它有4个片选信号,通过配置,我们可以设置这几个片选信号的有效范围,当访问的局部地址落在我们设定的区域时,片选信号就有效。因此,利用片选信号,我们就不需要用所有的地址线进行译码,只需要选择几根地址线进行译码来表示偏移地址就可以了,这不仅方便了我们的使用,同时也省去了很多地址线。下面来比较说明。

以对端口0x220进行的读操作ReadPulse为例。ISA方式下,其译码逻辑应为:

ReadPulse = ((aen,iow,ior,a[9..1]) == B”0101 0001 0000”)

这里采用16位读写,即偶数位地址读写方式,a0不参与译码,每两个地址之间的偏移为2位。当aen和ior同时为低时(低电平有效),允许读数据总线,对应的端口地址a[9..0]为0x220。

若对端口0x222进行写操作 WriteData,其译码逻辑应为:

WriteData = ((aen,iow,ior,a[9..1]) == B”0011 0001 0001”)

同样的,当aen和iow同时为低时允许写数据总线,对应的端口地址a[9..0]为0x222.

PCI 9052局部总线端采用了片选信号CS0后,上述的两个操作可以简化为对偏移地址0x00和0x04的操作,其相应译码逻辑为:

ReadPulse = ((cs0#,waito,wr#,rd#,a[5..2]) == B”0110 0000”),OFFSET为0x00

WriteData = ((cs0#,waito,wr#,rd#,a[5..2]) == B”0101 0001”),OFFSET为0x04

这里采用32位读写方式,a1和a0不参与译码,每两个地址之间的偏移为4位。事实上,对于cs0的作用,我们可以把它看成局部基地址的一个简单代替,即由cs0和地址总线a[5..2]共同给出局部地址信息:

!cs0 + a[5..2] == 局部基地址 + 偏移地址

更直观的,可以把cs0看成是高位地址译码的结果,也即cs0取代了32位地址总线的a[31..6]的译码结果。因为对于我们设定好的局部基地址来说,它总是固定的,所以我们就用一个cs0来代替它,通过cs0的状态我们就可以知道所访问的地址是否是我们所期望的值。

因为采用了偏移地址译码方式,所以只需4根地址线即可完成16个端口的译码,不仅简化了电路的连接,也减少了太多地址线之间可能存在的干扰。

2.4 驱动程序的开发

在进行板卡调试时,我们可以使用Jungo公司的Windriver直接对PCI板卡的端口进行读写操作,还可以在线配置PCI配置空间,使用非常方便。同时也可以使用Windriver开发PCI板卡的驱动程序。[4]本例使用Driver Works 为改造后的PCI数据采集卡开发WDM驱动程序。

NuMega公司的Driver Studio是一套为简化Windows应用程序和设备驱动程序的开发、调试及测试的工具包。其包含的WDM驱动开发工具Driver Works具有强大的向导功能,我们只需要填写必要的硬件参数就能够自动生成驱动程序的框架代码,生成框架后,我们可以根据具体的需要一些添加代码就可以完成驱动程序的编写。Driver Works生成的代码是被封装成面向对象的C++类,具有面向对象的特性。而且Driver Works一旦安装,它就能够同Windows DDK一起集成到Visual C++开发环境下,整个开发过程就如同是在开发一般的VC程序。在它生成的框架下编写驱动,不需要了解驱动程序的底层即可以方便的编译完成效率高、功能强大的驱动程序。而且,由此编写的WDM驱动程序,支持Windows98、2000和XP,同时还自动生成安装硬件所需的inf文件,大大方便了驱动程序的开发过程。

开发驱动程序的第一步是先用Driver Works向导生成一个驱动程序的框架。这里只需要注意以下几点:填写工程名称后,第二步选择WDM类型,第三步选择PCI总线,并填写采集卡的设备号(Device ID)和制造商号(Vendor ID)分别为9050和10B5,子制造商号(Subsystem ID)和子设备号(Revision ID)分别为10B5和9052。在随后生成的驱动程序框架及inf文件中,我们会发现,系统就是根据这两个ID来寻找相应的板卡的,本例中为905210B5.接下来在第七步添加IO资源、内存资源和中断资源后,即可生成驱动程序的框架。

此时的驱动程序框架已经能进行访问PCI配置空间,打开硬件,端口读写等操作。我们所需要做的只是根据具体需要,在OnStartDevice()函数中加入硬件初始化语句,在DeviceControl()函数中添加主程序调用响应语句并编写相应的处理函数,在Isr_Irq()函数中添加中断判断和响应语句。具体操作在DriverWorks以及相关资料上都有详细的示例,在此不再赘述。

驱动程序开发完成后,在主程序调用模块加入打开硬件函数OpenByInterface()建立与驱动程序的连接,即可以采用DeviceIoControl()函数与驱动程序通讯,通过驱动程序进行端口读写操作。DeviceIoControl()函数的调用传递参数到驱动程序中的DeviceControl()函数,并在此函数中查找处理函数的入口,继而转入到处理函数。

最后在VC++ 6.0 开发环境下结合DDK进行编译,即可生成WDM驱动程序sys文件。添加新硬件时选择向导生成的inf文件,操作系统即可自动寻找相应的sys文件,并为板卡安装此驱动程序。

3. 结果与讨论

将原ISA数据采集卡改造为PCI总线工作模式后,结合重新编写的WDM驱动程序,采集卡和分析系统在Windows98、2000和XP下均工作稳定。因为工作在更高的时钟频率下,而且PCI的采集卡不存在地址和中断冲突问题,整个系统的稳定性和响应速度都得到了很大的提升。

9052是一款优秀的PCI接口芯片,可以很方便的实现局部总线到PCI总线的转换。利用9052改造ISA卡,原硬件只需对译码电路进行很小的改动。利用DriverStudio开发WDM驱动程序,能够用很短的时间编出高效可靠的代码,而且开发出的驱动程序能够支持从Win98到WinXP的一系列操作系统,多系统的兼容性给我们带来了很大的方便。

相关推荐

基于PCI总线模块的多通道串行数据采集系统设计

数据采集  PCI总线  FPGA  2010-12-07

基于CH365芯片的PCI总线接口卡的设计与实现

基于PCI总线的DSP系统可执行文件在线实时下载技术

基于FPGA+PCI的并行计算平台实现

基于DSP的PCI总线数据采集系统的研究

PCI总线I/O时序波形观测及分析

在线研讨会
焦点