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