微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 一种8路串口转换PCI总线的设计方案

一种8路串口转换PCI总线的设计方案

时间:07-20 来源:互联网 点击:

口还具有完整的调制解调控制功能,包括:容许发送(CTS);请求发送(RTS);数据设备准备好(DSR);数据终端准备好(DTR);振铃指示(RI);载波检测(DCD)。本文只给出了一路UART和主芯片接口,其他几路类似。

500)this.style.width=500;" border=0>

2.4 UART接口工作过程

发送数据过程 有效数据(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.读取INT1,INT2,INT3寄存器用以确定中断通道(地址0x081-0x083)

c.读取设备号(DVID)

d.读取带有状态信息的接收FIFO数据

特别注意的是,当主机读取接收到的带有线路状态寄存器(LSR)信息的数据时,主机必须以16位或32字节的形式读取数据,这样做的目的是为了保证带有差错标记的数据的完整性。

3 驱动程序设计

基于Windows NT串口通信驱动程序设计中,应用较广泛的有:利用MSCOMM控件进行编程;利用Windows API函数进行设计。串口通信Microsoft Communications Control(简称为MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。而用Windows API通信较为复杂,其中要涉及到对Windows内核机制的理解,但Windows API函数用于串口操作流程可以扩展到其他硬件的操作上。本设计选用Windows API函数来实现串口操作。

非标准串行驱动在I/0管理器中被注册,以COM5,COM6,COM7……COM12来命名,对应于XR17D158的CH0,CH1,CH3,……CH7。一般不采用COM1,COM2,COM3,COM4,因为这些端口有可能被其他串口通信设备占用。根据WINDOWS NT DDK,我们可以发现,通信口在COM9以上命名的,必须以“\\\\.\\COM10”来定义,我们在写串口驱动程序时,首先要调用windows API函数CreateFile打开相应的串行口。下一步使用文件句柄访问硬件设备,通信完成时用CloseHandle关闭串行口。以下是两个关键成员函数,一个是打开串口函数,另外一个是简单串口读/写函数。

(1)打开串口函数

PortHandle=NULL;//初始化端口

If(cPortNo=9)

ComName.Format(“COM%d”,cPortNo);

Else

ComNamel.Format(“\\\\.\\COM%d”,cPortNo);

//如果串口序号大于9则以“\\\\.\\COM10”来定义

If((PortHandle=CreateFile(ComName,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FILE_

FLAGE_OVERLAPPED,0))= =INVALD_HANDLE_VALUE //非重叠读/写端口

{

DWORD err=GetLastError();

Return(NULL); //端口建立失败

}

Else

{

//端口建立成功,初始化端口,对端口进行操作

}

(2)串口读/写函数

//读数据到缓冲区

ReadFile(PortHandle,(LPVOID)IpReadBuff,dwFileSize,dwBytesRead,osRead);

//写操作

Int bResult=WriteFile(PortHandle,(LPVOID)IpWr

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top