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++);
- }
復制代碼 |