1 引 言
PCI局部总线由于其速度快、可靠性高、成本低、兼容性好等性能,在各种计算机总线标准中占主导地位,采用基于PCI标准的接口设计已成为各种项目开发中的优先选择。但是,由于PCI总线规范和接口定义较为复杂,从而使得传统的、以中小型规模器件开发接口电路的方法难以实现。鉴于此,许多厂家推出了专用的PCI总线接口芯片,其中AMCC公司生产的S59XX系列芯片因其功能强大、开发方便而应用广泛。S5920是AMCC公司新近推出的一种PCI总线接口芯片,他与S5933相比,减少了总线主控的功能,但其他性能与之相仿或有所增强,而价格降低了很多。因此,在无需进行总线主控的场合,使用S5920具有更高的性价比。由于本设计是作为云台控制端的接口,命令是单向发送,云台只是接收命令执行,故S5920完全能够胜任且降低成本。S5920的主要特点如下:
(1)符合PCI2.2标准的总线目标。
(2)带有4个集成32 b读写FIFO的直通通道。
(3)外加总线可工作于主动或被动状态。
(4)支持串行nvRAM(非易失性RAM)和可选 的外部BIOS。 2 内部结构
与S5933一样,S5920为设计者提供了与PCI总线相连的灵活易用的方式。通过S5920,复杂的PCI总线可被转换成易于使用的8/16/32 b用户总线即外加总线(ADD-ON-BUS)。S5920有信箱(MAIL-BOX)和直通通道(PASS-THRU)2种传输方式,并为这2种方式提供了完备的操作寄存器和外加总线信号。设计者可根据需要选择合适的传输方式,并通过S5920内部寄存器完成各种定义和设置。这样的特性使得设计者在进行应用设计时无需深入掌握PCI总线规范,而只需将注意力集中在外加总线逻辑和扩展卡功能的实现上即可,从而大大减少了为严格遵循PCI接口定义和总线时序所带来的工作量。
S5920提供3个物理接口:PCI总线接口、外加直线接口和NVRAM接口(可选),内部有2组寄存器,一组由PCI总线访问,另一组由外加电路访问。通过设置相关寄存器的值可以初始化S5920,PCI总线与外部设备的数据传输可以通过S5920内部的信箱寄存器、FIFO寄存器或者直通寄存器。S5920的通信、控制和配置主要通过PCI配置寄存器的内部操作寄存器备都必须提供的一组寄存器,他们之中保存了特殊的设备和产品信息,如厂商ID、设备ID、存储空间需求等,其内容在系统引导时被主BIOS读入内存。这些寄存器在S5920芯片中既可用自定义的缺省值进行初始化,也可由设计者用存储在外部nvRAM中的内容重新定义。
2.1 信箱通道
与S5933提供4个双向的信箱通道不同的是,S5920只有1个双向的信箱通道,但在多数设计中,这已经足够。由于S5920为信箱通道提供了非常灵活的操作方式,因而使得信箱的应用更加简便容易。
2.2 PASS-THRU通道
PASS-THRU通道的实质就是通过对PASS- THRU区域定义将ADD-ON上的资源S5920提供4个用户可设置的PASS-THRU区域,在系统配置周期,PCIBIOS根据配置空间的设置给每个区域分配地址。每个PASS-THRU通道的地址范围代表一个地址块,其大小由用户定义,最大范围为512 MB。每一个地址块的数据宽度可在8/16/32 b中选择。PASSTHRU传输通道为PCI总线提供一种寄存的访问端口,通过握手协议访问ADD-ON上的资源。
为此,S5933提供PASS-THRU地址寄存器(APTA)和PASS-THRU数据寄存器(APTD)。这2个寄存器分别用来存放PCI主控设备所要访问的PASS-THRU区域的地址和所访问的数据。当PCI主控设备对PASS-THRU区域进行访问时,S5920将要访问的地址锁存到PASS-THRU地址寄存器。如果是读操作,则通过ADD-ON接口的状态信号告知ADD-ON控制逻辑读取数据,ADD-ON控制逻辑可根据PASS-THRU地址寄存器的地址访问ADD-ON上的相应设备并将所读取的数据传送到PASS-THRU数据寄存器,然后S5920再将该数据送到PCI总线上,完成一次读操作;如果是写操作,S5920将数据锁存到PASS-THRU数据寄存器,然后通过ADD-ON接口的状态信号告知ADD-ON控制逻辑读取数据,ADD-ON控制逻辑将数据从PASS-THRU数据寄存器中读出,并根据PASS-THRU地址寄存器的地址传送到相应的ADD-ON设备上,完成写操作。
3 S5920与IMP16C550A接口设计
3.1 设计原理
IMP16C550A可以在不同的微机系统间提供数据通讯服务,他主要功能是完成并行CPU总线与串行外设间的数据字符转换。他较之常用的INS8250除了继承其基本功能外有了极大改进,使软件工作量有所降低。由于单向发送控制命令,因此使用只具有目标设备功能的S5920(而不用具有主控功能的S5933)作为PCI总线和IMP10C550A之间的接口芯片。但IMP10C550A处理数据的速率相对较低,从S5920出来的数据传输速率和PCI总线的数据传输速率相同,IMP10C550A难以承受这么高的数据传输速率,以往经典设计是采用在S5920和IMP10C550A之间必须加一级大容量缓冲器,以避免因IMP10C550A来不及数据接收而导致的数据丢失。
本设计地考虑如下:由于ADD-ON端的输出频率为33MHz(BPCLK),但ADD-ON端所有信号与ADCLK同步,故我们采用将BPCLK输入EPM7128SLC进行4分频,将分频后的时钟引至ADCLK端,而IMP10C550A的电路中我们采用11.059 2 MHz的晶振。通过这样的方式,则S5920发送并行数据频率低于并/串转换的频率,不会导致IMP10C550A来不及数据接收而导致的数据丢失。基本原理图如图1所示。
3.2 软件设计
本PCI板卡采用VXD驱动(本驱动适用于Windows 98),用NuMega VtoolsD为工具开发而成。命令数据传输采用S5920的PASS-THRU方式,基址1与2均采用I/O空间,基址3与4未用。几个关键问题及解决如下:
(1)如何获得系统分配给PCI卡的首地址
利用VxD来获得,这也是编写过程中所采用的方法。因为一旦即插即用的设备有什么增加或删减,VxD就获得一个消息即PNP_NEW_DEVNODE,在处理函数中判断发生了什么情况,如果是他所对应设备的注册和装载,VxD就会返回CM_Register_Device_Driver函数,而他又会调用另一个配置管理函数CM_Get_ALLoc_Log_Conf来获得系统分配给他的资源。通过返回一个CM_CONFI的结构。该结构可以分为4组:内存资源描述、I/O资源描述、IRQ资源描述和DMA资源。每组的第一段表明该类做了多少分配,后面的域为相关的参数项。值得注意的是各项资源(如控制空间基址、通用总线基址和IRQ)不固定,在不同的计算机上一般不相同,即使在同一台计算机上当硬件环境变了后一般也会变。
(2)应用层程序如何与底层驱动程序进行通信
在Windows中,Win32应用程序主动对VxD的通信方法只有一种,就是利用设备输入输出控制函数DeviceIoControl(),他的定义如下:
其中:dwIoControlCode为应用程序调用VxD的命令代码,他是应用程序和VxD通信的“语言”,通过他VxD知道应用程序要他做什么事情。
在VxD中收到W32_DeviceIOControl控制消息,由OnW32DeviceIoControl(PIOCTLPA RAMpDIOCParams)函数来响应。他的结构定义如下:
参数pDIOCParams:为指向IOCTLParams结构的指针。
其中:dioc_IOCtlCode为应用程序调用VxD的命令代码。后面的6个参数分别与前面的参数相对应。
3.3 信号流程
流程图如图2所示。
4 结 语
该板卡应用于云台控制系统及高温油阀调控系统,已取得很好效果,但传输距离有限。以后若需改进,可考虑在IMP16C550A的输出端接一片MAXIM公司的MAX490这种TTL和RS485的电平转换芯片,这样可以延长数据传输距离。PCI总线接口芯片的出现使得开发人员摆脱了纷繁复杂的协议本身,从而能用更多精力与时间投入设计与开发本身,进而开发出高质量的产品,同时可以缩短开发周期紧跟市场需求。