Files
EF3-Interface/PcDmis/Base/Interfac/Msi/Hsi/ART/PCI8622.h
T
2014-04-29 18:13:54 +08:00

337 lines
18 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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; // 010000mV
const long PCI8622_INPUT_0_P5000mV = 0x04; // 05000mV
//***********************************************************
// 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_