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之间的并行数据通信,效果非常理想。