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

📄 zlg500c.c

📁 ZLG500的应用软件
💻 C
字号:
#define zlg500c_GLOBALS
#include "main.h"
#include "UART.h"
#include "zlg500c.h"
#include "delay.h"

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

INT8U Zlg500c_Cmd(INT8U Addr)
{
	INT8U 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
INT8U GetDvcSnr(INT8U *DvcSnr)
{
	INT8U 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
INT8U SetSlvAddr(INT8U NewAddr,INT8U *DvcSnr)
{
	INT8U 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
INT8U GetSlvAddr(INT8U *Addr,INT8U *DvcSnr)
{
	INT8U 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
INT8U SetBaud(INT8U NewBaud)
{
	SerBfr[CMDTYPE] = SEQ;
	SerBfr[COMMAND] = 'D';
	SerBfr[LENGTH] = 1;
	SerBfr[DATA] = NewBaud;
	
	while(Ser_Send(0xff) == FALSE);
	while(SendStatus != SENDIDLE);
	
	TR0 = FALSE;
	TH1=BaudRateTable[NewBaud];
	TL1=BaudRateTable[NewBaud];
	TR1 = 1;
	
	SEQ += 0x10;
	return OK;
}
#endif

#if FindSlv_en
INT8U FindSlv(INT8U SAddr,INT8U EAddr,INT8U *SlvNum,INT8U *SlvBfr)
{
	INT8U 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
INT8U GetDvcInfo(INT8U *DvcInfo)
{
	INT8U 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
INT8U PCDConfig()
{
	INT8U 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
INT8U PCDClose()
{
	INT8U 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
INT8U PCDType(INT8U ISOType)
{
	INT8U 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
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 = Zlg500c_Cmd(SlvAddr);
	
	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 = Zlg500c_Cmd(SlvAddr);
	
	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 = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
		if(Status == OK)
			*RegValue = SerBfr[DATA];
	}
	return Status;
}
#endif

#if DvcReadIO_en
INT8U DvcReadIO(INT8U *IOValue)
{
	INT8U 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
INT8U DvcClearIO(INT8U ClrMask,INT8U _10ms)
{
	INT8U 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
INT8U DvcSetIO(INT8U SetMask,INT8U _10ms)
{
	INT8U 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
INT8U DvcSurgeIO(INT8U IOMask,INT8U SIOSta,INT8U EIOSta,INT8U FstSta1_10ms,
					INT8U FstSta2_10ms,INT8U Sta1_10ms,INT8U Sta2_10ms,INT8U RptCnt)
{
	INT8U 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
INT8U DvcSetAutoDctct(INT8U ISOType,INT8U Req_Code,
				INT8U IOClrMask,INT8U IOSetMask,INT8U Ser_Mode)
{
	INT8U 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
INT8U ExchangeBlock(INT8U *Send_Bfr,
					INT8U Send_Byte_Len,
					INT8U *Rcv_Bfr,
					INT8U *Rcv_Byte_Len,
					INT8U Append_CRC,
					INT8U FWI)
{
	INT8U 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
INT8U PiccRequest(INT8U Req_Code,INT8U *TagType)
{
	INT8U 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
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 = Zlg500c_Cmd(SlvAddr);
	
	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 = Zlg500c_Cmd(SlvAddr);
	
	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 = Zlg500c_Cmd(SlvAddr);
	
	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 = Zlg500c_Cmd(SlvAddr);
	
	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 = Zlg500c_Cmd(SlvAddr);
	
	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 = Zlg500c_Cmd(SlvAddr);
	
	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 = Zlg500c_Cmd(SlvAddr);
	
	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 = Zlg500c_Cmd(SlvAddr);
	
	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 = Zlg500c_Cmd(SlvAddr);
	
	if(Status == OK)
	{
		Status = SerBfr[STATUS];
	}
	return Status;
}
#endif

#if PiccValueDebit_en
INT8U PiccValueDebit(INT8U Mode,INT8U Block,INT8U *Value)
{
	INT8U 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
INT8U PiccReset(INT8U _1ms)
{
	INT8U 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
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 = 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 + -