📄 iso14443a.lst
字号:
295 1 MfComData.MfCommand = PCD_LOADKEY;
296 1 MfComData.MfLength = 12;
297 1 memcpy(&MfComData.MfData[0], pKeys, 12);
298 1
299 1 status = PcdComTransceive(pi);
300 1
301 1 return status;
302 1 }
303
C51 COMPILER V7.06 ISO14443A 05/01/2009 01:52:11 PAGE 6
304 /////////////////////////////////////////////////////////////////////
305 //功能:用存放RC500的FIFO中的密钥和卡上的密钥进行验证
306 //input:auth_mode=验证方式,0x60:验证A密钥,0x61:验证B密钥
307 // block=要验证的绝对块号
308 // g_cSNR=序列号首地址
309 /////////////////////////////////////////////////////////////////////
310 char PcdAuthState(unsigned char auth_mode,unsigned char block,unsigned char *pSnr)
311 {
312 1 char status;
313 1 struct TranSciveBuffer MfComData;
314 1 struct TranSciveBuffer *pi;
315 1 pi = &MfComData;
316 1
317 1 WriteRawRC(RegChannelRedundancy,0x0F);
318 1 PcdSetTmo(4);
319 1 MfComData.MfCommand = PCD_AUTHENT1;
320 1 MfComData.MfLength = 6;
321 1 MfComData.MfData[0] = auth_mode;
322 1 MfComData.MfData[1] = block;
323 1 memcpy(&MfComData.MfData[2], pSnr, 4);
324 1
325 1 status = PcdComTransceive(pi);
326 1 if (status == MI_OK)
327 1 {
328 2 if (ReadRawRC(RegSecondaryStatus) & 0x07)
329 2 { status = MI_BITCOUNTERR; }
330 2 else
331 2 {
332 3 MfComData.MfCommand = PCD_AUTHENT2;
333 3 MfComData.MfLength = 0;
334 3 status = PcdComTransceive(pi);
335 3 if (status == MI_OK)
336 3 {
337 4 if (ReadRawRC(RegControl) & 0x08)
338 4 { status = MI_OK; }
339 4 else
340 4 { status = MI_AUTHERR; }
341 4
342 4 }
343 3 }
344 2 }
345 1 return status;
346 1 }
347
348 /////////////////////////////////////////////////////////////////////
349 //读mifare_one卡上一块(block)数据(16字节)
350 //input: addr = 要读的绝对块号
351 //output:readdata = 读出的数据
352 /////////////////////////////////////////////////////////////////////
353 char PcdRead(unsigned char addr,unsigned char *pReaddata)
354 {
355 1 char status;
356 1 struct TranSciveBuffer MfComData;
357 1 struct TranSciveBuffer *pi;
358 1 pi = &MfComData;
359 1
360 1 PcdSetTmo(4);
361 1 WriteRawRC(RegChannelRedundancy,0x0F);
362 1 MfComData.MfCommand = PCD_TRANSCEIVE;
363 1 MfComData.MfLength = 2;
364 1 MfComData.MfData[0] = PICC_READ;
365 1 MfComData.MfData[1] = addr;
C51 COMPILER V7.06 ISO14443A 05/01/2009 01:52:11 PAGE 7
366 1
367 1 status = PcdComTransceive(pi);
368 1 if (status == MI_OK)
369 1 {
370 2 if (MfComData.MfLength != 0x80)
371 2 { status = MI_BITCOUNTERR; }
372 2 else
373 2 { memcpy(pReaddata, &MfComData.MfData[0], 16); }
374 2 }
375 1 return status;
376 1 }
377
378 /////////////////////////////////////////////////////////////////////
379 //写数据到卡上的一块
380 //input:adde=要写的绝对块号
381 // writedata=写入数据
382 /////////////////////////////////////////////////////////////////////
383 char PcdWrite(unsigned char addr,unsigned char *pWritedata)
384 {
385 1 char status;
386 1 struct TranSciveBuffer MfComData;
387 1 struct TranSciveBuffer *pi;
388 1 pi = &MfComData;
389 1
390 1 PcdSetTmo(5);
391 1 WriteRawRC(RegChannelRedundancy,0x07);
392 1 MfComData.MfCommand = PCD_TRANSCEIVE;
393 1 MfComData.MfLength = 2;
394 1 MfComData.MfData[0] = PICC_WRITE;
395 1 MfComData.MfData[1] = addr;
396 1
397 1 status = PcdComTransceive(pi);
398 1 if (status != MI_NOTAGERR)
399 1 {
400 2 if(MfComData.MfLength != 4)
401 2 { status=MI_BITCOUNTERR; }
402 2 else
403 2 {
404 3 MfComData.MfData[0] &= 0x0F;
405 3 switch (MfComData.MfData[0])
406 3 {
407 4 case 0x00:
408 4 status = MI_NOTAUTHERR;
409 4 break;
410 4 case 0x0A:
411 4 status = MI_OK;
412 4 break;
413 4 default:
414 4 status = MI_CODEERR;
415 4 break;
416 4 }
417 3 }
418 2 }
419 1 if (status == MI_OK)
420 1 {
421 2 PcdSetTmo(5);
422 2 MfComData.MfCommand = PCD_TRANSCEIVE;
423 2 MfComData.MfLength = 16;
424 2 memcpy(&MfComData.MfData[0], pWritedata, 16);
425 2
426 2 status = PcdComTransceive(pi);
427 2 if (status != MI_NOTAGERR)
C51 COMPILER V7.06 ISO14443A 05/01/2009 01:52:11 PAGE 8
428 2 {
429 3 MfComData.MfData[0] &= 0x0F;
430 3 switch(MfComData.MfData[0])
431 3 {
432 4 case 0x00:
433 4 status = MI_WRITEERR;
434 4 break;
435 4 case 0x0A:
436 4 status = MI_OK;
437 4 break;
438 4 default:
439 4 status = MI_CODEERR;
440 4 break;
441 4 }
442 3 }
443 2 PcdSetTmo(4);
444 2 }
445 1 return status;
446 1 }
447
448
449 /////////////////////////////////////////////////////////////////////
450 //扣款和充值
451 //input:dd_mode=命令字,0xC0:扣款,0xC1:充值
452 // addr=钱包的绝对块号
453 // value=4字节增(减)值首地址,16进制数,低位在前
454 /////////////////////////////////////////////////////////////////////
455 char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
456 {
457 1 char status;
458 1 struct TranSciveBuffer MfComData;
459 1 struct TranSciveBuffer *pi;
460 1 pi = &MfComData;
461 1
462 1 PcdSetTmo(5);
463 1 // WriteRawRC(RegCRCPresetLSB,0x63);
464 1 // WriteRawRC(RegCwConductance,0x3F);
465 1 WriteRawRC(RegChannelRedundancy,0x0F);
466 1 MfComData.MfCommand = PCD_TRANSCEIVE;
467 1 MfComData.MfLength = 2;
468 1 MfComData.MfData[0] = dd_mode;
469 1 MfComData.MfData[1] = addr;
470 1
471 1 status = PcdComTransceive(pi);
472 1 if (status != MI_NOTAGERR)
473 1 {
474 2 if (MfComData.MfLength != 4)
475 2 { status = 0x21; } //{ status = MI_BITCOUNTERR; }
476 2 else
477 2 {
478 3 MfComData.MfData[0] &= 0x0F;
479 3 switch (MfComData.MfData[0])
480 3 {
481 4 case 0x00:
482 4 status = 0x22;//status = MI_NOTAUTHERR;
483 4 break;
484 4 case 0x0A:
485 4 status = MI_OK;
486 4 break;
487 4 case 0x01:
488 4 status = 0x23;//status = MI_VALERR;
489 4 break;
C51 COMPILER V7.06 ISO14443A 05/01/2009 01:52:11 PAGE 9
490 4 default:
491 4 status = 0x24; //status = MI_CODEERR;
492 4 break;
493 4 }
494 3 }
495 2 }
496 1 if (status == MI_OK)
497 1 {
498 2 PcdSetTmo(5);
499 2 MfComData.MfCommand = PCD_TRANSCEIVE;
500 2 MfComData.MfLength = 4;
501 2 pi = &MfComData;
502 2 memcpy(&MfComData.MfData[0], pValue, 4);
503 2
504 2 status = PcdComTransceive(pi);
505 2 if (status==MI_OK)
506 2 {
507 3 if (MfComData.MfLength != 4)
508 3 { status = 0x25; }// { status = MI_BITCOUNTERR; }
509 3 else
510 3 { status = MI_OK; }
511 3 }
512 2 else if(status == MI_NOTAGERR)
513 2 { status = MI_OK; }
514 2 else
515 2 { status=0x26; }// { status=MI_COM_ERR; }
516 2 }
517 1
518 1 if (status == MI_OK)
519 1 {
520 2 MfComData.MfCommand = PCD_TRANSCEIVE;
521 2 MfComData.MfLength = 2;
522 2 MfComData.MfData[0] = PICC_TRANSFER;
523 2 MfComData.MfData[1] = addr;
524 2
525 2 status = PcdComTransceive(pi);
526 2 if (status != MI_NOTAGERR)
527 2 {
528 3 if (MfComData.MfLength != 4)
529 3 { status = MI_BITCOUNTERR; }
530 3 else
531 3 {
532 4 MfComData.MfData[0] &= 0x0F;
533 4 switch(MfComData.MfData[0])
534 4 {
535 5 case 0x00:
536 5 status = 0x27; //status = MI_NOTAUTHERR;
537 5 break;
538 5 case 0x0a:
539 5 status = MI_OK;
540 5 break;
541 5 case 0x01:
542 5 status = 0x28;// status = MI_VALERR;
543 5 break;
544 5 default:
545 5 status = 0x29; //status = MI_CODEERR;
546 5 break;
547 5 }
548 4 }
549 3 }
550 2 }
551 1 return status;
C51 COMPILER V7.06 ISO14443A 05/01/2009 01:52:11 PAGE 10
552 1 }
553
554 /////////////////////////////////////////////////////////////////////
555 //命令卡进入休眠状态
556 /////////////////////////////////////////////////////////////////////
557 char PcdHalt()
558 {
559 1 char status = MI_OK;
560 1 struct TranSciveBuffer MfComData;
561 1 struct TranSciveBuffer *pi;
562 1 pi = &MfComData;
563 1
564 1 MfComData.MfCommand = PCD_TRANSCEIVE;
565 1 MfComData.MfLength = 2;
566 1 MfComData.MfData[0] = PICC_HALT;
567 1 MfComData.MfData[1] = 0;
568 1
569 1 status = PcdComTransceive(pi);
570 1 if (status)
571 1 {
572 2 if (status==MI_NOTAGERR || status==MI_ACCESSTIMEOUT)
573 2 status = MI_OK;
574 2 }
575 1 WriteRawRC(RegCommand,PCD_IDLE);
576 1 return status;
577 1 }
578
579
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1677 ----
CONSTANT SIZE = 5 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 760
IDATA SIZE = ---- 17
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -