一种8路串口转换PCI总线的设计方案DesignofMulti-serialPortCommunicationAdapterBasedonPCIBusAbstract:ThispaperprovidesadesignofoctalserialporttoPCIbus.Themulti-serialportinterfacedtoPCIbusisrealizedbyusingthededicatedchipXR17D158andUARTserialleveltransitionschipMAX3238.TheconfigurationofthechipXR17D158’registersetstheprocessofthechipinterfacingwithoctalUARTanddevelopmentofdriversoftwareisemphaticallyintroduced.TheadapterisPCIRev.2.3compliantandthemaximumbaudratecanreach921.6kbpsanditcanwidelybeappliedinsuchfieldsasPOSBankTerminalSystemHomeAutomationShopAutomationetc.Keywords:multi-serialportPCIbusUARTFIFO摘要:提供了一种8路串口转换PCI总线的设计方案运用专用芯片XR17D158和UART串口电平转换芯片MAX3238实现多路串口和PCI总线接口转换,并着重介绍了XR17D158芯片的寄存器配置和8路UART接口工作过程以及驱动程序的开发该适配卡符合PCI2.3规范,最高波特率可达921.6kbps,可广泛应用于POS机、银行终端系统、家庭自动化、工厂自动化等领域关键词:多路串口PCI总线UARTFIFO1引言随着Internet的发展,越来越多的计算机或设备通过串口通信方式接入网络,实现信息共享和设备的集中控制和管理多端口扩展已成为通信设备接入的重要环节利用串口进行通信具有结构简单,线路成本低的优点,广泛应用于各个领域而PCI总线,即外围器件互连总线,是目前应用最广泛、最流行的一种高速同步总线由于大部分I/O设备是没有PCI总线功能的,开发多端口通用串口和PCI总线的接口卡也就成为技术发展的必然要求本系统采用专用芯片XR17D158开发了基于PCI总线的8路RS-232高速串行通讯卡为通信设备提供额外的高性能串行接口,适用于连接各类串行设备2系统硬件设计系统硬件电路如图1所示,主要包括主芯片XR17D158、8路UART接口和串行配置寄存器EEPROM2.1XR17D158模块介绍在很多通信系统中,对信号传输的带宽和速度有很很高的要求,而PCI总线非常适合将高速信号经接口芯片和主机桥接在一起本文采用Exar公司推出的一种兼容3.3V和5V的PCI总线UART芯片XR17D158它具有PCI接口和UART结构,满足PCI2.3规范,工作频率为33MHz,32位的数据总线可以充分利用CPU带宽,传送/接收更多数据,支持8个通道UART转换PCI,减少系统开销、节约了电路板空间为下载CPU的处理信息,每一个通道都拥有带可编程触发电平的64字节发送/接收缓冲FIFO,可分别以高达921.6kbps的速率对波特率进行编程500)this.style.width=500;border=02.2XR17D158寄存器配置XR17D158具有三组不同的寄存器(1)PCI局部总线配置空间寄存器PCI插卡插入系统后,系统BIOS将根据读到的插卡信息并结合系统情况为插卡分配存储地址、端口地址和中断等信息,实现即插即用的自动配置,从而免除了人工操作,这些信息都保存在外接的EEPROM中,在上电时XR17D158会检测EEPROM是否有效,系统以此来标识PCI卡;(2)设备配置寄存器提供从PCI数据总线向每一UART通道的接收/发送数据FIFO缓冲存储器的传输方式,它提供了对UART传输和各种功能状态的监控寄存器占用4kPCI总线存储器地址空间这些地址由基址加上偏移量得到,偏移量保存在PCI局部总线配置寄存器的BAR寄存器0x10[31:12]这些寄存器控制或监控所有8通道UART的功能状态信息,包括中断控制和状态,16位通用定时器控制和状态,多用途输入/输出控制和状态,休眠模式控制,软复位控制以及设备标识和版本号信息等等;(3)UART[7:0]配置寄存器每路UART通道都有内部UART配置寄存器作为串行数据传输控制和状态信息指示,所有8组通道寄存器嵌入设备配置寄存器空间,其寄存器配置偏移地址为:UART[M]=0x00N00,其中M表示通道序号,N=2×MXR17D158有8路UART[7:0],每路通道都有深度为64的发送/接收缓冲FIFO,符合16550规范的控制/状态寄存器以及为每路UART通道提供发送/接收时钟的波特率发生器每路通道都有单独的具有预分频的可编程波特率发生器(BRG),用以获得16X或8X的串口数据接收/发送的采样时钟预分频系数可由软件在MCR寄存器中设置,MCR[7]=0,预分频系数为1;MCR[7]=1,预分频系数为4经过预分频得到的时钟还要经过内置的分频器分频,以获得所需要的发送/接收时钟信号,其中分频器的分频系数由每路UART通道的DLM和DLL寄存器编程得到,波特率由下面公式计算得到:500)this.style.width=500;border=0假设外部输入时钟为14.7456MHz,通过相应的寄存器设置,使RS-232通道得到最大波特率921.1kps编程过程如下:(1)使能DLM,DLL寄存器写入0x80到相应UART通道的LCR寄存器;(2)分频系数确定设置DLM=00,DLL=01;(3)设定预分频系数相关寄存器MCRa.使能MCR[7:5]设置UART通道EFR寄存器EFR[4]=1;b.预分频系数的设定设置MCR[7]=0;c.锁存MCR寄存器设置设置EFR[4]=0;2.38路UART和XR17D158接口设计由于RS-232的TTL电平与芯片的CMOS电平不兼容,所以两者之间需要加电平转换电路本系统采用TI公司的MAX3238芯片实现电平转换及串口通信功能;兼容5V逻辑输入,内含3路接收、5路发送串行通信接口,最大数据传输速率可达250Kbps具有低功耗、高数据速率、增强型ESD保护等特性XR17D158的UART接口就像一个8位的输入和输出端口,它可以从发送缓冲FIFO或者接收缓冲FIFO中读写数据当主机有数据要发送时,它只需将数据按字节格式(8位宽)发送到UART即可当UART接收到来自外部串行设备的数据时,会把数据缓存在其FIFO中(同样是8位宽),然后通过一个内部寄存器位或硬件中断信号向主机指示该数据已可以使用另外,XR17D158的UART接口还具有完整的调制解调控制功能,包括:容许发送(CTS);请求发送(RTS);数据设备准备好(DSR);数据终端准备好(DTR);振铃指示(RI);载波检测(DCD)MAX3238和XR17D158的硬件连接如图2所示,本文只给出了一路UART和主芯片接口,其他几路类似500)this.style.width=500;border=02.4UART接口工作过程发送数据过程有效数据(64位)由主机写入接口中的输入缓冲FIFO寄存器,当发送保持寄存器(THR)清空标志位ISR[1]=1,表示发送缓冲FIFO中的数据减少到满足设定的触发中断条件而引起中断,在输出移位寄存器(TSR)中,由发送控制逻辑在待发送数据加上起始位、奇偶校验位和停止位,并按设定的时钟频率逐位移出数据接收数据过程接收移位寄存器(RSR)使用16×或8×时钟作为定时器,当检测到起始位下降沿时,将计数器清零,并开始采用时钟计数,当计数器计到8或4时,表示已到达起始位的中间位置,此时采样值仍为0,说明是真正的起始位,余下的数据位和停止位随后也被采样如果停止位采样正确(采样值为1),则字符被接收,并装入接收保持寄存器(RHR),如果接收到的数据未达到设定的FIFO触发条件,RHR产生以接收数据准备好中断(ISR[2]=1),同时流向控制信号RTS#/DTR#继续保持有效,允许UART接口继续接收外部串行数据PCI总线接收/发送数据XR17D158支持在映射的存储器地址进行PCI突发模式读/写,接收缓冲FIFO和发送缓冲FIFO可以对这些独立的存储器进行读/写,这些存储器地址可以通过计算得到:M=2N+1,其中N为UART通道序号主机利用PCI总线从XR17D158的接收缓冲FIFO读取数据一般有两种方式:查询方式和中断方式无论采取哪种方式,在读取缓冲FIFO数据之前必须先读取设备的配置寄存器中设备ID寄存器(DVID),得到确认之后带有状态的FIFO寄存器中的数据才能被读取如果在这过程中,还有其他UART通道寄存器数据需要被读取,必须重复读取设备ID寄存器(DVID),确认UART通道类型,再进行其他操作这两种实现方式编程步骤如下:(1)查询方式a.读取线路状态寄存器(LSR)b.读取设备号(DVID)c.读取带有状态信息的FIFO数据(2)中断实现方式a.读取全局中断寄存器INT0(地址0x080)b.读取INT1INT2INT3寄存器用以确定中断通道(地址0x081-0x083)c.读取设备号(DVID)d.读取带有状态信息的接收FIFO数据特别注意的是,当主机读取接收到的带有线路状态寄存器(LSR)信息的数据时,主机必须以16位或32字节的形式读取数据,这样做的目的是为了保证带有差错标记的数据的完整性3驱动程序设计基于WindowsNT串口通信驱动程序设计中,应用较广泛的有:利用MSCOMM控件进行编程;利用WindowsAPI函数进行设计串口通信MicrosoftCommunicationsControl(简称为MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能而用WindowsAPI通信较为复杂,其中要涉及到对Windows内核机制的理解,但WindowsAPI函数用于串口操作流程可以扩展到其他硬件的操作上本设计选用WindowsAPI函数来实现串口操作非标准串行驱动在I/0管理器中被注册,以COM5COM6COM7……COM12来命名,对应于XR17D158的CH0CH1CH3……CH7一般不采用COM1COM2COM3COM4,因为这些端口有可能被其他串口通信设备占用根据WINDOWSNTDDK,我们可以发现,通信口在COM9以上命名的,必须以“\\\\.\\COM10”来定义,我们在写串口驱动程序时,首先要调用windowsAPI函数CreateFile打开相应的串行口下一步使用文件句柄访问硬件设备,通信完成时用CloseHandle关闭串行口以下是两个关键成员函数,一个是打开串口函数,另外一个是简单串口读/写函数(1)打开串口函数PortHandle=NULL;//初始化端口If(cPortNo=9)ComName.Format(“COM%d”cPortNo);ElseComNamel.Format(“\\\\.\\COM%d”cPortNo);//如果串口序号大于9则以“\\\\.\\COM10”来定义If((PortHandle=CreateFile(ComNameGENERIC_READ|GENERIC_WRITE00OPEN_EXISTINGFILE_FILE_FLAGE_OVERLAPPED0))==INVALD_HANDLE_VALUE//非重叠读/写端口{DWORDerr=GetLastError();Return(NULL);//端口建立失败}Else{//端口建立成功,初始化端口,对端口进行操作}(2