📄 main.c
字号:
if (MI_OK == PcdTransfer(g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机TYPEA卡高级复位命令
/////////////////////////////////////////////////////////////////////
void ComTypeARst()
{
unsigned char status,i;
i = (FSDI << 4) & 0xF0;
status = PcdRequest(g_cReceBuf[6], &g_cReceBuf[0]);
if (status != MI_OK)
{ status = PcdRequest(g_cReceBuf[6], &g_cReceBuf[0]); }
if (status == MI_OK)
{ status = PcdAnticoll(&g_cReceBuf[1]); }
if (status == MI_OK)
{ status = PcdSelect(&g_cReceBuf[1], &g_cReceBuf[6]); }
if (status == MI_OK)
{ status = MifareProRst(i, &g_cReceBuf[0], &g_cReceBuf[5]); }
if (status == MI_OK)
{
g_cFWI = g_cReceBuf[8]>>4; //0xff;//
g_cReceBuf[0] += 4;
g_cCidNad = 0;//(g_cReceBuf[9] & 0x03) << 2;
AnswerOk(&g_cReceBuf[1], g_cReceBuf[0]);
}
else
{ AnswerErr(FAULT21); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO14443-4卡COS命令
/////////////////////////////////////////////////////////////////////
void ComTypeACOS()
{
g_cReceBuf[0] -= 5;
if (MI_OK == MifareProCom(g_cCidNad, g_cFWI, &g_cReceBuf[0], &g_cReceBuf[6]))
{ AnswerOk(&g_cReceBuf[6], g_cReceBuf[0]); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机T=CL卡退出激活状态命令
/////////////////////////////////////////////////////////////////////
void ComCL_Deselect()
{
if (MI_OK == CL_Deselect(0))
{ AnswerCommandOk(); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//正确执行完上位机指令,应答(无返回数据)
/////////////////////////////////////////////////////////////////////
void AnswerCommandOk()
{
unsigned char i,chkdata;
chkdata = 0;
TI = 0; //发送命令头
SBUF = 0xAA;
while (!TI);
TI = 0;
SBUF = 0xBB;
while (!TI);
TI = 0; //发送长度字
SBUF = 0x06;
while (!TI);
TI = 0;
SBUF = 0x00;
while (!TI);
TI = 0; //发送设备标识
SBUF = g_cIcdevH;
while (!TI);
if (g_cIcdevH == 0xAA)
{
TI = 0;
SBUF = 0;
while (!TI);
}
TI = 0;
SBUF = g_cIcdevL;
while (!TI);
if (g_cIcdevL == 0xAA)
{
TI = 0;
SBUF = 0;
while (!TI);
}
TI = 0; //发送命令码
i = (unsigned char)(g_cCommand & 0xFF);
SBUF = i;
chkdata ^= i;
while (!TI);
TI = 0; //发送命令码
i = (unsigned char)((g_cCommand >>8) & 0xFF);
SBUF = i;
chkdata ^= i;
while (!TI);
TI = 0; //发送状态字
SBUF = 0;
while (!TI);
TI = 0; //发送效验字
chkdata ^= g_cIcdevH^ g_cIcdevL;
SBUF = chkdata;
while (!TI);
if (chkdata == 0xAA)
{
TI = 0;
SBUF = 0;
while (!TI);
}
TI = 0;
ES = 1;
}
/////////////////////////////////////////////////////////////////////
//正确执行完上位机指令,应答(有返回数据)
//input:answerdata = 应答数据
// answernum = 数据长度
/////////////////////////////////////////////////////////////////////
void AnswerOk(unsigned char *answerdata, unsigned int answernum)
{
unsigned char chkdata;
unsigned int i;
TI = 0; //发送命令头
SBUF = 0xAA;
while (!TI);
TI = 0;
SBUF = 0xBB;
while (!TI);
TI = 0; //长度字,包括状态字和效验字
chkdata = (((unsigned char)((answernum + 6) & 0xFF)));
SBUF = chkdata;
while (!TI);
TI = 0;
chkdata = (((unsigned char)(((answernum + 6)>>8) & 0xFF)));
SBUF = chkdata;
while (!TI);
TI = 0; //发送设备标识
SBUF = g_cIcdevH;
while(!TI);
if (g_cIcdevH == 0xAA)
{
TI = 0;
SBUF = 0;
while (!TI);
}
TI = 0;
SBUF = g_cIcdevL;
while(!TI);
if (g_cIcdevL == 0xAA)
{
TI = 0;
SBUF = 0;
while (!TI);
}
TI = 0; //发送命令码
i = (unsigned char)(g_cCommand & 0xFF);
SBUF = i;
chkdata ^= i;
while (!TI);
TI = 0; //发送命令码
i = (unsigned char)((g_cCommand >>8) & 0xFF);
SBUF = i;
chkdata ^= i;
while (!TI);
TI = 0; //状态字
SBUF = 0;
while (!TI);
chkdata ^= g_cIcdevH ^ g_cIcdevL;
for (i=0; i<answernum; i++)
{
TI = 0;
chkdata ^= *(answerdata+i);
SBUF = *(answerdata+i);
while (!TI);
if (*(answerdata + i) == 0xAA)
{
TI = 0;
SBUF = 0;
while (!TI);
}
}
TI = 0; //效验字
SBUF = chkdata;
while(!TI);
if (chkdata == 0xAA)
{
TI=0;
SBUF=0;
while (!TI);
}
TI = 0;
ES = 1;
}
/////////////////////////////////////////////////////////////////////
//未能正确执行上位机指令,应答
//input:faultcode = 错误代码
/////////////////////////////////////////////////////////////////////
void AnswerErr(char faultcode)
{
unsigned char i,chkdata;
chkdata = 0;
TI = 0; //发送命令头
SBUF = 0xAA;
while (!TI);
TI = 0;
SBUF = 0xBB;
while (!TI);
TI = 0; //发送长度字
SBUF = 0x06;
while (!TI);
TI = 0;
SBUF = 0x00;
while (!TI);
TI = 0; //发送设备标识
SBUF = g_cIcdevH;
while (!TI);
if (g_cIcdevH == 0xAA)
{
TI = 0;
SBUF = 0;
while (!TI);
}
TI = 0;
SBUF = g_cIcdevL;
while (!TI);
if (g_cIcdevL == 0xAA)
{
TI = 0;
SBUF = 0;
while (!TI);
}
TI = 0; //发送命令码
i = (unsigned char)(g_cCommand & 0xFF);
SBUF = i;
chkdata ^= i;
while (!TI);
TI = 0; //发送命令码
i = (unsigned char)((g_cCommand >>8) & 0xFF);
SBUF = i;
chkdata ^= i;
while (!TI);
TI = 0; //发送错误代码
SBUF = faultcode;
while (!TI);
chkdata = g_cIcdevH ^ g_cIcdevL ^ faultcode;
TI = 0; //效验字
SBUF = chkdata;
while (!TI);
TI = 0;
ES = 1;
}
/////////////////////////////////////////////////////////////////////
//串行中断,接收上位机数据
/////////////////////////////////////////////////////////////////////
seri_int () interrupt 4 using 1
{
unsigned int i,j;
unsigned char rece_data = SBUF;
unsigned char verify = 0;
if (RI)
{
RI = 0;
if (g_bReceAA)
{
g_bReceAA = 0;
switch (rece_data)
{
case 0x00:
break;
case 0xBB:
g_cReceNum = 0;
break;
default:
i = g_cReceNum;
g_cReceBuf[i] = rece_data;
break;
}
}
else
{
switch (rece_data)
{
case 0xAA:
g_bReceAA = 1;
default:
i = g_cReceNum++;
g_cReceBuf[i] = rece_data;
break;
}
}
i = (((unsigned int)(g_cReceBuf[1]<<8)) + (unsigned int)(g_cReceBuf[0]));
if ((g_cReceNum == i + 2) && ( i != 0 ))
{
for (j=1; j<g_cReceNum; j++)
{ verify ^= g_cReceBuf[j]; }
if (!verify)
{
g_bReceOk = 1;
g_cCommand = (((unsigned int)(g_cReceBuf[5]<<8)) + (unsigned int)(g_cReceBuf[4]));
g_bReceAA = 0;
ES = 0;
}
}
if (g_cReceNum >= sizeof(g_cReceBuf))
{ g_cReceNum=0; }
}
if (TI)
{ TI = 0; }
}
/////////////////////////////////////////////////////////////////////
//用T2做延时子程序
/////////////////////////////////////////////////////////////////////
void DelayMs(unsigned int _MS)
{
RCAP2LH = RCAP2_1ms;
T2LH = RCAP2_1ms;
ET2 = 0; // Disable timer2 interrupt
T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
TR2 = 1;
while (_MS--)
{ while (!TF2);TF2 = 0; }
TR2 = 0;
}
void Delay_50us(unsigned char _50us)
{
RCAP2LH = RCAP2_50us;
T2LH = RCAP2_50us;
ET2 = 0; // Disable timer2 interrupt
T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
while (_50us--)
{ while (!TF2);TF2 = 0; }
TR2 = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -