⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pm5320.cpp

📁 pm518采集卡驱动源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	WriteW(nAddr,9, 0x10); 
	for(i=15;i>-1;i--){
	/*将并行数据变成串行数据,同时保持LREG为高,CLK和CS为低*/
	 ov=0;ov=0x10|((nValue>>i)&1)|(((DAout[nCh]>>i)&1)<<1);
	 WriteW(nAddr,9, ov);
	 ov&=3;ov|=0x14;/*保持其它位不变,只是将CLK置高以产生时钟信号*/
	 WriteW(nAddr,9, ov);
	}
	/*产生加载数据信号*/
	WriteW(nAddr,9, 0x10|0x8);
	WriteW(nAddr,9, 0x8|0x4);	
	WriteW(nAddr,9, 0x10|0x8|0x4);
	ReadW(nAddr,6);
	}
	else
	{
	/*将DAC7625的LREG置高,CLK和CS置低*/
	WriteW(nAddr,9, 0x10); 
	for(i=15;i>-1;i--){
	/*将并行数据变成串行数据,同时保持LREG为高,CLK和CS为低*/
	 ov=0;ov=0x10|((DAout[nCh-4]>>i)&1)|(((nValue>>i)&1)<<1);
	 WriteW(nAddr,9, ov);
	 ov&=3;ov|=0x14;/*保持其它位不变,只是将CLK置高以产生时钟信号*/
	 WriteW(nAddr,9, ov);
	}
	/*产生加载数据信号*/
	WriteW(nAddr,9, 0x10|0x8);
	WriteW(nAddr,9, 0x8|0x4);	
	WriteW(nAddr,9, 0x10|0x8|0x4);
	ReadW(nAddr,6);
	}
	return ZT_SUCCESS;
}
///////////////////////////////////////////////////////


//////////////////以下是DIO的//////////////////////////

long _stdcall ZT_PM518_SetIOModeAll(unsigned long nAddr,\
									unsigned long nIOMode)
{
//函数功能:设置所有组开关量的输入输出模式
//入口参数:nAddr      板卡基地址
//          nIOMode    设置IO方式,bit0:group1, bit1:group2, bit2:group3
//									高为输出,低为输入
//函数返回值:
//             0 表示成功
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	if(nIOMode >7||nIOMode <0) return -1;
	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

		WriteW( nAddr, pm518.PM518_ROff_IOMode,nIOMode);
		
	return ZT_SUCCESS;
}



long _stdcall ZT_PM518_SetIOMode(unsigned long nAddr,\
					 unsigned long nGroup,\
					 unsigned long nIOMode)
{
//函数功能:设置某一组开关量的输入输出模式
//入口参数:nAddr      板卡基地址
//          nGroup     组号(1-3)共12组
//          nIOMode    设置IO方式,0 = 输入方式,1 = 输出方式
//函数返回值:
//             0 表示成功
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nGroup = nGroup - m_nCountFrom;
	if( nGroup > pm518.PM518_MaxIOGroup ) m_errorLevel = ERR_PARAMETER2;
	nIOMode = ( nIOMode != 0 ) ? 1 : 0;
	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

		unsigned short currIOMode;
		currIOMode = ReadW( nAddr, pm518.PM518_ROff_IOMode);
		currIOMode = (unsigned short)SetULongXBit( currIOMode, nGroup, nIOMode );
		//写工作方式字
		WriteW( nAddr, pm518.PM518_ROff_IOMode,currIOMode);
		
	return ZT_SUCCESS;
}



long _stdcall ZT_PM518_DIAll(unsigned long nAddr,\
				 unsigned long nGroup,\
				 unsigned long IOModeCheck)
{
//函数功能:得到某组中所有通道的开关量输入状态,注意每8个通道为一组
//入口参数:nAddr      板卡基地址
//          nGroup     组号(1-12)每8个通道为一组,共12组
//       IOModeCheck   设置是否检查IO工作方式与当前的操作相抵触
//                     0 = 不检查,1 = 检查
//函数返回值:
//                0 表示这组的8个通道输入全为低电平
//             0xFF 表示这组的8个通道输入全为高电平
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nGroup = nGroup - m_nCountFrom;
	if( nGroup > pm518.PM518_MaxIOGroup ) m_errorLevel = ERR_PARAMETER2;
	IOModeCheck = ( IOModeCheck != 0 ) ? 1 : 0;
	if( IOModeCheck != 0 )
	{
		//读当前工作方式字
		unsigned short currIOMode;
			currIOMode = ReadW( nAddr, pm518.PM518_ROff_IOMode);
			//如果某组设为输出状态,但调用此函数(输入),说明执行了错误的操作
			if( GetULongXBit( currIOMode, nGroup ) != 0 )
				m_errorLevel = ERR_FUNC_OPERATE;	
	}

	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

	unsigned short getVal;
	getVal = ReadW( nAddr, pm518.PM518_ROff_DIOGroup[nGroup] );
	return ( getVal ) & 0xFF;
		//>> ((nGroup % 2) * 8) ) & 0xFF;
}



long _stdcall ZT_PM518_DOAll(unsigned long nAddr,\
				 unsigned long nGroup,\
				 unsigned long nStateAll,\
				 unsigned long IOModeCheck)
{
//函数功能:设定某组的所有通道的开关量输出状态,每8个通道为一组
//入口参数:nAddr      板卡基地址
//          nGroup     组号(1-12)每8个通道为一组,共6组
//        nStateAll    指定某组中的所有通道的开关量输出状态
//                     例如:0 = 所有8个通道输出低电平,
//                        0xFF = 所有8个通道输出高电平
//       IOModeCheck   设置是否检查IO工作方式与当前的操作相抵触
//                     0 = 不检查,1 = 检查
//函数返回值:
//             0 表成功
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nGroup = nGroup - m_nCountFrom;
	if( nGroup > pm518.PM518_MaxIOGroup ) m_errorLevel = ERR_PARAMETER2;
	IOModeCheck = ( IOModeCheck != 0 ) ? 1 : 0;
	if( IOModeCheck != 0 )
	{
		//读当前工作方式字
		unsigned short currIOMode;
			currIOMode = ReadW( nAddr, pm518.PM518_ROff_IOMode);
			//如果某组设为输入状态,但调用此函数(输出),说明执行了错误的操作
			if( GetULongXBit( currIOMode, nGroup ) == 0 )
				m_errorLevel = ERR_FUNC_OPERATE;
	}

	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

	unsigned short getVal;
	getVal = ReadW( nAddr, pm518.PM518_ROff_DIOGroup[nGroup] );
	//设置开关量输出状态
	if( (nGroup % 2) != 0 )
	{
//		getVal = getVal & 0x00FF; //把高8位设为0
//		getVal = getVal + (unsigned char)nStateAll * 0x100; //把高8位设为用户设定值
		getVal = getVal & 0xFF00; //把低8位设为0
		getVal = getVal + (unsigned char)nStateAll; //把低8位设为用户设定值	
	}
	else
	{
		getVal = getVal & 0xFF00; //把低8位设为0
		getVal = getVal + (unsigned char)nStateAll; //把低8位设为用户设定值	
//		getVal = getVal & 0x00FF; //把高8位设为0
//		getVal = getVal + (unsigned char)nStateAll * 0x100; //把高8位设为用户设定值
	}
	WriteW( nAddr, pm518.PM518_ROff_DIOGroup[nGroup], getVal );
	return ZT_SUCCESS;
}



long _stdcall ZT_PM518_DOBit(unsigned long nAddr,\
				 unsigned long nGroup,\
				 unsigned long nBit,\
				 unsigned long nState,\
				 unsigned long IOModeCheck)
{
//函数功能:设定某组中某个通道的开关量输出状态,每8个通道为一组
//入口参数:nAddr      板卡基地址
//          nGroup     组号(1-12)每8个通道为一组,共12组
//          nBit       指定某组中的第几个通道(1-8),每组8个通道
//          nState     指定通道的开关量输出状态
//                     0 = 低电平,1 = 高电平
//       IOModeCheck   设置是否检查IO工作方式与当前的操作相抵触
//                     0 = 不检查,1 = 检查
//函数返回值:
//             0 表成功
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nGroup = nGroup - m_nCountFrom;
	if( nGroup > pm518.PM518_MaxIOGroup ) m_errorLevel = ERR_PARAMETER2;
	nBit = nBit - m_nCountFrom;
	if( nBit > pm518.PM518_MaxIOChannel ) m_errorLevel = ERR_PARAMETER_CH;
	nState = ( nState != 0 ) ? 1 : 0;
	IOModeCheck = ( IOModeCheck != 0 ) ? 1 : 0;
	if( IOModeCheck != 0 )
	{
		//读当前工作方式字
		unsigned short currIOMode;
			currIOMode = ReadW( nAddr, pm518.PM518_ROff_IOMode);
			//如果某组设为输入状态,但调用此函数(输出),说明执行了错误的操作
			if( GetULongXBit( currIOMode, nGroup ) == 0 )
			m_errorLevel = ERR_FUNC_OPERATE;
	}

	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

	//读出当前开关量输出状态
	unsigned short getVal;
	getVal = ReadW( nAddr, pm518.PM518_ROff_DIOGroup[nGroup] );
	getVal = (unsigned short)SetULongXBit( getVal, nBit, nState);
		//(nGroup % 2) * 8 + nBit, nState );
	//设置开关量输出状态
	WriteW( nAddr, pm518.PM518_ROff_DIOGroup[nGroup], getVal);
	return ZT_SUCCESS;
}



long _stdcall ZT_PM518_DIBit(unsigned long nAddr,\
				 unsigned long nGroup,\
				 unsigned long nBit,\
				 unsigned long IOModeCheck)
{
//函数功能:得到某组中某个通道的开关量输入状态,每8个通道为一组
//入口参数:nAddr      板卡基地址
//          nGroup     组号(1-12)每8个通道为一组,共12组
//          nBit       指定某组中的第几个通道(1-8),每组8个通道
//       IOModeCheck   设置是否检查IO工作方式与当前的操作相抵触
//                     0 = 不检查,1 = 检查
//函数返回值:
//             0 表示低电平
//             1 表示高电平
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nGroup = nGroup - m_nCountFrom;
	if( nGroup > pm518.PM518_MaxIOGroup ) m_errorLevel = ERR_PARAMETER2;
	nBit = nBit - m_nCountFrom;
	if( nBit > pm518.PM518_MaxIOChannel ) m_errorLevel = ERR_PARAMETER_CH;
	IOModeCheck = ( IOModeCheck != 0 ) ? 1 : 0;
	if( IOModeCheck != 0 )
	{
		//读当前工作方式字
		unsigned short currIOMode;
			currIOMode = ReadW( nAddr, pm518.PM518_ROff_IOMode);
			//如果某组设为输出状态,但调用此函数(输入),说明执行了错误的操作
			if( GetULongXBit( currIOMode, nGroup ) != 0 )
			m_errorLevel = ERR_FUNC_OPERATE;
	
	}

	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

	unsigned short getVal;
	getVal = ReadW( nAddr, pm518.PM518_ROff_DIOGroup[nGroup] );
	return GetULongXBit( getVal, nBit);
		//(nGroup % 2) * 8 + nBit );
}
///////////////////////////////////////////////////////


///////////////////FIFO//////////////////////////////////

long _stdcall ZT_PM518GetFIFOstatus(unsigned long nAddr)
{
//函数功能:查询FIFO状态
//入口函数:
//         nAddr  :板卡基地址
//返回值:返回大于 0 的数表成功:
//        0 表FIFO空,
//        1 表FIFO非空但不到半满
//        2 表FIFO半满
//        3 表FIFO全满  
//        4 表未知状态  
//返回 -1表失败,函数调用失败时应进一步调用 GetDll_LastErrNO 判断出错原因

	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;
	//读当前控制寄存器的状态
	unsigned short regStatus = ReadW( nAddr, pm518.AIW.PM518_ROff_ADctrlReg);
	regStatus = regStatus & 0xE000;
	long retVal = 0;
	switch(regStatus)
	{
		case 0x6000:
			retVal = 0;
			break;
		case 0xE000:
			retVal = 1;
			break;
		case 0xA000:
			retVal = 2;
			break;
		case 0x8000:
			retVal = 3;
			break;	
		default:
			retVal = 4;
	}
	return retVal;
}


long _stdcall ZT_PM518ClearFIFO(unsigned long nAddr)
{
//函数功能:清空FIFO,同时使能外部FIFO,但如果内部FIFO有效,内部FIFO优先,而外部FIFO仍然无效
//入口函数:
//         nAddr  :板卡基地址
//返回值:0表成功,-1表失败,函数调用失败时应进一步调用 GetDll_LastErrNO 判断出错原因

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -