📄 rc522.lst
字号:
C51 COMPILER V7.20 RC522 12/15/2005 16:36:52 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE RC522
OBJECT MODULE PLACED IN RC522.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE RC522.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <intrins.h>
2 #include "lpcreg.h"
3 #include "main.h"
4 #include "mfrc522.h"
5 #define MAXRLEN 18
6
7 /////////////////////////////////////////////////////////////////////
8 //功 能:寻卡
9 //参数说明: req_code[IN]:寻卡方式
10 // 0x52 = 寻感应区内所有符合14443A标准的卡
11 // 0x26 = 寻未进入休眠状态的卡
12 // pTagType[OUT]:卡片类型代码
13 // 0x4400 = Mifare_UltraLight
14 // 0x0400 = Mifare_One(S50)
15 // 0x0200 = Mifare_One(S70)
16 // 0x0800 = Mifare_Pro(X)
17 // 0x4403 = Mifare_DESFire
18 //返 回: 成功返回MI_OK
19 /////////////////////////////////////////////////////////////////////
20 char PcdRequest(unsigned char req_code,unsigned char *pTagType)
21 {
22 1 char status;
23 1 unsigned int unLen;
24 1 unsigned char ucComMF522Buf[MAXRLEN];
25 1
26 1 ClearBitMask(Status2Reg,0x08);
27 1 WriteRawRC(BitFramingReg,0x07);
28 1 SetBitMask(TxControlReg,0x03);
29 1
30 1 ucComMF522Buf[0] = req_code;
31 1
32 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
33 1
34 1 if ((status == MI_OK) && (unLen == 0x10))
35 1 {
36 2 *pTagType = ucComMF522Buf[0];
37 2 *(pTagType+1) = ucComMF522Buf[1];
38 2 }
39 1 else
40 1 { status = MI_ERR; }
41 1
42 1 return status;
43 1 }
44
45 /////////////////////////////////////////////////////////////////////
46 //功 能:防冲撞
47 //参数说明: pSnr[OUT]:卡片序列号,4字节
48 //返 回: 成功返回MI_OK
49 /////////////////////////////////////////////////////////////////////
50 char PcdAnticoll(unsigned char *pSnr)
51 {
52 1 char status;
53 1 unsigned char i,snr_check=0;
54 1 unsigned int unLen;
55 1 unsigned char ucComMF522Buf[MAXRLEN];
C51 COMPILER V7.20 RC522 12/15/2005 16:36:52 PAGE 2
56 1
57 1
58 1 ClearBitMask(Status2Reg,0x08);
59 1 WriteRawRC(BitFramingReg,0x00);
60 1 ClearBitMask(CollReg,0x80);
61 1
62 1 ucComMF522Buf[0] = PICC_ANTICOLL1;
63 1 ucComMF522Buf[1] = 0x20;
64 1
65 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
66 1
67 1 if (status == MI_OK)
68 1 {
69 2 for (i=0; i<4; i++)
70 2 {
71 3 *(pSnr+i) = ucComMF522Buf[i];
72 3 snr_check ^= ucComMF522Buf[i];
73 3 }
74 2 if (snr_check != ucComMF522Buf[i])
75 2 { status = MI_ERR; }
76 2 }
77 1
78 1 SetBitMask(CollReg,0x80);
79 1 return status;
80 1 }
81
82 /////////////////////////////////////////////////////////////////////
83 //功 能:选定卡片
84 //参数说明: pSnr[IN]:卡片序列号,4字节
85 //返 回: 成功返回MI_OK
86 /////////////////////////////////////////////////////////////////////
87 char PcdSelect(unsigned char *pSnr)
88 {
89 1 char status;
90 1 unsigned char i;
91 1 unsigned int unLen;
92 1 unsigned char ucComMF522Buf[MAXRLEN];
93 1
94 1 ucComMF522Buf[0] = PICC_ANTICOLL1;
95 1 ucComMF522Buf[1] = 0x70;
96 1 ucComMF522Buf[6] = 0;
97 1 for (i=0; i<4; i++)
98 1 {
99 2 ucComMF522Buf[i+2] = *(pSnr+i);
100 2 ucComMF522Buf[6] ^= *(pSnr+i);
101 2 }
102 1 CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
103 1
104 1 ClearBitMask(Status2Reg,0x08);
105 1
106 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
107 1
108 1 if ((status == MI_OK) && (unLen == 0x18))
109 1 { status = MI_OK; }
110 1 else
111 1 { status = MI_ERR; }
112 1
113 1 return status;
114 1 }
115
116 /////////////////////////////////////////////////////////////////////
117 //功 能:验证卡片密码
C51 COMPILER V7.20 RC522 12/15/2005 16:36:52 PAGE 3
118 //参数说明: auth_mode[IN]: 密码验证模式
119 // 0x60 = 验证A密钥
120 // 0x61 = 验证B密钥
121 // addr[IN]:块地址
122 // pKey[IN]:密码
123 // pSnr[IN]:卡片序列号,4字节
124 //返 回: 成功返回MI_OK
125 /////////////////////////////////////////////////////////////////////
126 char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
127 {
128 1 char status;
129 1 unsigned int unLen;
130 1 unsigned char i,ucComMF522Buf[MAXRLEN];
131 1
132 1 ucComMF522Buf[0] = auth_mode;
133 1 ucComMF522Buf[1] = addr;
134 1 for (i=0; i<6; i++)
135 1 { ucComMF522Buf[i+2] = *(pKey+i); }
136 1 for (i=0; i<6; i++)
137 1 { ucComMF522Buf[i+8] = *(pSnr+i); }
138 1 // memcpy(&ucComMF522Buf[2], pKey, 6);
139 1 // memcpy(&ucComMF522Buf[8], pSnr, 4);
140 1
141 1 status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
142 1 if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
143 1 { status = MI_ERR; }
144 1
145 1 return status;
146 1 }
147
148 /////////////////////////////////////////////////////////////////////
149 //功 能:读取M1卡一块数据
150 //参数说明: addr[IN]:块地址
151 // pData[OUT]:读出的数据,16字节
152 //返 回: 成功返回MI_OK
153 /////////////////////////////////////////////////////////////////////
154 char PcdRead(unsigned char addr,unsigned char *pData)
155 {
156 1 char status;
157 1 unsigned int unLen;
158 1 unsigned char i,ucComMF522Buf[MAXRLEN];
159 1
160 1 ucComMF522Buf[0] = PICC_READ;
161 1 ucComMF522Buf[1] = addr;
162 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
163 1
164 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
165 1 if ((status == MI_OK) && (unLen == 0x90))
166 1 // { memcpy(pData, ucComMF522Buf, 16); }
167 1 {
168 2 for (i=0; i<16; i++)
169 2 { *(pData+i) = ucComMF522Buf[i]; }
170 2 }
171 1 else
172 1 { status = MI_ERR; }
173 1
174 1 return status;
175 1 }
176
177 /////////////////////////////////////////////////////////////////////
178 //功 能:写数据到M1卡一块
179 //参数说明: addr[IN]:块地址
C51 COMPILER V7.20 RC522 12/15/2005 16:36:52 PAGE 4
180 // pData[IN]:写入的数据,16字节
181 //返 回: 成功返回MI_OK
182 /////////////////////////////////////////////////////////////////////
183 char PcdWrite(unsigned char addr,unsigned char *pData)
184 {
185 1 char status;
186 1 unsigned int unLen;
187 1 unsigned char i,ucComMF522Buf[MAXRLEN];
188 1
189 1 ucComMF522Buf[0] = PICC_WRITE;
190 1 ucComMF522Buf[1] = addr;
191 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
192 1
193 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
194 1
195 1 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
196 1 { status = MI_ERR; }
197 1
198 1 if (status == MI_OK)
199 1 {
200 2 //memcpy(ucComMF522Buf, pData, 16);
201 2 for (i=0; i<16; i++)
202 2 { ucComMF522Buf[i] = *(pData+i); }
203 2 CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
204 2
205 2 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
206 2 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
207 2 { status = MI_ERR; }
208 2 }
209 1
210 1 return status;
211 1 }
212
213 /////////////////////////////////////////////////////////////////////
214 //功 能:扣款和充值
215 //参数说明: dd_mode[IN]:命令字
216 // 0xC0 = 扣款
217 // 0xC1 = 充值
218 // addr[IN]:钱包地址
219 // pValue[IN]:4字节增(减)值,低位在前
220 //返 回: 成功返回MI_OK
221 /////////////////////////////////////////////////////////////////////
222 char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
223 {
224 1 char status;
225 1 unsigned int unLen;
226 1 unsigned char i,ucComMF522Buf[MAXRLEN];
227 1
228 1 ucComMF522Buf[0] = dd_mode;
229 1 ucComMF522Buf[1] = addr;
230 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
231 1
232 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
233 1
234 1 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
235 1 { status = MI_ERR; }
236 1
237 1 if (status == MI_OK)
238 1 {
239 2 // memcpy(ucComMF522Buf, pValue, 4);
240 2 for (i=0; i<16; i++)
241 2 { ucComMF522Buf[i] = *(pValue+i); }
C51 COMPILER V7.20 RC522 12/15/2005 16:36:52 PAGE 5
242 2 CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
243 2 unLen = 0;
244 2 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
245 2 if (status != MI_ERR)
246 2 { status = MI_OK; }
247 2 }
248 1
249 1 if (status == MI_OK)
250 1 {
251 2 ucComMF522Buf[0] = PICC_TRANSFER;
252 2 ucComMF522Buf[1] = addr;
253 2 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
254 2
255 2 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
256 2
257 2 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
258 2 { status = MI_ERR; }
259 2 }
260 1 return status;
261 1 }
262
263 /////////////////////////////////////////////////////////////////////
264 //功 能:备份钱包
265 //参数说明: sourceaddr[IN]:源地址
266 // goaladdr[IN]:目标地址
267 //返 回: 成功返回MI_OK
268 /////////////////////////////////////////////////////////////////////
269 char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
270 {
271 1 char status;
272 1 unsigned int unLen;
273 1 unsigned char ucComMF522Buf[MAXRLEN];
274 1
275 1 ucComMF522Buf[0] = PICC_RESTORE;
276 1 ucComMF522Buf[1] = sourceaddr;
277 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
278 1
279 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
280 1
281 1 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
282 1 { status = MI_ERR; }
283 1
284 1 if (status == MI_OK)
285 1 {
286 2 ucComMF522Buf[0] = 0;
287 2 ucComMF522Buf[1] = 0;
288 2 ucComMF522Buf[2] = 0;
289 2 ucComMF522Buf[3] = 0;
290 2 CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
291 2
292 2 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
293 2 if (status != MI_ERR)
294 2 { status = MI_OK; }
295 2 }
296 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -