标题:
51单片机 Rc632射频识别器件驱动源码
[打印本页]
作者:
zplove57
时间:
2017-3-16 17:54
标题:
51单片机 Rc632射频识别器件驱动源码
51单片机,RC632射频识别器件
,可以实现对支持14443A/B、15693协议的IC卡进行非接触读写操作-51 MCU,RC632 RFID IC,ISO14443A/B、ISO15693,READ&WRITE
0.png
(69.81 KB, 下载次数: 62)
下载附件
2017-3-16 20:07 上传
全部下载:
CLRC632_RFID_CODE.rar
(235.83 KB, 下载次数: 103)
2017-3-16 17:54 上传
点击文件名下载附件
下载积分: 黑币 -5
主程序:
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#include "main.h"
#include "slrc632.h"
#include "iso14443a.h"
#include "iso14443b.h"
#include "iso15693.h"
//硬件版本号
unsigned char code hardmodel[12] = {"SL601F-0512"};
bit g_bReceOk; //正确接收到上位机指令标志
bit g_bReceAA; //接收到上位机发送的AA字节标志
bit g_bRc632Ok; //RC632复位正常标志
unsigned int idata g_cReceNum; //接收到上位机的字节数
unsigned int data g_cCommand; //接收到的命令码
unsigned char data g_cSNR[4]; //M1卡序列号
unsigned char g_cIcdevH; //设备标记
unsigned char g_cIcdevL; //设备标记
unsigned char g_cFWI; //
unsigned char idata g_cCidNad; //
unsigned char idata g_cReceBuf[64]; //和上位机通讯时的缓冲区
struct TranSciveBuffer{unsigned char MfCommand;
unsigned int MfLength;
unsigned char MfData[64];
};
void delay(unsigned int i)
{
unsigned char j;
while(i--) for(j=0;j<200;j++);
}
void BEEP(unsigned char i)
{
unsigned char k;
k=i*200;
sond = 0;
delay(k);
sond =1;
}
void REDON(void)
{
redled = 1;
}
void REDOFF(void)
{
redled = 0;
}
void BLUEON(void)
{
blueled = 1;
}
void BLUEOFF(void)
{
blueled = 0;
}
void main( )
{
InitializeSystem( );
Rc632Ready( );
PcdConfigISOType( 'A' );
BEEP(1);
REDON();
BLUEOFF();
while ( 1 )
{
if (g_bReceOk)
{
g_bReceOk = 0;
RC632_CE=0;
switch(g_cCommand)
{
case 0x0101:
ComSetBound(); break;
case 0x0104:
ComGetHardModel(); break;
case 0x0108:
ComM632PcdConfigISOType(); break;
case 0x010C:
ComPcdAntenna(); break;
case 0x0201:
ComRequestA(); break;
case 0x0202:
ComAnticoll(); break;
case 0x0203:
ComSelect(); break;
case 0x0204:
ComHlta(); break;
case 0x0207:
ComAuthentication(); break;
case 0x0208:
ComM1Read(); break;
case 0x0209:
ComM1Write(); break;
case 0x020A:
ComM1Initval(); break;
case 0x020B:
ComM1Readval(); break;
case 0x020C:
ComM1Decrement(); break;
case 0x020D:
ComM1Increment(); break;
case 0x020E:
ComM1Restore(); break;
case 0x020F:
ComM1Transfer(); break;
case 0x0212:
ComUL_PcdAnticoll(); break;
case 0x0213:
ComUL_PcdWrite(); break;
case 0x0301:
ComTypeBRst(); break;
// case 0x1E:
// ComAttrib(); break;
case 0x0302:
ComHltb(); break;
case 0x0303:
ComCL_Deselect(); break;
case 0x0401:
ComRF020Check(); break;
case 0x0402:
ComRF020Read(); break;
case 0x0403:
ComRF020Write(); break;
case 0x0404:
ComRF020Lock(); break;
case 0x0405:
ComRF020Count(); break;
case 0x0406:
ComRF020Deselect(); break;
case 0x0501:
ComSelectSR(); break;
case 0x0502:
ComCompletionSR(); break;
case 0x0503:
ComReadSR176(); break;
case 0x0504:
ComWriteSR176(); break;
case 0x0505:
ComProtectSR176(); break;
case 0x0506:
ComReadSR4K(); break;
case 0x0507:
ComWriteSR4K(); break;
case 0x0508:
ComAuthSR4K(); break;
case 0x0509:
ComGetUIDSR4K(); break;
case 0x050A:
ComProtectSR4K(); break;
case 0x1000:
ComISO15693_Inventory16(); break;
case 0x1001:
ComISO15693_Inventory(); break;
case 0x1002:
ComISO15693_Stay_Quiet(); break;
case 0x1003:
ComISO15693_Select(); break;
case 0x1004:
ComISO15693_Reset_To_Ready();break;
case 0x1005:
ComISO15693_Read_sm(); break;
case 0x1006:
ComISO15693_Write_sm(); break;
case 0x1007:
ComISO15693_Lock_Block(); break;
case 0x1008:
ComISO15693_Write_AFI(); break;
case 0x1009:
ComISO15693_Lock_AFI(); break;
case 0x100A:
ComISO15693_Write_DSFID(); break;
case 0x100B:
ComISO15693_Lock_DSFID(); break;
case 0x100C:
ComISO15693_Get_System_Information(); break;
case 0x100D:
ComISO15693_Get_Multiple_Block_Security();break;
default:
AnswerErr( FAULT11 ); break;
}
REDOFF();
BLUEON();
sond = 1;
REDON();
BLUEOFF();
RC632_CE=1;
ES = 1;
EA=1;
}
}
}
/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
TMOD &= 0x0F;
TMOD |= 0x21;
PCON |= 0x80;
SCON = 0x50;
TH1 = TL1 = BOUND19200;
TR1=1;
P0 = P1 = P2 = P3 = 0xFF;
IE |= 0x90;
}
/////////////////////////////////////////////////////////////////////
//初始化RC632
/////////////////////////////////////////////////////////////////////
void Rc632Ready()
{
char status;
delay(100);
status = PcdReset();
if(status != MI_OK)
{
delay(10);
status = PcdReset();
}
if(status != MI_OK)
{
delay(10);
status = PcdReset();
}
if(status == MI_OK)
{
g_bRc632Ok = 1;
}
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置波特率命令
/////////////////////////////////////////////////////////////////////
void ComSetBound()
{
unsigned char bound = g_cReceBuf[6];
if (bound > 7)
{ AnswerErr(FAULT12); }
else
{
AnswerCommandOk();
TR1 = 0;
switch(bound)
{
case 0:
TH1=TL1=BOUND4800;
break;
case 1:
TH1=TL1=BOUND9600;
break;
case 2:
TH1=TL1=BOUND14400;
break;
case 3:
TH1=TL1=BOUND19200;
break;
case 4:
TH1=TL1=BOUND28800;
break;
case 5:
TH1=TL1=BOUND38400;
break;
case 6:
TH1=TL1=BOUND57600;
break;
case 7:
TH1=TL1=BOUND115200;
break;
default:
break;
}
TR1 = 1;
}
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的读取硬件版本号命令
/////////////////////////////////////////////////////////////////////
void ComGetHardModel()
{
memcpy(&g_cReceBuf[0], &hardmodel[0], sizeof(hardmodel));
AnswerOk(&g_cReceBuf[0], sizeof(hardmodel));
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置RC632协议命令,ISO14443A/B或ISO15693
/////////////////////////////////////////////////////////////////////
void ComM632PcdConfigISOType()
{
if (MI_OK == PcdConfigISOType(g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的天线命令
/////////////////////////////////////////////////////////////////////
void ComPcdAntenna()
{
char status;
if (!g_cReceBuf[6])
{ status = PcdAntennaOff(); }
else
{
DelayMs(10);
status = PcdAntennaOn();
DelayMs(10);
}
if (status == MI_OK)
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的寻A卡命令
/////////////////////////////////////////////////////////////////////
void ComRequestA()
{
unsigned char atq[2];
char status;
status = PcdRequest(g_cReceBuf[6], atq);
if (status != MI_OK)
{ status = PcdRequest(g_cReceBuf[6], atq); }
if (status == MI_OK)
{ AnswerOk(atq,2); }
else
{ AnswerErr(FAULT20); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡防冲撞命令
/////////////////////////////////////////////////////////////////////
void ComAnticoll()
{
if (MI_OK == PcdAnticoll(&g_cSNR))
{ AnswerOk(&g_cSNR,4); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡锁定命令
/////////////////////////////////////////////////////////////////////
void ComSelect()
{
if (MI_OK == PcdSelect(&g_cReceBuf[6], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 1); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡休眠命令
/////////////////////////////////////////////////////////////////////
void ComHlta()
{
if (MI_OK == PcdHalt())
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡验证密钥命令
/////////////////////////////////////////////////////////////////////
void ComAuthentication()
{
char status = MI_COM_ERR;
unsigned char *pkeys,*pSNR;
pkeys = &g_cReceBuf[20];
pSNR = &g_cSNR;
if (MI_OK == ChangeCodeKey(&g_cReceBuf[8],pkeys)) //转换密钥格式
{
if (MI_OK == PcdAuthKey(pkeys)) //传送密钥到RC500FIFO
{
status = PcdAuthState(g_cReceBuf[6], g_cReceBuf[7], pSNR); //验证密钥
}
}
if (status == MI_OK)
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT22); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机读M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Read()
{
if (MI_OK == PcdRead(g_cReceBuf[6], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 16); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机写M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Write()
{
if (MI_OK == PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机初始化钱包命令
/////////////////////////////////////////////////////////////////////
void ComM1Initval()
{
g_cReceBuf[11]=~g_cReceBuf[7];g_cReceBuf[12]=~g_cReceBuf[8];
g_cReceBuf[13]=~g_cReceBuf[9];g_cReceBuf[14]=~g_cReceBuf[10];
g_cReceBuf[15]=g_cReceBuf[7];g_cReceBuf[16]=g_cReceBuf[8];
g_cReceBuf[17]=g_cReceBuf[9];g_cReceBuf[18]=g_cReceBuf[10];
g_cReceBuf[19]=g_cReceBuf[6];g_cReceBuf[20]=~g_cReceBuf[6];
g_cReceBuf[21]=g_cReceBuf[6];g_cReceBuf[22]=~g_cReceBuf[6];
if (MI_OK == PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机读钱包命令
/////////////////////////////////////////////////////////////////////
void ComM1Readval()
{
if (MI_OK == PcdRead(g_cReceBuf[6], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 4); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机扣款命令
/////////////////////////////////////////////////////////////////////
void ComM1Decrement()
{
if (MI_OK == PcdValue(PICC_DECREMENT, g_cReceBuf[6], &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机充值命令
/////////////////////////////////////////////////////////////////////
void ComM1Increment()
{
if (MI_OK == PcdValue(PICC_INCREMENT, g_cReceBuf[6], &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机M1卡回传命令
/////////////////////////////////////////////////////////////////////
void ComM1Restore()
{
if (MI_OK == PcdRestore(g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机M1卡值传送命令
/////////////////////////////////////////////////////////////////////
void ComM1Transfer()
{
if (MI_OK == PcdTransfer(g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ultra light防冲撞命令
/////////////////////////////////////////////////////////////////////
void ComUL_PcdAnticoll()
{
if (MI_OK == UL_PcdAnticoll(&g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 7); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ultra light写卡命令
/////////////////////////////////////////////////////////////////////
void ComUL_PcdWrite()
{
if (MI_OK == UL_PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机高级复位TYPEB卡命令
/////////////////////////////////////////////////////////////////////
void ComTypeBRst()
{
unsigned char status;
if ((status = M531PiccRequestB(g_cReceBuf[6], 0, 0, &g_cReceBuf[0])) == MI_OK)
{
g_cFWI = 0xFF;//g_cReceBuf[11] >> 4;
g_cCidNad = 8;//((g_cReceBuf[11]&0x02)<<1) | ((g_cReceBuf[11]&0x01)<<3);
// status = M531PiccAttrib(&g_cReceBuf[1], g_cReceBuf[10]&0x0F, &g_cReceBuf[12]);
// }
// if (status == MI_OK) {
AnswerOk(&g_cReceBuf[0], 12); }
else
{ AnswerErr(FAULT21); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机HLTB3命令
/////////////////////////////////////////////////////////////////////
void ComHltb()
{
if (MI_OK == M531PiccHltb(&g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
M531PiccAttrib(&g_cReceBuf[1], g_cReceBuf[10]&0x0F, &g_cReceBuf[12]);
}
/////////////////////////////////////////////////////////////////////
//响应上位机HLTB4命令
/////////////////////////////////////////////////////////////////////
void ComCL_Deselect()
{
if (MI_OK == CL_Deselect(0))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机AT88RF020卡验证密钥命令
/////////////////////////////////////////////////////////////////////
void ComRF020Check()
{
if (MI_OK == At88rf020Check(&g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT22); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机AT88RF020卡读命令
/////////////////////////////////////////////////////////////////////
void ComRF020Read()
{
if (MI_OK == At88rf020Read(g_cReceBuf[6], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0],8); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机AT88RF020卡写命令
/////////////////////////////////////////////////////////////////////
void ComRF020Write()
{
if (MI_OK == At88rf020Write(g_cReceBuf[6], &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机AT88RF020卡LOCK命令
/////////////////////////////////////////////////////////////////////
void ComRF020Lock()
{
if (MI_OK == At88rf020Lock(&g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机AT88RF020卡COUNT命令
/////////////////////////////////////////////////////////////////////
void ComRF020Count()
{
if (MI_OK == At88rf020Count(&g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机AT88RF020卡DESELECT命令
/////////////////////////////////////////////////////////////////////
void ComRF020Deselect()
{
if (MI_OK == At88rf020Deselect())
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机激活ST卡片命令
/////////////////////////////////////////////////////////////////////
void ComSelectSR()
{
if(MI_OK == SelectSR(&g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0],1); }
else
{ AnswerErr(FAULT20); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机SR176读块命令
/////////////////////////////////////////////////////////////////////
void ComReadSR176()
{
if (MI_OK == ReadSR176(g_cReceBuf[6], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0],2); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机SR176写块命令
/////////////////////////////////////////////////////////////////////
void ComWriteSR176()
{
char status;
if((status = WriteSR176(g_cReceBuf[6], &g_cReceBuf[7])) == MI_OK)
{
DelayMs(5);
status = ReadSR176(g_cReceBuf[6], &g_cReceBuf[0]);
if((status==MI_OK) && (g_cReceBuf[0]==g_cReceBuf[7]) && (g_cReceBuf[1]==g_cReceBuf[8]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机SR176块锁定命令
/////////////////////////////////////////////////////////////////////
void ComProtectSR176()
{
char status;
if ((status = GetProtSR176(g_cReceBuf[0])) == MI_OK)
{
status = ProtectSR176(g_cReceBuf[6]);
if (status == MI_OK)
{
DelayMs(5);
status = GetProtSR176(g_cReceBuf[1]);
if ((g_cReceBuf[0]|g_cReceBuf[6]) != g_cReceBuf[1])
{ status = MI_COM_ERR; }
}
}
if (status == MI_OK)
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机SR176卡COMPLETION命令
/////////////////////////////////////////////////////////////////////
void ComCompletionSR()
{
if (MI_OK == CompletionSR())
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机SRIX4K读块命令
/////////////////////////////////////////////////////////////////////
void ComReadSR4K()
{
if (MI_OK == ReadSR4K(g_cReceBuf[6], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0],4); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机SRIX4K写块命令
/////////////////////////////////////////////////////////////////////
void ComWriteSR4K()
{
char status;
if ((status = WriteSR4K(g_cReceBuf[6], &g_cReceBuf[7])) == MI_OK)
{
DelayMs(7);
status = ReadSR4K(g_cReceBuf[6], &g_cReceBuf[0]);
if ((status==MI_OK) && (g_cReceBuf[0]==g_cReceBuf[7]) && (g_cReceBuf[1]==g_cReceBuf[8])
&& (g_cReceBuf[2]==g_cReceBuf[9]) && (g_cReceBuf[3]==g_cReceBuf[10]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机SRIX4K卡AUTHENTICATE命令
/////////////////////////////////////////////////////////////////////
void ComAuthSR4K()
{
if (MI_OK == AuthSR4K(&g_cReceBuf[6], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 3); }
else
{ AnswerErr(FAULT22); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机SRIX4K读UID命令
/////////////////////////////////////////////////////////////////////
void ComGetUIDSR4K()
{
if (MI_OK == GetUIDSR4K(&g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 8); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机SRIX4K块锁定命令
/////////////////////////////////////////////////////////////////////
void ComProtectSR4K()
{
char status;
if ((status = ReadSR4K(0xFF, &g_cReceBuf[0])) == MI_OK)
{
status = WriteSR4K(0xFF, &g_cReceBuf[6]);
if (status == MI_OK)
{
DelayMs(7);
status = ReadSR4K(0xFF, &g_cReceBuf[1]);
if ((g_cReceBuf[0]&g_cReceBuf[6]) != g_cReceBuf[1])
{ status = MI_COM_ERR; }
}
}
if (status == MI_OK )
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Inventory命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Inventory16()
{
if (MI_OK == ISO15693_Inventory16(0x16,0x00,0x00,&g_cReceBuf[0],&g_cReceBuf[0], &g_cReceBuf[1]))
{ AnswerOk(&g_cReceBuf[1], g_cReceBuf[0]); }
else
{ AnswerErr( FAULT20 ); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Inventory命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Inventory()
{
if (MI_OK == ISO15693_Inventory(0x36,0x00,0x00,&g_cReceBuf[0],&g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 9); }
else
{ AnswerErr( FAULT20 ); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Stay_Quiet命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Stay_Quiet()
{
if (MI_OK == ISO15693_Stay_Quiet(0x22, &g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Select命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Select()
{
if (MI_OK == ISO15693_Select(0x22, &g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Reset_To_Ready命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Reset_To_Ready()
{
unsigned char flags = 0x02;
flags |= g_cReceBuf[6] << 4;
if (MI_OK == ISO15693_Reset_To_Ready(flags, &g_cReceBuf[7]) )
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Read命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Read_sm()
{
unsigned char flags = 0x02;
flags |= g_cReceBuf[6] << 4;
if (MI_OK == ISO15693_Read_sm(flags,&g_cReceBuf[7],g_cReceBuf[15],g_cReceBuf[16],&g_cReceBuf[0],&g_cReceBuf[1]))
{ AnswerOk(&g_cReceBuf[1],g_cReceBuf[0]); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Write命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Write_sm()
{
unsigned char flags = 0x02;
flags |= g_cReceBuf[6] << 4;
if (MI_OK == ISO15693_Write_sm(flags, &g_cReceBuf[7], g_cReceBuf[15], &g_cReceBuf[16]) )
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Lock_Block命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Lock_Block()
{
unsigned char flags = 0x02;
flags |= g_cReceBuf[6] << 4;
if (MI_OK == ISO15693_Lock_Block(flags, &g_cReceBuf[7], g_cReceBuf[15]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Write_AFI命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Write_AFI()
{
unsigned char flags = 0x02;
flags |= g_cReceBuf[6] << 4;
if (MI_OK == ISO15693_Write_AFI(flags, &g_cReceBuf[7], g_cReceBuf[15]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Lock_AFI命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Lock_AFI()
{
unsigned char flags = 0x02;
flags |= g_cReceBuf[6] << 4;
if (MI_OK == ISO15693_Lock_AFI(flags, &g_cReceBuf[7]) )
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Write_DSFID命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Write_DSFID()
{
unsigned char flags = 0x02;
flags |= g_cReceBuf[6] << 4;
if (MI_OK == ISO15693_Write_DSFID(flags, &g_cReceBuf[7], g_cReceBuf[15]) )
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Lock_DSFID命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Lock_DSFID()
{
unsigned char flags = 0x02;
flags |= g_cReceBuf[6] << 4;
if (MI_OK == ISO15693_Lock_DSFID(flags, &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Get_System_Information命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Get_System_Information()
{
unsigned char flags = 0x02;
flags |= g_cReceBuf[6] << 4;
if (MI_OK == ISO15693_Get_System_Information(flags, &g_cReceBuf[7], &g_cReceBuf[0], &g_cReceBuf[1]))
{ AnswerOk(&g_cReceBuf[1],g_cReceBuf[0]); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机ISO15693_Get_Multiple_Block_Security命令
/////////////////////////////////////////////////////////////////////
void ComISO15693_Get_Multiple_Block_Security()
{
unsigned char flags = 0x02;
flags |= g_cReceBuf[6] << 4;
if (MI_OK == ISO15693_Get_Multiple_Block_Security(flags,&g_cReceBuf[7],g_cReceBuf[15],g_cReceBuf[16],&g_cReceBuf[0],&g_cReceBuf[1]))
{ AnswerOk(&g_cReceBuf[1],g_cReceBuf[0]); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//正确执行完上位机指令,应答(无返回数据)
/////////////////////////////////////////////////////////////////////
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;
sond = 0;
ES = 0;
}
}
if (g_cReceNum >= sizeof(g_cReceBuf))
{ g_cReceNum=0; }
}
if (TI)
{ TI = 0; }
}
void DelayMs(unsigned int _MS)
{
unsigned char i=0;
while(_MS--)
{
for(i=0;i<120;i++)
{
_nop_();_nop_();_nop_();_nop_();
}
}
}
void Delay_50us(unsigned char _50us)
{
unsigned char i;
while(_50us--)
for(i=0;i<25;i++);
}
复制代码
作者:
rawi
时间:
2017-6-13 15:50
支持一下~~~~~~~~~
作者:
xvsd_247
时间:
2018-6-25 08:49
看看~~~~~~~~~~~~~~~
作者:
xinyang
时间:
2018-9-21 13:29
好东西, 正好需要。
作者:
hewe_001
时间:
2018-10-28 16:55
不是SPI接口的!
作者:
渺渺
时间:
2018-11-22 10:40
感谢大佬,有用有用
作者:
SAD莫若
时间:
2019-4-30 15:26
感谢~感谢~感谢
作者:
amos_machine
时间:
2019-5-4 20:26
学习一下,代码不是SPI的驱动。
作者:
千与千寻9527
时间:
2019-5-9 20:52
资料太少
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1