📄 rc522.lst
字号:
434 1 return MI_OK;
435 1 }
436 /////////////////////////////////////////////////////////////////////
437 //功 能:读RC632寄存器
438 //参数说明:Address[IN]:寄存器地址
439 //返 回:读出的值
440 /////////////////////////////////////////////////////////////////////
441 unsigned char ReadRawRC(unsigned char Address)
442 {
443 1 unsigned char i, ucAddr;
444 1 unsigned char ucResult=0;
445 1
446 1 MF522_SCK = 0;
447 1 MF522_NSS = 0;
448 1 ucAddr = ((Address<<1)&0x7E)|0x80;
449 1
450 1 for(i=8;i>0;i--)
451 1 {
452 2 MF522_SI = ((ucAddr&0x80)==0x80);
453 2 MF522_SCK = 1;
454 2 ucAddr <<= 1;
455 2 MF522_SCK = 0;
456 2 }
457 1
458 1 for(i=8;i>0;i--)
459 1 {
460 2 MF522_SCK = 1;
461 2 ucResult <<= 1;
462 2 ucResult|=(bit)MF522_SO;
463 2 MF522_SCK = 0;
464 2 }
465 1
466 1 MF522_NSS = 1;
467 1 MF522_SCK = 1;
468 1 return ucResult;
469 1 }
470
471 /////////////////////////////////////////////////////////////////////
472 //功 能:写RC632寄存器
473 //参数说明:Address[IN]:寄存器地址
474 // value[IN]:写入的值
475 /////////////////////////////////////////////////////////////////////
476 void WriteRawRC(unsigned char Address, unsigned char value)
477 {
478 1 unsigned char i, ucAddr;
479 1
480 1 MF522_SCK = 0;
481 1 MF522_NSS = 0;
482 1 ucAddr = ((Address<<1)&0x7E);
483 1
484 1 for(i=8;i>0;i--)
485 1 {
486 2 MF522_SI = ((ucAddr&0x80)==0x80);
487 2 MF522_SCK = 1;
488 2 ucAddr <<= 1;
489 2 MF522_SCK = 0;
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 9
490 2 }
491 1
492 1 for(i=8;i>0;i--)
493 1 {
494 2 MF522_SI = ((value&0x80)==0x80);
495 2 MF522_SCK = 1;
496 2 value <<= 1;
497 2 MF522_SCK = 0;
498 2 }
499 1 MF522_NSS = 1;
500 1 MF522_SCK = 1;
501 1 }
502
503 /////////////////////////////////////////////////////////////////////
504 //功 能:置RC522寄存器位
505 //参数说明:reg[IN]:寄存器地址
506 // mask[IN]:置位值
507 /////////////////////////////////////////////////////////////////////
508 void SetBitMask(unsigned char reg,unsigned char mask)
509 {
510 1 char tmp = 0x0;
511 1 tmp = ReadRawRC(reg);
512 1 WriteRawRC(reg,tmp | mask); // set bit mask
513 1 }
514
515 /////////////////////////////////////////////////////////////////////
516 //功 能:清RC522寄存器位
517 //参数说明:reg[IN]:寄存器地址
518 // mask[IN]:清位值
519 /////////////////////////////////////////////////////////////////////
520 void ClearBitMask(unsigned char reg,unsigned char mask)
521 {
522 1 char tmp = 0x0;
523 1 tmp = ReadRawRC(reg);
524 1 WriteRawRC(reg, tmp & ~mask); // clear bit mask
525 1 }
526
527 /////////////////////////////////////////////////////////////////////
528 //功 能:通过RC522和ISO14443卡通讯
529 //参数说明:Command[IN]:RC522命令字
530 // pInData[IN]:通过RC522发送到卡片的数据
531 // InLenByte[IN]:发送数据的字节长度
532 // pOutData[OUT]:接收到的卡片返回数据
533 // *pOutLenBit[OUT]:返回数据的位长度
534 /////////////////////////////////////////////////////////////////////
535 char PcdComMF522(unsigned char Command,
536 unsigned char *pInData,
537 unsigned char InLenByte,
538 unsigned char *pOutData,
539 unsigned int *pOutLenBit)
540 {
541 1 char status = MI_ERR;
542 1 unsigned char irqEn = 0x00;
543 1 unsigned char waitFor = 0x00;
544 1 unsigned char lastBits;
545 1 unsigned char n;
546 1 unsigned int i;
547 1 switch (Command)
548 1 {
549 2 case PCD_AUTHENT:
550 2 irqEn = 0x12;
551 2 waitFor = 0x10;
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 10
552 2 break;
553 2 case PCD_TRANSCEIVE:
554 2 irqEn = 0x77;
555 2 waitFor = 0x30;
556 2 break;
557 2 default:
558 2 break;
559 2 }
560 1
561 1 WriteRawRC(ComIEnReg,irqEn|0x80);
562 1 ClearBitMask(ComIrqReg,0x80);
563 1 WriteRawRC(CommandReg,PCD_IDLE);
564 1 SetBitMask(FIFOLevelReg,0x80);
565 1
566 1 for (i=0; i<InLenByte; i++)
567 1 { WriteRawRC(FIFODataReg, pInData[i]); }
568 1 WriteRawRC(CommandReg, Command);
569 1
570 1
571 1 if (Command == PCD_TRANSCEIVE)
572 1 { SetBitMask(BitFramingReg,0x80); }
573 1
574 1 // i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
575 1 i = 2000;
576 1 do
577 1 {
578 2 n = ReadRawRC(ComIrqReg);
579 2 i--;
580 2 }
581 1 while ((i!=0) && !(n&0x01) && !(n&waitFor));
582 1 ClearBitMask(BitFramingReg,0x80);
583 1
584 1 if (i!=0)
585 1 {
586 2 if(!(ReadRawRC(ErrorReg)&0x1B))
587 2 {
588 3 status = MI_OK;
589 3 if (n & irqEn & 0x01)
590 3 { status = MI_NOTAGERR; }
591 3 if (Command == PCD_TRANSCEIVE)
592 3 {
593 4 n = ReadRawRC(FIFOLevelReg);
594 4 lastBits = ReadRawRC(ControlReg) & 0x07;
595 4 if (lastBits)
596 4 { *pOutLenBit = (n-1)*8 + lastBits; }
597 4 else
598 4 { *pOutLenBit = n*8; }
599 4 if (n == 0)
600 4 { n = 1; }
601 4 if (n > MAXRLEN)
602 4 { n = MAXRLEN; }
603 4 for (i=0; i<n; i++)
604 4 { pOutData[i] = ReadRawRC(FIFODataReg); }
605 4 }
606 3 }
607 2 else
608 2 { status = MI_ERR; }
609 2
610 2 }
611 1
612 1
613 1 SetBitMask(ControlReg,0x80); // stop timer now
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 11
614 1 WriteRawRC(CommandReg,PCD_IDLE);
615 1 return status;
616 1 }
617
618
619 /////////////////////////////////////////////////////////////////////
620 //开启天线
621 //每次启动或关闭天险发射之间应至少有1ms的间隔
622 /////////////////////////////////////////////////////////////////////
623 void PcdAntennaOn()
624 {
625 1 unsigned char i;
626 1 i = ReadRawRC(TxControlReg);
627 1 if (!(i & 0x03))
628 1 {
629 2 SetBitMask(TxControlReg, 0x03);
630 2 }
631 1 }
632
633
634 /////////////////////////////////////////////////////////////////////
635 //关闭天线
636 /////////////////////////////////////////////////////////////////////
637 void PcdAntennaOff()
638 {
639 1 ClearBitMask(TxControlReg, 0x03);
640 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2037 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 238
IDATA SIZE = ---- ----
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 + -