MIC-2718在完成第一次A/D转换后将数据存入MIC-2718的A/D数据寄存器(地址为BASE+0和BASE+1(BASE为MIC- 2718的基地址))和FIFO缓冲区的第一个存储单元,下一次A/D转换时,新的数据会覆盖A/D数据寄存器中的数据,但是如果缓冲区的第一个存储单元中的元素没有被系统读取,FIFO会自动将此次转换的数据存入缓冲区的下一个存储单元,上一次的数据仍然保留。每一次转换的数据都被依次存入FIFO的缓冲区中,最多可以存储1024次A/D转换的数据。转移数据时,只需读取FIFO数据寄存器(地址为BASE+23和BASE+24)中的数据,它也是 FIFO缓冲区中的第一个存储单元的数据,此时缓冲区中第一个数据被读出,下一个存储单元的数据自动代替它的位置。通过采集板中FIFO的状态寄存器(地址为BASE+25)可以判断FIFO缓冲器当前的状态。状态寄存器的D0位EF是FIFO为空的标志,D1位HF是FIFO半满的标志,D2位FF是 FIFO为满的标志。另外,对BASE+25寄存器的任何写操作都将清空FIFO缓冲器,EF被置1,HF、FF置0。
Windows CE系统提供的驱动程序开发包(Windows CE Driver Development Kit,Ceddk)中提供了丰富的驱动程序函数(地址映射、总线访问、建立DMA缓冲和I/O操作等),可以满足硬件平台上任何总线的需要[8],它通常被实现为动态库Ceddk.lib文件。由于MIC-2718是基于ISA总线的,可以直接对采集板的地址进行读写操作,同时,由于FIFO读写操作是相互独立的,可以同时进行,所以不必考虑采集板与Windows CE系统数据传输时的时序配合问题,但是在对FIFO进行读写操作时,要判断FIFO的状态,只有在缓冲区中数据未满时才能写入,未空时才能读出[9],以避免一些错误的操作。
当数据采集板通过程序控制方式、定时器触发方式或外部触发方式采集到模拟信号后自动进行A/D转换后将数据放入A/D数据寄存器并依次写入FIFO 缓冲区中,Windows CE.net中的用户应用程序通过检测FIFO标志寄存器和MIC-2718状态寄存器(地址为BASE+8)的状态来确定是否进行了有效的A/D转换。下面给出在Windows CE开发平台上对FIFO进行读操作的部分代码,设MIC-2718的基地址为300H:
PUCHAR ioPortBase=MapIoSpace(300H);//将物理地址影射为虚拟地址
BYTE aistatus=READ_PORT_UCHAR(ioPortBase+8);//读MIC-2718的状态寄存器
BYTE status=READ_PORT_UCHAR(ioPortBase+25);//读FIFO的状态寄存器
BYTE ad0,ad1;
if(aistatus&0x10)//若MIC-2718状态寄存器的A/D转换位有效
{
if(status&1!=0)//若FIFO不为空,则读FIFO
{
ad0=READ_PORT_UCHAR(ioPortBase+23);
ad1=READ_PORT_UCHAR(ioPortBase+24);
}
}
表1 A/D数据寄存器与FIFO数据寄存器的比较
在使用MIC-2718的某一通道分别用常规方式和FIFO方式对一个持续变化的电压源做连续的信号采集和传输时,两种方式传输的数据如表1所示。可以看出,第2和第8组中A/D数据寄存器中的数值是错误的,可见使用普通A/D传输方式存在数据丢失问题,因此并不能准确传输数据,而使用FIFO方式可以保证数据传输的完整性。
5.结束语
通过实际测试,在Windows CE的高速数据采集系统中,采用FIFO可以保证数据采集的可靠性,并且编程简单,程序调试方便,可以极大地提高数据采集板的采样效率。本文作者的创新点在于在Windows CE.net系统下实现FIFO数据数据传输,从而保证了数据传输的可靠性。