📄 fm1702.lst
字号:
518 1 if((row == 0x00) && (col == 0x00))
519 1 {
520 2 for(i = 0; i < length; i++)
521 2 {
522 3 UID[i] = RevBuffer[i];
523 3 }
524 2 }
525 1 else
526 1 {
527 2 temp = RevBuffer[0];
528 2 temp1 = UID[row - 1];
529 2 switch(col)
530 2 {
531 3 case 0: temp1 = 0x00; row = row + 1; break;
532 3 case 1: temp = temp & 0xFE; temp1 = temp1 & 0x01; break;
533 3 case 2: temp = temp & 0xFC; temp1 = temp1 & 0x03; break;
534 3 case 3: temp = temp & 0xF8; temp1 = temp1 & 0x07; break;
535 3 case 4: temp = temp & 0xF0; temp1 = temp1 & 0x0F; break;
536 3 case 5: temp = temp & 0xE0; temp1 = temp1 & 0x1F; break;
537 3 case 6: temp = temp & 0xC0; temp1 = temp1 & 0x3F; break;
538 3 case 7: temp = temp & 0x80; temp1 = temp1 & 0x7F; break;
539 3 default: break;
540 3 }
541 2
542 2 RevBuffer[0] = temp;
543 2 UID[row - 1] = temp1 | temp;
544 2 for(i = 1; i < length; i++)
545 2 {
546 3 UID[row - 1 + i] = RevBuffer[i];
547 3 }
548 2 }
549 1 }
550
551 /****************************************************************/
C51 COMPILER V7.50 FM1702 10/16/2007 16:33:32 PAGE 10
552 /*名称: Set_BitFraming */
553 /*功能: 该函数设置待发送数据的字节数*/
554 /*输入: row: 产生冲突的行*/
555 /* col: 产生冲突的列*/
556 /*输出: N/A */
557 /****************************************************************/
558 void Set_BitFraming(uchar row, uchar col)
559 {
560 1 switch(row)
561 1 {
562 2 case 0: RevBuffer[1] = 0x20; break;
563 2 case 1: RevBuffer[1] = 0x30; break;
564 2 case 2: RevBuffer[1] = 0x40; break;
565 2 case 3: RevBuffer[1] = 0x50; break;
566 2 case 4: RevBuffer[1] = 0x60; break;
567 2 default: break;
568 2 }
569 1
570 1 switch(col)
571 1 {
572 2 case 0: SPIWrite(Bit_Frame,0x00); break;
573 2 case 1: SPIWrite(Bit_Frame,0x11); RevBuffer[1] = (RevBuffer[1] | 0x01); break;
574 2 case 2: SPIWrite(Bit_Frame,0x22); RevBuffer[1] = (RevBuffer[1] | 0x02); break;
575 2 case 3: SPIWrite(Bit_Frame,0x33); RevBuffer[1] = (RevBuffer[1] | 0x03); break;
576 2 case 4: SPIWrite(Bit_Frame,0x44); RevBuffer[1] = (RevBuffer[1] | 0x04); break;
577 2 case 5: SPIWrite(Bit_Frame,0x55); RevBuffer[1] = (RevBuffer[1] | 0x05); break;
578 2 case 6: SPIWrite(Bit_Frame,0x66); RevBuffer[1] = (RevBuffer[1] | 0x06); break;
579 2 case 7: SPIWrite(Bit_Frame,0x77); RevBuffer[1] = (RevBuffer[1] | 0x07); break;
580 2 default: break;
581 2 }
582 1 }
583
584 /****************************************************************/
585 /*名称: Init_FM1702 */
586 /*功能: 该函数实现对FM1702初始化操作*/
587 /*输入: mode:工作模式, 0:TYPEA模式*/
588 /* 1:TYPEB模式*/
589 /* 2:上海模式*/
590 /*输出: N/A */
591 /****************************************************************/
592 void Init_FM1702(uchar mode)
593 {
594 1
595 1 uchar temp;
596 1 uint i;
597 1
598 1 // unsigned int idata timecnt=0;
599 1 RF_SCK = 1;
600 1 RF_MISO = 1;
601 1 RF_MOSI = 1;
602 1 RF_RST = 1; /* FM1702复位 */
603 1 for(i = 0; i < 0x1fff; i++)
604 1 {
605 2 _nop_(); /*等待约140ms, 11.0592*/
606 2 }
607 1
608 1 RF_RST = 0;
609 1 for(i = 0; i < 0x1fff; i++)
610 1 {
611 2 _nop_();
612 2 }
613 1
C51 COMPILER V7.50 FM1702 10/16/2007 16:33:32 PAGE 11
614 1
615 1 ////////////////////////////////////////////////////////////////////////////
616 1
617 1 while(temp = SPIRead(Command) != 0) /* 等待Command = 0,FM1702复位成功 */
618 1 {
619 2 _nop_();
620 2 }
621 1 ////////////////////////////////////////////////////////////////////////////
622 1 // delay_10ms(1);
623 1 SPIWrite(Page_Sel,0x80);
624 1
625 1
626 1 for(i = 0; i < 0x1fff; i++) /* 延时 */
627 1 {
628 2 if(temp=SPIRead(Command) == 0x00)
629 2 {
630 3 SPIWrite(Page_Sel,0x00);
631 3 }
632 2 }
633 1
634 1
635 1 // P2 = SPIRead(TimerClock); //for debug
636 1
637 1
638 1 SPIWrite(TimerClock,0x0b); //address 2AH /* 定时器周期设置寄存器 */
639 1
640 1 SPIWrite(TimerControl,0x02); //address 2BH /* 定时器控制寄存器 */
641 1 SPIWrite(TimerReload,0x42); //address 2CH /* 定时器初值寄存器 */
642 1
643 1 SPIWrite(InterruptEn,0x7f); //address 06H /* 中断使能/禁止寄存器 */
644 1
645 1 // temp = SPIRead(InterruptEn);
646 1 SPIWrite(Int_Req,0x7f); //address 07H /* 中断请求标识寄存器 */
647 1 SPIWrite(MFOUTSelect,0x02); //address 26H /* mf OUT 选择配置寄存器 */
648 1
649 1 //设置调制器的输入源为内部编码器, 并且设置TX1和TX2
650 1 SPIWrite(TxControl,0x5b); //address 11H /* 发送控制寄存器 */
651 1 SPIWrite(RxControl2,0x01);
652 1 // SPIWrite(RxControl1,0x73);
653 1 SPIWrite(RxWait,0x05);
654 1 if(mode ==2)
655 1 {
656 2 SPIWrite(TypeSH,0x01);
657 2 }
658 1 else
659 1 {
660 2 SPIWrite(TypeSH,0x00);
661 2 }
662 1
663 1 }
664
665 /****************************************************************/
666 /*名称: Command_Send */
667 /*功能: 该函数实现向FM1702发送命令集的功能*/
668 /*输入: count, 待发送命令集的长度*/
669 /* buff, 指向待发送数据的指针*/
670 /* Comm_Set, 命令码*/
671 /*输出: TRUE, 命令被正确执行*/
672 /* FALSE, 命令执行错误*/
673 /****************************************************************/
674 uchar Command_Send(uchar count, uchar idata *buff, uchar Comm_Set)
675 {
C51 COMPILER V7.50 FM1702 10/16/2007 16:33:32 PAGE 12
676 1
677 1 uint j;
678 1 uchar idata temp, temp1;
679 1
680 1 SPIWrite(Command,0x00);
681 1 temp = Clear_FIFO();
682 1 Write_FIFO(count, buff);
683 1
684 1
685 1 // temp = SPIRead(MFOUTSelect);
686 1 SPIWrite(Command,Comm_Set); /* 命令执行 */
687 1 for(j = 0; j < RF_TimeOut; j++) /* 检查命令执行否 */
688 1 {
689 2 // temp = SPIRead(MFOUTSelect); //??
690 2 temp = SPIRead(Command);
691 2 temp1 = SPIRead(Int_Req) & 0x80;
692 2 if((temp == 0x00) || (temp1 == 0x80))
693 2 {
694 3 return TRUE;
695 3 }
696 2 }
697 1
698 1 return FALSE;
699 1 }
700
701 /****************************************************************/
702 /*名称: Read_E2 */
703 /*功能: 该函数实现从FM1702的EE中读出数据*/
704 /*输入: lsb, EE地址(低字节) */
705 /* msb, EE地址(高字节) */
706 /* count, 待读出数据EE的字节个数*/
707 /* buff, 指向待读出数据的指针*/
708 /*输出: TRUE, EE数据正确读出*/
709 /* FALSE, EE数据读出有误*/
710 /****************************************************************/
711 uchar Read_E2(uchar lsb, uchar msb, uchar count, uchar idata *buff)
712 {
713 1
714 1 uchar temp;
715 1
716 1 *buff = lsb;
717 1 *(buff + 1) = msb;
718 1 *(buff + 2) = count;
719 1 temp = Command_Send(3, buff, ReadE2);
720 1 Read_FIFO(buff);
721 1 if(temp == FALSE) return(TRUE);
722 1 return(FALSE);
723 1 }
724
725 /****************************************************************/
726 /*名称: Write_E2 */
727 /*功能: 该函数实现向FM1702的EE中写入数据*/
728 /*输入: lsb, EE地址(低字节) */
729 /* msb, EE地址(高字节) */
730 /* count, 待写入数据EE的字节个数*/
731 /* buff, 指向待写入数据的指针*/
732 /*输出: TRUE, EE数据正确写入*/
733 /* FALSE, EE数据写入有误*/
734 /****************************************************************/
735 uchar Write_E2(uchar lsb, uchar msb, uchar count, uchar idata *buff)
736 {
737 1
C51 COMPILER V7.50 FM1702 10/16/2007 16:33:32 PAGE 13
738 1 uchar idata temp, i;
739 1
740 1 for(i = 0; i < count; i++)
741 1 {
742 2 *(buff + count - i + 2) = *(buff - i + count);
743 2 }
744 1
745 1 *buff = lsb;
746 1 *(buff + 1) = msb;
747 1 temp = Command_Send(count + 2, buff, WriteE2);
748 1 temp = SPIRead(SecondaryStatus);
749 1 temp = temp & 0x40;
750 1 if(temp == 0x40)
751 1 {
752 2 SPIWrite(Command,0x00); //added 2006/03/15
753 2 return TRUE;
754 2 }
755 1
756 1 return FALSE;
757 1 }
758
759 /****************************************************************/
760 /*名称: MIF_Halt */
761 /*功能: 该函数实现暂停MIFARE卡*/
762 /*输入: N/A */
763 /*输出: FM1702_OK: 应答正确*/
764 /* FM1702_PARITYERR: 奇偶校验错*/
765 /* FM1702_CRCERR: CRC校验错*/
766 /* FM1702_NOTAGERR: 无卡*/
767 /****************************************************************/
768 uchar MIF_Halt(void)
769 {
770 1
771 1 uchar temp;
772 1 uint i;
773 1
774 1 SPIWrite(CRCPresetLSB,0x63);
775 1 SPIWrite(CWConductance,0x3f);
776 1 SPIWrite(ChannelRedundancy,0x03);
777 1 *RevBuffer = RF_CMD_HALT;
778 1 *(RevBuffer + 1) = 0x00;
779 1 temp = Command_Send(2, RevBuffer, Transmit);
780 1 if(temp == TRUE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -