📄 zlg500c.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 + -