#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] =
评论0