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