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

📄 zlg500s.c

📁 内部包含多个文件:main.c,config.c,zlg500s.h zlg500s.c等。对于zlg500s开发板的使用
💻 C
字号:
#define Zlg500S_GLOBALS
#include "config.h"
#include "Zlg500S.h"
#include "zlg500S_comm.h"

static void memcopy(INT8U *DBfr,INT8U *SBfr,INT8U Len);
static INT8U SEQ = 0xf0;	//包号,见通信协议

INT8U Zlg500S_Cmd()
{
	INT8U Status;
	
	SEQ += 0x10;
	SerBfr[CMDTYPE] |= SEQ;		//命令类型与包号组成一个字节
	
	Status = Ser_Send();

	if(!Status)	
		return COMMERR;
		
	WaitRespDly = ZLG500S_DELAY_500ms;		//延时500ms
	while(WaitRespDly)		//等待响应
	{
		if(Ser_Rcv())
			break;
	}

	if(WaitRespDly == 0)
	{					//100ms内未收到响应
		Status = COMMERR;
	}
	else
	{	
		if(SEQ == (SerBfr[CMDTYPE]&0xf0))
		{				//包号匹配
			Status = OK;
		}
		else
			Status = SEQERR;	//包号不匹配
	}
	return Status;
}

#if GetDvcInfo_en
INT8U GetDvcInfo(INT8U *DvcInfo)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'A';

	SerBfr[LENGTH] = 0;
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
			memcopy(DvcInfo,&SerBfr[DATA],SerBfr[LENGTH]);
	}
	return Status;
}
#endif

#if PCDConfig_en
INT8U PCDConfig()
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'B';
	SerBfr[LENGTH] = 0;
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PCDClose_en
INT8U PCDClose()
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'C';
	SerBfr[LENGTH] = 0;
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PCDLoadKey_en
INT8U PCDLoadKey(INT8U KEYAB,INT8U SecNr,INT8U *Key)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'E';
	SerBfr[LENGTH] = 8;
	SerBfr[DATA] = KEYAB;
	SerBfr[DATA+1] = SecNr;
	memcopy(&SerBfr[DATA+2],Key,6);
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PCDWriteReg_en
INT8U PCDWriteReg(INT8U RegAddr,INT8U RegValue)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'F';
	SerBfr[LENGTH] = 2;
	SerBfr[DATA] = RegAddr;
	SerBfr[DATA+1] = RegValue;
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PCDReadReg_en
INT8U PCDReadReg(INT8U RegAddr,INT8U *RegValue)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'G';
	SerBfr[LENGTH] = 1;
	SerBfr[DATA] = RegAddr;
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
			*RegValue = SerBfr[DATA];
	}
	return Status;
}
#endif

#if PiccRequest_en
INT8U PiccRequest(INT8U Req_Code,INT8U *TagType)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'A';
	SerBfr[LENGTH] = 1;
	SerBfr[DATA] = Req_Code;
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
		{
			*TagType = SerBfr[DATA];
			*(TagType+1) = SerBfr[DATA+1];
		}
	}
	return Status;
}
#endif

#if PiccAnticoll_en
INT8U PiccAnticoll(INT8U Sel_Code,INT8U Bcnt,INT8U *PiccSnr)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'B';
	SerBfr[LENGTH] = 2;
	SerBfr[DATA] = Sel_Code;
	SerBfr[DATA+1] = Bcnt;
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
		{
			memcopy(PiccSnr,&SerBfr[DATA],4);
		}
	}
	return Status;
}
#endif

#if PiccSelect_en
INT8U PiccSelect(INT8U Sel_Code,INT8U *PiccSnr,INT8U *Sak)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'C';
	SerBfr[LENGTH] = 5;
	SerBfr[DATA] = Sel_Code;
	memcopy(&SerBfr[DATA+1],PiccSnr,4);
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
		{
			*Sak = SerBfr[DATA];
		}
	}
	return Status;
}
#endif

#if PiccHalt_en
INT8U PiccHalt()
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'D';
	SerBfr[LENGTH] = 0;
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccAuthE2_en
INT8U PiccAuthE2(INT8U KeyAB,INT8U *PiccSnr,INT8U SecNr,INT8U Block)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'E';
	SerBfr[LENGTH] = 7;
	SerBfr[DATA] = KeyAB;
	memcopy(&SerBfr[DATA+1],PiccSnr,4);
	SerBfr[DATA+5] = SecNr;
	SerBfr[DATA+6] = Block;	

	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccAuthKey_en
INT8U PiccAuthKey(INT8U KeyAB,INT8U *PiccSnr,INT8U *Key,INT8U Block)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'F';
	SerBfr[LENGTH] = 12;
	SerBfr[DATA] = KeyAB;
	memcopy(&SerBfr[DATA+1],PiccSnr,4);
	memcopy(&SerBfr[DATA+5],Key,4);
	SerBfr[DATA+11] = Block;	

	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccRead_en
INT8U PiccRead(INT8U Block,INT8U *Bfr)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'G';
	SerBfr[LENGTH] = 1;
	SerBfr[DATA] = Block;
		
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
		{
			memcopy(Bfr,&SerBfr[DATA],16);
		}
	}
	return Status;
}
#endif

#if PiccWrite_en
INT8U PiccWrite(INT8U Block,INT8U *Bfr)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'H';
	SerBfr[LENGTH] = 17;
	SerBfr[DATA] = Block;
	memcopy(&SerBfr[DATA+1],Bfr,16);
		
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccULWrite_en
INT8U PiccULWrite(INT8U Block,INT8U *Bfr)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'I';
	SerBfr[LENGTH] = 5;
	SerBfr[DATA] = Block;
	memcopy(&SerBfr[DATA+1],Bfr,16);
		
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccValue_en
INT8U PiccValue(INT8U Mode,INT8U Block,INT8U *Value,INT8U TransBlock)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'J';
	SerBfr[LENGTH] = 7;
	SerBfr[DATA] = Mode;
	SerBfr[DATA+1] = Block;
	memcopy(&SerBfr[DATA+2],Value,4);
	SerBfr[DATA+6] = TransBlock;
		
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccReset_en
INT8U PiccReset(INT8U _1ms)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'L';
	SerBfr[LENGTH] = 1;
	SerBfr[DATA] = _1ms;
			
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccActiveTypeA_en
INT8U PiccActiveTypeA(	INT8U BaudRate,
						INT8U Req_Code,
						INT8U *Atq,
						INT8U *Ats,
						INT8U *PiccSnrLen,
						INT8U *PiccSnr	)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'M';
	SerBfr[LENGTH] = 2;
	SerBfr[DATA] = BaudRate;
	SerBfr[DATA+1] = Req_Code;
		
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
		{
			*Atq = SerBfr[DATA];
			*(Atq+1) = SerBfr[DATA+1];
			*Ats = SerBfr[DATA+2];
			*PiccSnrLen = SerBfr[DATA+3];
			memcopy(PiccSnr,&SerBfr[DATA+4],*PiccSnrLen);
		}
	}
	return Status;
}
#endif

#if PiccAutoDetect_en
INT8U PiccAutoDetect(INT8U OutMode,  INT8U TxMode, INT8U Req_Code, 
					 INT8U AuthMode, INT8U KEYAB,  INT8U *Key, INT8U Block)
{
	INT8U Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'N';

	if(AuthMode == 0)
		SerBfr[LENGTH] = 4;
	else
	{	SerBfr[DATA+4] = KEYAB;
		if(AuthMode == 'E')
		{
			SerBfr[DATA+5] = *Key;
			SerBfr[DATA+6] = Block;
			SerBfr[LENGTH] = 7;
		}
		else if(AuthMode == 'F')
		{
			memcopy(&SerBfr[DATA+5],Key,6);
			SerBfr[DATA+11] = Block;
			SerBfr[LENGTH] = 12;
		}
		else
			return COMMERR;
	}

	SerBfr[DATA] = OutMode;
	SerBfr[DATA+1] = TxMode;
	SerBfr[DATA+2] = Req_Code;
	SerBfr[DATA+3] = AuthMode;
	
	Status = Zlg500S_Cmd();
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccADRcv_en
/***********************************************************************************
模块产生中断后,直接读取数据
输入:	无
输出:	TxDrv——TX驱动,0x01——仅TX1,0x02——仅TX2,0x03——TX1、TX2全驱动
		TagType——目标类型,同PiccRequest函数
		Sak——选择应答,同PiccSelect函数
		Snr——序列号,,同PiccSelect函数
		DTBfr——块数据首址
返回:	0——成功,其它值——失败
***********************************************************************************/
INT8U PiccADRcv(INT8U *TxDrv,INT8U *TagType,INT8U *Sak,INT8U *Snr,INT8U *DTBfr)
{
	INT8U Status = 0xff;

	if(Ser_Rcv())
	{	
		if(SEQ == (SerBfr[CMDTYPE]&0xf0))
		{				//包号匹配
			Status = OK;
		}
		else
			Status = SEQERR;	//包号不匹配

		if(Status == OK)
		{
			Status = SerBfr[STATUS];
			if(Status == OK)
			{
				*TxDrv = SerBfr[DATA];
				TagType[0] = SerBfr[DATA+1];
				TagType[1] = SerBfr[DATA+2];
				*Sak = SerBfr[DATA+3];
				memcopy(Snr,&SerBfr[DATA+5],SerBfr[DATA+4]);
				if(DTBfr != 0)
					memcopy(DTBfr,&SerBfr[DATA+5+SerBfr[DATA+4]],16);
			}
		}
	}
	return Status;
}
#endif

#if PiccReadADDT_en
/***********************************************************************************
发送读自动检测命令
输入:	Mode:0x00——停止检测,0x01——继续检测
输出:	TxDrv——TX驱动,0x01——仅TX1,0x02——仅TX2,0x03——TX1、TX2全驱动
		TagType——目标类型,同PiccRequest函数
		Sak——选择应答,同PiccSelect函数
		Snr——序列号,,同PiccSelect函数
		DTBfr——块数据首址
返回:	0——成功,
		-1——未检测到卡
		-100——未进入自动检测
		其它值——失败
***********************************************************************************/
INT8U PiccReadADDT(INT8U Mode,INT8U *TxDrv,INT8U *TagType,INT8U *Sak,INT8U *Snr,INT8U *DTBfr)	//若DTBfr为空,则表示不读扇区数据
{
	INT8U Status;

	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'O';
	SerBfr[LENGTH] = 1;
	SerBfr[DATA] = Mode;
	
	Status = Zlg500S_Cmd();

	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
		{
			*TxDrv = SerBfr[DATA];
			TagType[0] = SerBfr[DATA+1];
			TagType[1] = SerBfr[DATA+2];
			*Sak = SerBfr[DATA+3];
			memcopy(Snr,&SerBfr[DATA+5],SerBfr[DATA+4]);
			if(DTBfr != 0)
				memcopy(DTBfr,&SerBfr[DATA+5+SerBfr[DATA+4]],16);
		}
	}

	return Status;
}
#endif

void memcopy(INT8U *DBfr,INT8U *SBfr,INT8U Len)
{
	INT8U i;

	for(i=0;i<Len;i++)
	{
		DBfr[i] = SBfr[i];
	}
}

⌨️ 快捷键说明

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