#ifndef _PCI8622_DEVICE_ #define _PCI8622_DEVICE_ //#################### AD硬件参数PCI8622_PARA_AD定义 ##################### // 用于AD采样的实际硬件参数 typedef struct _PCI8622_PARA_AD { LONG ADMode; // AD模式选择(连续/分组方式) LONG FirstChannel; // 首通道[0,31] LONG LastChannel; // 末通道[0,31],要求末通道必须大于或等于首通道 LONG Frequency; // 采集频率,单位为Hz, [1, 250000] LONG GroupInterval; // 分组时的组间间隔(单位:微秒)[1, 419430] LONG LoopsOfGroup; // 组内循环次数[1, 255] LONG Gains; // 增益设置 LONG InputRange; // 模拟量输入量程范围 LONG TriggerMode; // 触发模式选择 LONG TriggerType; // 触发类型选择(边沿触发/脉冲触发) LONG TriggerDir; // 触发方向选择(正向/负向触发) LONG TrigWindow; // 触发灵敏窗[1, 65535], 单位25纳秒 LONG ClockSource; // 时钟源选择(内/外时钟源) LONG bClockOutput; // 允许时钟输出到CLKOUT,=TRUE:允许时钟输出, =FALSE:禁止时钟输出 LONG GroundingMode; // 接地方式(单端或双端选择) LONG TimeoutForNpt; // 非空查询方式下的超时时间,单位秒,取值范围为[0, 3600] } PCI8622_PARA_AD, *PPCI8622_PARA_AD; //*********************************************************** // AD硬件参数PCI8622_PARA_AD中的ADMode所使用工作模式选项 const long PCI8622_ADMODE_SEQUENCE = 0x00; // 连续采样 const long PCI8622_ADMODE_GROUP = 0x01; // 分组采样 //*********************************************************** // AD硬件参数PCI8622_PARA_AD中的InputRange模拟量输入范围所使用的选项 const long PCI8622_INPUT_N10000_P10000mV= 0x00; // ±10000mV const long PCI8622_INPUT_N5000_P5000mV = 0x01; // ±5000mV const long PCI8622_INPUT_N2500_P2500mV = 0x02; // ±2500mV const long PCI8622_INPUT_0_P10000mV = 0x03; // 0~10000mV const long PCI8622_INPUT_0_P5000mV = 0x04; // 0~5000mV //*********************************************************** // AD参数PCI8622_PARA_AD中的Gains使用的硬件增益选项(使用AD8250放大器) const long PCI8622_GAINS_1MULT = 0x00; // 1倍增益 const long PCI8622_GAINS_2MULT = 0x01; // 2倍增益 const long PCI8622_GAINS_5MULT = 0x02; // 5倍增益 const long PCI8622_GAINS_10MULT = 0x03; // 10倍增益 //*********************************************************** // AD硬件参数PCI8622_PARA_AD中的TriggerMode成员变量所使用触发模式选项 const long PCI8622_TRIGMODE_SOFT = 0x00; // 软件触发(属于内触发) const long PCI8622_TRIGMODE_POST = 0x01; // 硬件后触发(属于外触发) // AD硬件参数PCI8622_PARA_AD中的TriggerType触发类型所使用的选项 const long PCI8622_TRIGTYPE_EDGE = 0x00; // 边沿触发 const long PCI8622_TRIGTYPE_PULSE = 0x01; // 脉冲触发(电平) //*********************************************************** // AD硬件参数PCI8622_PARA_AD中的TriggerDir触发方向所使用的选项 const long PCI8622_TRIGDIR_NEGATIVE = 0x00; // 负向触发(低脉冲/下降沿触发) const long PCI8622_TRIGDIR_POSITIVE = 0x01; // 正向触发(高脉冲/上升沿触发) const long PCI8622_TRIGDIR_POSIT_NEGAT = 0x02; // 正负向触发(高/低脉冲或上升/下降沿触发) //*********************************************************** // AD硬件参数PCI8622_PARA_AD中的ClockSource时钟源所使用的选项 const long PCI8622_CLOCKSRC_IN = 0x00; // 内部时钟 const long PCI8622_CLOCKSRC_OUT = 0x01; // 外部时钟(CLKIN) //*********************************************************** // AD参数(PCI8622_PARA_AD)中的GroundingMode使用的模拟信号接地方式选项 const long PCI8622_GNDMODE_SE = 0x00; // 单端方式(SE:Single end) const long PCI8622_GNDMODE_DI = 0x01; // 双端方式(DI:Differential) //************************************************************************************* // 用于AD采样的实际硬件参数 typedef struct _PCI8622_STATUS_AD { LONG bNotEmpty; // 板载FIFO存储器的非空标志,=TRUE非空, = FALSE 空 LONG bHalf; // 板载FIFO存储器的半满标志,=TRUE半满以上, = FALSE 半满以下 LONG bDynamic_Overflow; // 板载FIFO存储器的动态溢出标志,= TRUE已发生溢出, = FALSE 未发生溢出 LONG bStatic_Overflow; // 板载FIFO存储器的静态溢出标志,= TRUE已发生溢出, = FALSE 未发生溢出 LONG bConverting; // AD是否正在转换, =TRUE:表示正在转换, =FALS表示转换完成 LONG bTriggerFlag; // 触发标志, =TRUE表示触发事件发生, =FALSE表示触发事件未发生 LONG nRemainWords; // 在FIFO中乘余的数据点数 } PCI8622_STATUS_AD, *PPCI8622_STATUS_AD; const int PCI8622_MAX_SEGMENT_COUNT = 64; typedef struct _PCI8622_STATUS_DMA { LONG iCurSegmentID; // 当前段缓冲ID,表示DMA正在传输的缓冲区段 LONG bSegmentSts[PCI8622_MAX_SEGMENT_COUNT]; // 各个缓冲区的新旧状态,=1表示该相应缓冲区数据为新,否则为旧 LONG bBufferOverflow; // 返回溢出状态 } PCI8622_STATUS_DMA, *PPCI8622_STATUS_DMA; //*********************************************************** // 用于计数器的参数结构 typedef struct _PCI8622_PARA_CNT { LONG FunctionMode; // 功能模式, 0:计数器模式COUNTER, 2:脉冲发生器模式 LONG ClockSource; // 时钟源选择 LONG GateMode; // 门控模式 LONG bEnableBuffer; // 缓冲计数使能, 0: 禁止缓冲计数,1: 允许缓冲计数 LONG OutputDir; // 计数输出电平方向 LONG bCoutinue; // 溢出后是否继续计数 LONG OutputType; // 定时器脉冲发生方式下有效,输出波形类型。 } PCI8622_PARA_CNT, *PPCI8622_PARA_CNT; //*********************************************************** // 硬件参数PCI8622_PARA_CNT中的FunctionMode功能模式选项 const long PCI8622_FUNCMODE_COUNTER = 0x00; // 计数器模式 const long PCI8622_FUNCMODE_TIMER = 0x01; // 脉冲发生器模式 //*********************************************************** // 硬件参数PCI8622_PARA_CNT中的ClockSource功能模式选项 const long PCI8622_CLOCKSRC_LOCAL_CLK = 0x00; // 板卡局部分频时钟(对40M晶振分频而得,由SetLocalCLKFreq设定) const long PCI8622_CLOCKSRC_CLOCK_IN = 0x01; // 外部时钟信号源输入 //*********************************************************** // 硬件参数PCI8622_PARA_CNT中的ClockDir时钟方向选项 const long PCI8622_CLOCKDIR_POSTIVE = 0x00; // 上升沿计数 const long PCI8622_CLOCKDIR_NEGATIVE = 0x01; // 下降沿计数 //*********************************************************** // 硬件参数PCI8622_PARA_CNT中的GateMode在门控模式选项 const long PCI8622_GATEMODE_UNUSE_0 = 0x00; // COUNTER:不使用门控信号(适用于简单事件计数) // TIMER:不使用GATE的单次脉冲发生(适用于单次脉冲发生器) const long PCI8622_GATEMODE_RISING_1 = 0x01; // COUNTER:GATE上边沿触发计数,后续边沿无效 // TIMER:GATE上边沿单次触发脉冲发生(适用于单次触发单脉冲发生器) const long PCI8622_GATEMODE_FALLING_2 = 0x02; // COUNTER:GATE下边沿触发,后续边沿无效 // TIMER:GATE下边沿单次触发脉冲发生(适用于单次触发单脉冲发生器) const long PCI8622_GATEMODE_POSITIVE_3 = 0x03; // COUNTER:高电平有效(适用于门控事件计数) // TIMER:GATE上边沿重复触发脉冲发生(适用于重复触发单脉冲发生器) const long PCI8622_GATEMODE_NEGATIVE_4 = 0x04; // COUNTER:低电平有效(适用于门控事件计数) // TIMER:GATE下边沿重复触发脉冲发生(适用于重复触发单脉冲发生器) const long PCI8622_GATEMODE_RSTART_FSTOP_5 = 0x05; // COUNTER:上边沿触发计数、下边沿停止计数(适用于单脉冲宽度测量) // TIMER:GATE上边沿单次触发连续脉冲串发生器 const long PCI8622_GATEMODE_FSTART_RSTOP_6 = 0x06; // COUNTER:下边沿触发计数、上边沿停止计数(适用于单脉冲宽度测量) // TIMER:GATE下边沿单次触发连续脉冲串发生器 const long PCI8622_GATEMODE_PSTART_PSTOP_7 = 0x07; // COUNTER:上边沿触发计数、下一个上边沿停止计数(适用于单周期测量) // TIMER:GATE高电平允许连续脉冲串发生器 const long PCI8622_GATEMODE_NSTART_NSTOP_8 = 0x08; // COUNTER:下边沿触发计数、下一个下边沿停止计数(适用于单周期测量) // TIMER:GATE低电平允许连续脉冲串发生器 // 硬件参数PCI8622_PARA_CNT中的OutputDir在输出方向选项 const long PCI8622_OUTPUTDIR_NEGATIVE = 0x00; // 禁止计数情况下,输出低电平有效 const long PCI8622_OUTPUTDIR_POSITIVE = 0x01; // 禁止计数情况下,输出高电平有效 //*********************************************************** // 用户函数接口 #ifndef _PCI8622_DRIVER_ #define DEVAPI __declspec(dllimport) #else #define DEVAPI __declspec(dllexport) #endif #ifdef __cplusplus extern "C" { #endif //######################## 常规通用函数 ################################# // 适用于本设备的最基本操作 HANDLE DEVAPI FAR PASCAL PCI8622_CreateDevice(int DeviceID = 0); // 创建设备对象 int DEVAPI FAR PASCAL PCI8622_GetDeviceCount(HANDLE hDevice); // 取得设备总台数 BOOL DEVAPI FAR PASCAL PCI8622_GetDeviceCurrentID(HANDLE hDevice, PLONG DeviceLgcID, PLONG DevicePhysID); BOOL DEVAPI FAR PASCAL PCI8622_ListDeviceDlg(HANDLE hDevice); // 列表系统当中的所有的该PCI设备 BOOL DEVAPI FAR PASCAL PCI8622_ReleaseDevice(HANDLE hDevice); // 关闭设备,禁止传输,且释放资源 //####################### AD数据读取函数 ################################# // 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备 // 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面的初始化设备和读取 // AD数据两个函数便能轻松高效地实现高速、连续的数据采集 BOOL DEVAPI FAR PASCAL PCI8622_GetDevTriggerPos( // 取得触发位置 HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 PULONG nTriggerPos); // 取得触发位置值 // AD程序查询方式函数 BOOL DEVAPI FAR PASCAL PCI8622_InitDeviceProAD( // 初始化设备,当返回TRUE后,设备即准备就绪. HANDLE hDevice, // 设备对象,它由CreateDevice函数创建 PPCI8622_PARA_AD pADPara); // 硬件参数, 它仅在此函数中决定硬件状态 BOOL DEVAPI FAR PASCAL PCI8622_StartDeviceProAD( // 在初始化之后,启动设备 HANDLE hDevice); // 设备对象句柄,它由CreateDevice函数创建 BOOL DEVAPI FAR PASCAL PCI8622_ReadDeviceProAD_Npt( // 当AD标志有效时,用此函数读取设备上的AD数据(程序非空方式) HANDLE hDevice, // 设备句柄,它由CreateDevice函数创建 WORD ADBuffer[], // 接受原始AD数据的用户缓冲区 LONG nReadSizeWords, // 相对于偏位点后读入的数据长度(字) PLONG nRetSizeWords); // 返回实际读取的长度(字) BOOL DEVAPI FAR PASCAL PCI8622_GetDevStatusProAD( // 在AD采样过程中取得设备的各种状态,返回值表示函数是否成功 HANDLE hDevice, // 设备句柄,它由CreateDevice函数创建 PPCI8622_STATUS_AD pADStatus); // AD的各种信息结构体 BOOL DEVAPI FAR PASCAL PCI8622_ReadDeviceProAD_Half( // 当AD标志有效时,用此函数读取设备上的AD数据(程序半满方式) HANDLE hDevice, // 设备句柄,它由CreateDevice函数创建 WORD ADBuffer[], // 接受原始AD数据的用户缓冲区 LONG nReadSizeWords, // 相对于偏位点后读入的数据长度(字) PLONG nRetSizeWords); // 返回实际读取的长度(字) BOOL DEVAPI FAR PASCAL PCI8622_StopDeviceProAD( // 在启动设备之后,暂停设备 HANDLE hDevice); // 设备对象句柄,它由CreateDevice函数创建 BOOL DEVAPI FAR PASCAL PCI8622_ReleaseDeviceProAD( // 关闭AD设备,禁止传输,且释放资源 HANDLE hDevice); // 设备句柄,它由CreateDevice函数创建 //##################### AD数据读取函数(DMA方式)(上层用户函数) ########################### // AD直接内存(DMA)方式函数 BOOL DEVAPI FAR PASCAL PCI8622_InitDeviceDmaAD( // 初始化设备,当返回TRUE后,设备即准备就绪. HANDLE hDevice, // 设备对象,它由CreateDevice函数创建 HANDLE hDmaEvent, // DMA事件句柄,它由CreateSystemEvent创建 WORD ADBuffer[], // 用户缓冲区,最好为两维数组 LONG nReadSizeWords, // 每次DMA时,用户从指定缓冲应读取的实际长度(要小于或等于nSegmentSizeWords) LONG nSegmentCount, // 缓冲分段的数量,取值范围为2-64 LONG nSegmentSizeWords, // 缓冲区分段的段长(必须等于FIFO半满长度) PPCI8622_PARA_AD pADPara); // 硬件参数, 它仅在此函数中决定硬件状态 BOOL DEVAPI FAR PASCAL PCI8622_StartDeviceDmaAD( // 在初始化之后,启动设备 HANDLE hDevice); // 设备对象句柄,它由CreateDevice函数创建 BOOL DEVAPI FAR PASCAL PCI8622_GetDevStatusDmaAD( // 在AD采样过程中取得DMA的有关状态,返回值表示函数是否成功 HANDLE hDevice, // 设备句柄,它由CreateDevice函数创建 PPCI8622_STATUS_DMA pDMAStatus); // 获得的DMA工作状态 BOOL DEVAPI FAR PASCAL PCI8622_SetDevStatusDmaAD( // 在AD采样过程中设置DMA的有关状态,返回值表示函数是否成功 HANDLE hDevice, // 设备句柄,它由CreateDevice函数创建 LONG iClrBufferID); // 要清除的缓冲区ID,将其置为0 BOOL DEVAPI FAR PASCAL PCI8622_StopDeviceDmaAD( // 在启动设备之后,暂停设备 HANDLE hDevice); // 设备对象句柄,它由CreateDevice函数创建 BOOL DEVAPI FAR PASCAL PCI8622_ReleaseDeviceDmaAD( // 关闭AD设备,禁止传输,且释放资源 HANDLE hDevice); // 设备句柄,它由CreateDevice函数创建 //##################### AD的硬件参数操作函数 ########################### BOOL DEVAPI FAR PASCAL PCI8622_SaveParaAD(HANDLE hDevice, PPCI8622_PARA_AD pADPara); // 将当前的AD采样参数保存至系统中 BOOL DEVAPI FAR PASCAL PCI8622_LoadParaAD(HANDLE hDevice, PPCI8622_PARA_AD pADPara); // 将AD采样参数从系统中读出 BOOL DEVAPI FAR PASCAL PCI8622_ResetParaAD(HANDLE hDevice, PPCI8622_PARA_AD pADPara); // 将AD采样参数恢复至出厂默认值 //####################### 计数器与定时器操作函数 ######################### BOOL DEVAPI FAR PASCAL PCI8622_InitDeviceCNT( // 初始化各路计数/定时器 HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 PPCI8622_PARA_CNT pCNTPara); ULONG DEVAPI FAR PASCAL PCI8622_SetLCLKFreqCNT( // 设置本地时钟频率(LCLK=Local Clock),返回实际的分频数 HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 double Frequency); // 时钟频率值 BOOL DEVAPI FAR PASCAL PCI8622_SetDeviceCNT( // 设置计数器的初值 HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 ULONG CNTVal, // 计数初值, COUNTER: 计数初值,TIMER:延时初始脉冲宽度(16位) ULONG WidthVal); // 宽度初值, COUNTER: 无效, TIMER:输出脉冲宽度(16位) BOOL DEVAPI FAR PASCAL PCI8622_GetDeviceCNT( // 取得各路计数器的当前计数值 HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 PULONG pCNTVal, // 返回计数值 PULONG pWidthVal); // 返回宽度值 BOOL DEVAPI FAR PASCAL PCI8622_GetDevStatusCNT( // 获得计数器状态 HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 PBOOL bOverflow, // 获得的计数器溢出标志, =TRUE:表示计数器已溢出, =FALSE:表示未溢出 PBOOL bBufferRefresh, // 获得的计数器缓冲更新标志, =TRUE:表示缓冲已被更新, =FALSE:表示未更新 PBOOL bBufferLost); // 获得的计数器缓冲丢失标志, =TRUE:表示缓冲已被丢失, =FALSE:表示未丢失 BOOL DEVAPI FAR PASCAL PCI8622_ClrDevStatusCNT( // 清除计数器状态 HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 BOOL bOverflow, // 是否清除计数器溢出标志, =TRUE:表示清除, =FALSE:表示不清除 BOOL bBufferRefresh, // 是否清除计数器缓冲更新标志, =TRUE:表示清除, =FALSE:表示不清除 BOOL bBufferLost); // 是否清除计数器缓冲丢失标志, =TRUE:表示清除, =FALSE:表示不清除 BOOL DEVAPI FAR PASCAL PCI8622_ReleaseDeviceCNT( // 释放和停止计数/定时器 HANDLE hDevice); // 设备对象句柄,它由CreateDevice函数创建 //####################### 数字I/O输入输出函数 ################################# // 用户可以使用WriteRegisterULong和ReadRegisterULong等函数直接控制寄存器进行I/O // 输入输出,但使用下面两个函数更省事,它不需要您关心寄存器分配和位操作等,而只 // 需象VB等语言的属性操作那么简单地实现各开关量通道的控制。 BOOL DEVAPI FAR PASCAL PCI8622_GetDeviceDI( // 取得数字量状态 HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 BYTE bDISts[16]); // 开关输入状态(注意: 必须定义为16个字节元素的数组) BOOL DEVAPI FAR PASCAL PCI8622_SetDeviceDO( // 输出数字量状态 HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 BYTE bDOSts[16]); // 开关输出状态(注意: 必须定义为16个字节元素的数组) BOOL DEVAPI FAR PASCAL PCI8622_RetDeviceDO( // 回读数字量输出状态 HANDLE hDevice, // 设备句柄 BYTE DISts[16]); // 获得开关输出状态(注意: 必须定义为16个字节元素的数组) //################# 内存映射寄存器直接操作及读写函数 ######################## // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的 // 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。 BOOL DEVAPI FAR PASCAL PCI8622_GetDeviceBar( // 取得指定的指定设备寄存器组BAR地址 HANDLE hDevice, // 设备对象句柄,它由CreateDevice函数创建 PUCHAR pbPCIBar[6]); // 返回PCI BAR所有地址,具体PCI BAR中有多少可用地址请看硬件说明书 BOOL DEVAPI FAR PASCAL PCI8622_WriteRegisterByte( // 往设备的映射寄存器空间指定端口写入单节字数据 HANDLE hDevice, // 设备对象 PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 ULONG OffsetBytes, // 相对于基地址的偏移位置 BYTE Value); // 往指定地址写入单字节数据(其地址由线性基地址和偏移位置决定) BOOL DEVAPI FAR PASCAL PCI8622_WriteRegisterWord( // 写双字节数据(其余同上) HANDLE hDevice, PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 ULONG OffsetBytes, WORD Value); BOOL DEVAPI FAR PASCAL PCI8622_WriteRegisterULong( // 写四节字数据(其余同上) HANDLE hDevice, PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 ULONG OffsetBytes, ULONG Value); BYTE DEVAPI FAR PASCAL PCI8622_ReadRegisterByte( // 读入单字节数据(其余同上) HANDLE hDevice, PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 ULONG OffsetBytes); WORD DEVAPI FAR PASCAL PCI8622_ReadRegisterWord( // 读入双字节数据(其余同上) HANDLE hDevice, PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 ULONG OffsetBytes); ULONG DEVAPI FAR PASCAL PCI8622_ReadRegisterULong( // 读入四字节数据(其余同上) HANDLE hDevice, PUCHAR pbLinearAddr, // 指定映射寄存器的线性基地址 ULONG OffsetBytes); //################# I/O端口直接操作及读写函数 ######################## // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的 // 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。 // 但这些函数主要适用于传统设备,如ISA总线、并口、串口等设备,不能用于本PCI设备 BOOL DEVAPI FAR PASCAL PCI8622_WritePortByte(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes, BYTE Value); BOOL DEVAPI FAR PASCAL PCI8622_WritePortWord(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes, WORD Value); BOOL DEVAPI FAR PASCAL PCI8622_WritePortULong(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes, ULONG Value); BYTE DEVAPI FAR PASCAL PCI8622_ReadPortByte(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes); WORD DEVAPI FAR PASCAL PCI8622_ReadPortWord(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes); ULONG DEVAPI FAR PASCAL PCI8622_ReadPortULong(HANDLE hDevice, PUCHAR pbPort, ULONG offserBytes); //########################### 附加操作函数 ###################################### HANDLE DEVAPI FAR PASCAL PCI8622_CreateSystemEvent(void); // 创建内核事件对象,供InitDeviceInt和VB子线程等函数使用 BOOL DEVAPI FAR PASCAL PCI8622_ReleaseSystemEvent(HANDLE hEvent); // 释放内核事件对象 #ifdef __cplusplus } #endif #endif // _PCI8622_DEVICE_