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

📄 zlg500c.c

📁 RC5000读卡芯片和LPC213X的源码参考程序 内含详细说明
💻 C
字号:
#define zlg500c_GLOBALS
#include "config.h"

static uint8 SEQ = 0;
static uint8 const FindDlyTab[BAUD_CNT] = { 9,5,3,2,2,2,2,1,1 };

uint8 Zlg500c_Cmd(uint8 Addr)
{
	uint8 Status;
		
	SerBfr[CMDTYPE] |= SEQ;
	
	while(Ser_Send(Addr) == FALSE);
	
	WAITRESPDLY = 20;		//延时100ms

	while(!SerDTValid && WAITRESPDLY);	//等待响应
	
	if(!SerDTValid)
	{
		Status = COMMERR;
	}
	else
	{
		SerDTValid = FALSE;
		if(SEQ == (SerBfr[CMDTYPE]&0xf0))
		{
			if(Addr == SerBfr[SADDR] || Addr == 0xff)
				Status = OK;
			else
				Status = ADDRERR;
		}
		else
			Status = SEQERR;
		SEQ += 0x10;
	}

	return Status;
}

#if GetDvcSnr_en
uint8 GetDvcSnr(uint8 *DvcSnr)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 0;
	SerBfr[COMMAND] = 'A';
	SerBfr[LENGTH] = 0;
	
	Status = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
			memcopy(DvcSnr,&SerBfr[DATA],4);
	}
	return Status;
}
#endif

#if SetSlvAddr_en
uint8 SetSlvAddr(uint8 NewAddr,uint8 *DvcSnr)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 0;
	SerBfr[COMMAND] = 'B';
	SerBfr[LENGTH] = 5;
	memcopy(&SerBfr[DATA],DvcSnr,4);
	SerBfr[DATA+4] = NewAddr;
	
	Status = Zlg500c_Cmd(0xff);
	
	if(Status == OK)
	{
		return SerBfr[STATUS];
	}
	return Status;
}
#endif

#if GetSlvAddr_en
uint8 GetSlvAddr(uint8 *Addr,uint8 *DvcSnr)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 0;
	SerBfr[COMMAND] = 'C';
	SerBfr[LENGTH] = 4;
	memcopy(&SerBfr[DATA],DvcSnr,4);
	
	Status = Zlg500c_Cmd(0xff);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
			*Addr = SerBfr[DATA];
	}
	return Status;
}
#endif

#if SetBaud_en
uint8 SetBaud(uint8 NewBaud)
{
	uint8 bak;
	
	SerBfr[CMDTYPE] = SEQ;
	SerBfr[COMMAND] = 'D';
	SerBfr[LENGTH] = 1;
	SerBfr[DATA] = NewBaud;
	
	while(Ser_Send(0xff) == FALSE);
	while(SendStatus != SENDIDLE);
	
	/* 设置波特率,注意不要改变串口原来的数据格式 */
	U0LCR = 0x80;				// DLAB=1
	bak  = (Fpclk/16)/BaudRateTable[BaudNum];
	U0DLM = bak/256;
	U0DLM = bak%256;
	U0LCR = 0x03;	
	
	SEQ += 0x10;
	return OK;
}
#endif

#if FindSlv_en
uint8 FindSlv(uint8 SAddr,uint8 EAddr,uint8 *SlvNum,uint8 *SlvBfr)
{
	uint8 FSlvNum = EAddr-SAddr+1;
	
	*SlvNum = 0;
	SerBfr[CMDTYPE] = SEQ;
	SerBfr[COMMAND] = 'E';
	SerBfr[LENGTH] = 2;
	SerBfr[DATA] = SAddr;
	SerBfr[DATA+1] = EAddr;
	
	while(Ser_Send(0xff) == FALSE);
	while(SendStatus != SENDIDLE);
	
	WAITRESPDLY = FindDlyTab[BaudNum];
	while(WAITRESPDLY);
	WAITRESPDLY = FindDlyTab[BaudNum];
	
	while(1)
	{
		if(SerDTValid)
		{
			if(SEQ == SerBfr[CMDTYPE])
			{
				if(SerBfr[STATUS] == 0)
				{
					SlvBfr[SerBfr[SADDR]>>3] |= 0x01<<(SerBfr[SADDR]&0x07);
					(*SlvNum)++;
				}
			}
			SerDTValid = FALSE;
		}
		if(WAITRESPDLY == 0)
		{
			FSlvNum--;
			if(FSlvNum == 0)	break;
			WAITRESPDLY = FindDlyTab[BaudNum];
		}
	}

	SEQ += 0x10;
	return OK;
}
#endif

#if GetDvcInfo_en
uint8 GetDvcInfo(uint8 *DvcInfo)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'A';
	SerBfr[LENGTH] = 0;
	
	Status = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
			memcopy(DvcInfo,&SerBfr[DATA],SerBfr[LENGTH]);
	}
	return Status;
}
#endif

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

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

#if PCDType_en
uint8 PCDType(uint8 ISOType)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'D';
	SerBfr[LENGTH] = 1;
	SerBfr[DATA] = ISOType;
	
	Status = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

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

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

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

#if DvcReadIO_en
uint8 DvcReadIO(uint8 *IOValue)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'H';
	SerBfr[LENGTH] = 0;
	
	Status = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
			*IOValue = SerBfr[DATA];
	}
	return Status;
}
#endif

#if DvcClearIO_en
uint8 DvcClearIO(uint8 ClrMask,uint8 _10ms)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'I';
	SerBfr[LENGTH] = 2;
	SerBfr[DATA] = ClrMask;
	SerBfr[DATA+1] = _10ms;
	
	Status = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if DvcSetIO_en
uint8 DvcSetIO(uint8 SetMask,uint8 _10ms)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'J';
	SerBfr[LENGTH] = 2;
	SerBfr[DATA] = SetMask;
	SerBfr[DATA+1] = _10ms;
	
	Status = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if DvcSurgeIO_en
uint8 DvcSurgeIO(uint8 IOMask,uint8 SIOSta,uint8 EIOSta,uint8 FstSta1_10ms,
					uint8 FstSta2_10ms,uint8 Sta1_10ms,uint8 Sta2_10ms,uint8 RptCnt)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'K';
	SerBfr[LENGTH] = 8;
	SerBfr[DATA] = IOMask;
	SerBfr[DATA+1] = SIOSta;
	SerBfr[DATA+2] = EIOSta;
	SerBfr[DATA+3] = FstSta1_10ms;
	SerBfr[DATA+4] = FstSta2_10ms;
	SerBfr[DATA+5] = Sta1_10ms;
	SerBfr[DATA+6] = Sta2_10ms;
	SerBfr[DATA+7] = RptCnt;
	
	Status = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if DvcSetAutoDctct_en
uint8 DvcSetAutoDctct(uint8 ISOType,uint8 Req_Code,
				uint8 IOClrMask,uint8 IOSetMask,uint8 Ser_Mode)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'L';
	SerBfr[LENGTH] = 5;
	SerBfr[DATA] = ISOType;
	SerBfr[DATA+1] = Req_Code;
	SerBfr[DATA+2] = IOClrMask;
	SerBfr[DATA+3] = IOSetMask;
	SerBfr[DATA+4] = Ser_Mode;
	
	Status = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if ExchangeBlock_en
uint8 ExchangeBlock(uint8 *Send_Bfr,
					uint8 Send_Byte_Len,
					uint8 *Rcv_Bfr,
					uint8 *Rcv_Byte_Len,
					uint8 Append_CRC,
					uint8 FWI)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 1;
	SerBfr[COMMAND] = 'M';
	SerBfr[LENGTH] = Send_Byte_Len+3;
	SerBfr[DATA] = Append_CRC;
	SerBfr[DATA+1] = FWI;
	SerBfr[DATA+2] = Send_Byte_Len;
	memcopy(&SerBfr[DATA+3],Send_Bfr,Send_Byte_Len);
	
	Status = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
		{
			*Rcv_Byte_Len = SerBfr[DATA];
			memcopy(Rcv_Bfr,&SerBfr[DATA+1],*Rcv_Byte_Len);
		}
	}
	return Status;
}
#endif

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

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

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

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

#if PiccAuthE2_en
uint8 PiccAuthE2(uint8 KeyAB,uint8 *PiccSnr,uint8 SecNr,uint8 Block)
{
	uint8 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 = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccAuthKey_en
uint8 PiccAuthKey(uint8 KeyAB,uint8 *PiccSnr,uint8 *Key,uint8 Block)
{
	uint8 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 = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

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

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

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

#if PiccValue_en
uint8 PiccValue(uint8 Mode,uint8 Block,uint8 *Value,uint8 TransBlock)
{
	uint8 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 = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccValueDebit_en
uint8 PiccValueDebit(uint8 Mode,uint8 Block,uint8 *Value)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'K';
	SerBfr[LENGTH] = 6;
	SerBfr[DATA] = Mode;
	SerBfr[DATA+1] = Block;
	memcopy(&SerBfr[DATA+2],Value,4);
		
	Status = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

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

#if PiccActiveTypeA_en
uint8 PiccActiveTypeA(	uint8 BaudRate,
						uint8 Req_Code,
						uint8 *Atq,
						uint8 *Ats,
						uint8 *PiccSnrLen,
						uint8 *PiccSnr	)
{
	uint8 Status;
	
	SerBfr[CMDTYPE] = 2;
	SerBfr[COMMAND] = 'M';
	SerBfr[LENGTH] = 2;
	SerBfr[DATA] = BaudRate;
	SerBfr[DATA+1] = Req_Code;
		
	Status = Zlg500c_Cmd(SlvAddr);
	
	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





⌨️ 快捷键说明

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