📄 mfrc500c.lst
字号:
C51 COMPILER V7.05 MFRC500C 10/09/2004 16:22:30 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE MFRC500C
OBJECT MODULE PLACED IN mfrc500c.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE mfrc500c.c DEBUG OBJECTEXTEND
stmt level source
1 #include "REG51F.H"
2 #include "absacc.h"
3 #include "string.h"
4
5 #include "intrins.h"
6 #include <rc500.h>
7 #define watch_dog() WTDC=WTDC|0X20;
8 //********************************************************************
9
10 #define unchar unsigned char
11 //********************************************************************
12 unsigned char idata MLastSelectedSnr[5];
13 unsigned char idata Returnval;
14 unsigned char idata MRcvBuffer[64] ,MSndBuffer[16]; //
15 static MfCmdInfo MInfo;
16
17 //********************************************
18 bit haveset=0;
19
20 /********************************************
21 void Delay(unsigned int );
22 ********************************************/
23 void Delay(unsigned int j)
24 {
25 1 unsigned int i;
26 1 for(i=0;i<j;i++) _nop_();
27 1
28 1 }
29 /****************************************************************************
30 * *
31 * Function: Mf500PcdConfig *
32 * *
33 * Input: *
34 * Output: STATE *
35 * *
36 ****************************************************************************/
37 char Mf500PcdConfig(void)
38 {
39 1 char idata status = MI_RESETERR,i;
40 1 unsigned int idata RstLoopCnt = 0;
41 1 unsigned int idata CmdWaitCnt = 0;
42 1 watch_dog();
43 1 do
44 1 {
45 2 Delay(100); // wait
46 2 PReset=1; // reset RC500
47 2 Delay(300); // wait
48 2 PReset=0; // clear reset pin
49 2 Delay(300); // wait
50 2 i++;
51 2 if(i>200)return 0;
52 2 }
53 1
54 1 // wait until reset command recognized
55 1 while (ReadRC(RegPage) != 0x80);
C51 COMPILER V7.05 MFRC500C 10/09/2004 16:22:30 PAGE 2
56 1 i=0;
57 1 watch_dog();
58 1 do
59 1 {
60 2 i++;
61 2 if(i>200)return 0;
62 2 WriteRC(RegPage,0x0); // Dummy access in order to determine the bus
63 2 }while(ReadRC(RegCommand) != 0x00); // configuration
64 1 // necessary read access
65 1 // after first write access, the returned value
66 1 // should be zero ==> interface recognized
67 1 if (ReadRC(RegCommand) != 0x00)
68 1 {
69 2 status = MI_INTERFACEERR;
70 2 }
71 1 else
72 1 {
73 2 status = 0;
74 2 }
75 1
76 1
77 1 watch_dog();
78 1
79 1 if(status==0)
80 1 {
81 2 // loade2();
82 2
83 2 XBYTE[RegClockQControl]=0x0;
84 2 XBYTE[RegClockQControl]=0x40;
85 2
86 2 Delay(24);// wait approximately 100 us - calibration in progress
87 2 ClearBitMask(RegClockQControl,0x40); // clear bit ClkQCalib for
88 2
89 2 XBYTE[RegBitPhase]=0xAd;
90 2 XBYTE[RegRxThreshold]=0xFF;
91 2 XBYTE[RegRxControl2]=01;
92 2 XBYTE[RegFIFOLevel]=0x1A; // initialize to 26d
93 2 XBYTE[RegTimerControl]=0x02; // TStopRxEnd=0,TStopRxBeg=0,
94 2 XBYTE[RegIRqPinConfig]=0x3; // interrupt active low enable
95 2
96 2 status=PcdRfReset(1); // Rf - reset and enable output driver
97 2 }
98 1 return 1;
99 1 }
100 /****************************************************************************
101
102 Request 指令将通知MCM在天线有效的工作范围(距离)内寻找MIFARE 1卡片。如果有
103 MIFARE 1卡片存在,这一指令将分别与MIFARE 1进行通信,读取MIFARE 1卡片上的卡片
104 类型号TAGTYPE(2个字节),由MCM传递给MCU,进行识别处理。
105 程序员可以根据TAGTYPE来区别卡片的不同类型。
106 对于MIFARE 1卡片来说,返回卡片的TAGTYPE(2个字节)可能为0004h。
107
108 * Function: Mf500PiccRequest
- *
109 * Input: req_code *
110 * Output: TagType *
111 * *
112 ****************************************************************************/
113 char Mf500PiccRequest(unsigned char req_code,
114 unsigned char *atq)
115 {
116 1 char status = MI_OK;
C51 COMPILER V7.05 MFRC500C 10/09/2004 16:22:30 PAGE 3
117 1 char i;
118 1
119 1 PcdSetTmo(2);
120 1
121 1 WriteRC(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
122 1 ClearBitMask(RegControl,0x08); // disable crypto 1 unit
123 1 WriteRC(RegBitFraming,0x07); // set TxLastBits to 7
124 1
125 1 ResetInfo();
126 1 //AUXR=0;
127 1 MSndBuffer[0] = req_code;
128 1 MInfo.nBytesToSend = 1;
129 1 status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
130 1
131 1 if (status) // error occured
132 1 {
133 2 atq[0] = 0;
134 2 }
135 1 else
136 1 {
137 2 if (MInfo.nBitsReceived != 16) // 2 bytes expected
138 2 {
139 3 atq[0] = 0;
140 3 status = MI_BITCOUNTERR;
141 3 }
142 2 else
143 2 {
144 3 status = MI_OK;
145 3 for(i=0;i<2;i++) atq[i]=MRcvBuffer[i];
146 3 }
147 2 }
148 1
149 1 return status;
150 1 }
151 /****************************************************************************
152 *在一个成功的AntiCollision指令之后,或在任何时候当程序员想实际地与已知序列号
153 卡片进行通信时,必须使用Select指令,以建立与所选卡的通信。为了允许在Select指令
154 以后对卡片能进行Read/Write等指令的操作,Select指令是很重要的,必须首先被使用
155 被选择的卡片将给出其自己的存储器容量---已编码的一个BYTE(字节)
- *
156 * Function: Mf500PiccSelect *
157 * *
158 * Input: SNR 卡号 *
159 * Output: Size *
160 * *
161 ****************************************************************************/
162 char Mf500PiccSelect(unsigned char *snr,unsigned char *sak)
163 {
164 1 return Mf500PiccCascSelect(0x93,snr,sak); // first cascade level
165 1 }
166
167 char Mf500PiccCascSelect(unsigned char select_code,
168 unsigned char *snr,
169 unsigned char *sak)
170 {
171 1 char status = MI_OK;
172 1 char i;
173 1
174 1 PcdSetTmo(106);
175 1
176 1 WriteRC(RegChannelRedundancy,0x0F); // RxCRC,TxCRC, Parity enable
177 1 ClearBitMask(RegControl,0x08); // disable crypto 1 unit
C51 COMPILER V7.05 MFRC500C 10/09/2004 16:22:30 PAGE 4
178 1
179 1 ResetInfo();
180 1 MSndBuffer[0] = select_code;
181 1 MSndBuffer[1] = 0x70; // number of bytes send
182 1 for(i=0;i<4;i++) MSndBuffer[2+i]=snr[i];
183 1
184 1 //memcpy(MSndBuffer + 2,snr,4);
185 1 MSndBuffer[6] = MSndBuffer[2]
186 1 ^ MSndBuffer[3]
187 1 ^ MSndBuffer[4]
188 1 ^ MSndBuffer[5];
189 1 MInfo.nBytesToSend = 7;
190 1 status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
191 1
192 1 sak[0] = 0;
193 1 if (status == MI_OK) // no timeout occured
194 1 {
195 2 if (MInfo.nBitsReceived != 8) // last byte is not complete
196 2 {
197 3 status = MI_BITCOUNTERR;
198 3 }
199 2 else
200 2 {
201 3 sak[0] = MRcvBuffer[0];
202 3 memcpy(MLastSelectedSnr,snr,4);
203 3 }
204 2 }
205 1
206 1 return status;
207 1 }
208 /****************************************************************************
209 *如果有多于一张的Mifare 1卡片在MCM之天线的有效的工作范围(距离)内 ,必须使用
210 AntiCollision指令,使MCM能够在这一叠 Mifare 1卡片中选择个别的一张卡片。
211 *
212 * Function: Mf500PiccAnticoll//防碰撞函数 *
213 * *
214 * Input: Bcnt, SNR *
215 * Output: SNR *
216 * *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -