微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 工业电子 > 机载嵌入式PCI总线硬件设计和软件测试

机载嵌入式PCI总线硬件设计和软件测试

时间:09-17 来源:互联网 点击:
3.2 配置PCI总线从设备

当中央资源作为主设备访问其它PCI设备时,必须对从设备进行适当的初始化。一般选用PCI配置周期设置PCI桥的关键配置寄存器,然后用普通PCI存储器周期设置其它寄存器。

Void ConfigPCISlave(UINT And,UINT Range,UINT PCIBAddr,UINT LRegPBA,UINT LocBAddr)

//功能:通过主桥产生PCI配置周期,去配置PCI总线上作为从方的PCI9056

//入口参数:

//ADn:设备号,亦即和被配置设备的IDSEL#相连的PCI地址

//Range:范围长度

//PCIBAddr:PCI基址

//LRegPBA:内部寄存器的PCI存储器基址(范围512B),

//亦即PCIBAR0值

//LocBAddr:局部基址

{UINT Abit32W,LROffset;

//------用配置周期-----------------------

//设置命令寄存器PCICR

//D0=IO Space="1:要响应I/O周期"

//D1=Memory Space="1:要响应Memory周期"

//D2=Master Enable="1:允许做Master"

ABit32W=GetConfigReg(ADn,PCI9056_PCICR)|0x07;

//读原值并置位

SetConfigReg(and,PCI9056_PCICR,ABit32W);

//PCIBAR0:其它寄存器的PCI基址.

SetConfigReg(ADn,PCI9056_PCIBAR0,LRegPBA);

//设置PCI基址,以便能访问其它寄存器

SetConfigReg(ADn,PCI9056_PCIBAR2,PCIBAddr);

//-----以下用PCI存储器周期-----------

//1.Space0的局部地址范围LAS0RR

LROffset=LRegPBA&0x001FFFFF;//取局部寄存器PCI基址的位移

ABit32W=~Range+1; //计算范围值的补码

SetPCIReg(LROffset,PCI_LAS0RR,Abit32W);

//2.Space0的局部基址LAS0BA

SetPCIReg(LROffset,PCI_LAS0BA,LocBAddr|1);

SetPCIReg(LROffset,PCI_EROMBA,0x38);

//4.Space 0/ROM的局部总线描述符LBRD0(P11-27)

//D1D0=11:Space 0-32Bit数据宽度.(复位缺省)

//D5..2=内部等待状态计数器.

//D6=1:需要READY#信号.(复位缺省)

//D7=1:允许连续Burst

//D7=0:Burst-4 Mode (复位缺省)

//D8=0:Space 0允许预取

//D9=0:扩展ROM允许预取

//用缺省值40430043H

SetPCIReg(LROffset,PCI_LBRD0,0x40430043);

ABit32W=GetPCIReg(LROffset,PCI_LBRD0);

if(ABit32W!=0x40430043)

printf("局部总线描述符LBRD0缺省值出错=%8x",ABit32W);

return;

}

PCI总线上的其它设备身份是动态变化的,所以对有能力做PCI主设备的,应该配置其局部空间到PCI空间映射的参数。

结语

PCI局部总线规范也在更新,向更快更强更省电的方向迈进。时钟速率由最初的33MHz提高到66MHz,数据宽度也由32位扩展到可支持64位,工作电压从5V转变为3.3V,使功耗更小。可以预计,嵌入式PCI总线将极大提高机载嵌入式计算机系统的总体性能。

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

网站地图

Top