首页 > 编程知识 正文

单片机接口技术及应用,pci和pcie插槽区别

时间:2023-05-05 08:39:00 阅读:154875 作者:1444

8位单片机在嵌入式系统中应用广泛,但与PCI总线设备直接交互存在固有缺陷。 8位单片机只有16位地址线、8位数据端口,而PCI总线2.0标准除了32位地址数据复用AD[3~0]外,还有FRAME、IRDY、TRDY等重要信号线用单片机有限的I/O端口直接控制这么多信号线是不可能的。 一种可行的方案是利用CPLD作为单片机与PCI设备之间的桥梁,利用CPLD中I/O资源丰富、用户可自行定制逻辑的优势,由单片机完成与PCI设备的通信任务

1 PCI接口设计原理

1.1 PCI总线协议概述

这里只讨论了PCI总线2.0协议,其他协议只是在2.0的基础上略有扩展,只对单片机和PCI设备之间的通信没有多大意义。 PCI总线是工作频率0~33MHz的高性能局部总线,可以同时支持多组外围设备。 这里,我只关心单片机和一个PCI器件之间的通信状况,而且以单片机和CPLD的一个作为主设备,以另一个作为PCI从设备。 这样做的目的是简化问题,降低系统成本。

虽然PCI总线上有很多信号线,但并不是所有的信号都使用。 实际上,PCI设备并不支持所有信号线。 例如,NIC不支持错误报告信号PERR和SERR。 根据特定的APP位置,可以选择支持部分信号线。 此外,还有可以直接连接电源或接地的信号线。 简单说明一般信号线的功能。

AD[31~0] :地址数据复用信号。 FRAME是有效的第一个周期中的地址,如果IRDY和TRDY同时有效,则为数据。

C/BE[3~0] :总线命令和字节使能控制信号。 通过地址传输的是总线命令。在数据期间内是字节使能控制信号,表示AD[31~0]中的哪个字节是有效数据。 总线命令代码的说明如下所示。

C/BE[30]#命令类型说明C/BE[30]#命令类型说明

0 0 0 0中断响应1 0 0 0保留

00 1特殊周期1 0 0 1保留

0 0 1 0 I/O引脚1 0 1 0配置引脚

0 0 1 1 I/O写入101配置写入

10 ) 10 )保持存储器的多行读

00101101保留双地址周期

0 1 1 0存储器引线1 1 1 0存储器1行引线

111存储器写入111存储器写入无效

PCI总线上的所有数据传输基本上由以下三条信号线控制:

帧:帧周期信号。 由主控器驱动,表示1次访问的开始和持续时间,FRAME有效时(0有效,下同),表示数据传输正在进行中,失效后为数据传输的最后一个周期。

IRD :主设备准备了信号。 由主设备驱动,表示主设备已准备好进行数据传输。

TRDY :从设备准备信号。 由从设备驱动表示从设备已经做好了数据传输的准备。 如果同时启用了IRDY和TRDY,则数据传输实际上会发生。

另外,IDSEL信号在配置空间的读写中作为芯片选择信号使用。 如果只有一个PCI从站,则始终可以连接到高电平。 IDSEL信号由从设备驱动,来指示它成为当前正在访问的从设备,并可以将其忽略。

在通过PCI总线进行读写操作时,PCI总线上的各种信号除了RST、IRQ、IRQC、IRQ之外,还必须使时钟的下降信号发生变化,时钟的上升信号保持稳定。

1.2 CPLD设计计划

考虑到单片机和CPLD的处理能力和系统成本,以下计划不支持PCI总线的线性突发传输等需要连续几个数据周期的读写方式,而是一个地址周期和一个数据周期的读写方式对于大多数APP应用,这种方法已经足够了。 图1是简化的PCI总线读写操作的序列。

在CPLD中,提供了13个8位寄存器,用于存储读取和写入一条PCI总线所需数据,其中PCI _ address 0至PCI _ address 3是读取和写入时的地址数据;

图1简化的PCI写入时机

PCI数据0至PCI _ data S3是要写入PCI设备数据; 保存pci_cbe[3~0]地址周期时总线命令; pci_cbe[7~4]数据周期保存时的字节使能命令; pci_data0~pci_data3保存从PCI设备返回的数据; pci_request是PCI总线读写操作状态寄存器,用于向单片机返回一些信息。 单片机向pci_cbe寄存器写入1字节时,重置CPLD中的状态机,触发CPLD进行PCI总线的读写操作; 单片机查询pci_request寄存器得知读写操作已完成,从pci_data寄存器读取从PCI设备返回的数据。

CLD中状态机的状态转移图如图2所示。 每个状态对应于帧信号和IRD信号中的一个输出,其他输入/输出信号线是由这两条信号线、pci_cbe的值和TRDY的状态来决定的。 如果FRAME有效,则AD[31~0]由pci_address驱动,C/BE[3~0]由pci_cbe的低4位驱动; 成为I

RDY有效时,C/BE[3~0]视总线命令,要么由pci_cbe高4位驱动,要么设为高阻态,而AD[31~0]在pci_cbe[0]为“0” (PCI读命令)时,设为高阻态,而在pci_cbe[0]为“1” (PCI写命令)时由pci_datas驱动。另外一方面,一旦TRDY信号线变为低电平,AD[31~0]线上的数据被送入pci_data寄存器,而C/BE[3~0]线上的数据被送入pci_request寄存器的低4位。

图2  状态转移图 [page]

考虑到在不正常情况下,PCI设备不会对PCI总线作出响应,即TRDY不会有效,为了不使状态机陷入状态S2的僵持局面,另外增设了一个移位计数器mycounter。当IRD信号有效时,计数器开始计数。计数溢出之后,不论PCI总线操作是否完成,状态机都会从状态S2转移到状态S3,即结束PCI总线操作。当TRDY有效时,会立即置位mycounter.cout。

PCI总线操作是否正确完成,可查询pci_request的最高位是否为“1”,而IRDY与FRAME的值可分别查询pci_request的第4位和第5位。这两位反映了PCI总线操作所处的状态,两位都为“1”时可以认为PCI总线操作已经完成。在实践中,如果单片机的速度不是足够快的话,可以认为PCI总线操作总是即时完成的。

2 PCI设计接口实现

2.1 CPLD VHDL程序设计

我们针对8位单片机控制PCI以太网卡进行了程序设计,CPLD器件选用Xilinx的XC95216系列。针对以太网卡的特点在逻辑上进行了再次简化,最终程序将适配进XC95261芯片中,并在实践中检验通过。

以太网卡仅支持对配置空间和I/O空间的读写操作,而且这两个空间的地址都可以设置在0xFF以内,所以可以只用一个pci_address0寄存器,其它地址都直接设为“0”;如果再限制,每次只往网卡写入一个字节数据,则可以只用一个pci_datas0寄存器,其它数值在具体操作时设成与pci_datas0寄存器的一样即可。

2.2 单片机PCI读写C语言程序设计

在CPLD在帮助下,单片机读写PCI设备就变得相当简单。首先,将pci_cbe等寄存器都声明为外部存储器变量,并根据CPLD的设计指定地址。然后,传递适当的参数给以下两个读写子函数,即可完成对PCI设备配置空间、I/O空间、存储器空间的读写操作。从PCI设备的返回数据存放在全局变量savedata中。

实际上在写PCI设备时,也可以从pci_data中得到返回数据。这个数据必须等于往PCI设备写的数据。利用这一点可以进行差错检验和故障判断,视具体应用而定。

bdate unigned char request;

sbit IRDY0=request^4;

sbit FRAME0=request^5;

sbit VALID=request^7;

void readpci(unsigned char addr,unsigned char cbe){

pci_address0=addr;

pci_cbe=cbe;

request=pci_request;

while(!IRDY0 & FRAME0)) request=pci_request;

savedata0=pci_data0;

savedata1=pci_data1;

savedata2=pci_data2;

savedata3=pci_data3;

if(!VALID)printf("Data read is invalid! ");

}

void writepci(uchar addr,uchar value0,uchar cbe){

data uchar temp;

pci_address0=addr;

pci_datas0=value0;

pci_cbe=cbe;

request=pci_request;

while(!(IRDY0 & FRAME0)) request=pci_request;

if(!VALID)printf("Data write is invalid!");

}

3 结论        用CPLD实现单片机与PCI总线接口的并行通信,电路结构简单、体积小,1片CPLD芯片足够,并且控制方便,实时性强,通信效率高。本设计方法已成功地应用于作者开发的各种数据采集系统中,用作单片机与PC104之间的并行数据通信,效果非常理想。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。