📄 rc522.lst
字号:
214 2 { status = MI_ERR; }
215 2 }
216 1
217 1 return status;
218 1 }
219
220 /////////////////////////////////////////////////////////////////////
221 //功 能:扣款和充值
222 //参数说明: dd_mode[IN]:命令字
223 // 0xC0 = 扣款
224 // 0xC1 = 充值
225 // addr[IN]:钱包地址
226 // pValue[IN]:4字节增(减)值,低位在前
227 //返 回: 成功返回MI_OK
228 /////////////////////////////////////////////////////////////////////
229 char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
230 {
231 1 char status;
232 1 unsigned int unLen;
233 1 unsigned char i,ucComMF522Buf[MAXRLEN];
234 1
235 1 ucComMF522Buf[0] = dd_mode;
236 1 ucComMF522Buf[1] = addr;
237 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
238 1
239 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
240 1
241 1 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 5
242 1 { status = MI_ERR; }
243 1
244 1 if (status == MI_OK)
245 1 {
246 2 // memcpy(ucComMF522Buf, pValue, 4);
247 2 for (i=0; i<16; i++)
248 2 { ucComMF522Buf[i] = *(pValue+i); }
249 2 CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
250 2 unLen = 0;
251 2 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
252 2 if (status != MI_ERR)
253 2 { status = MI_OK; }
254 2 }
255 1
256 1 if (status == MI_OK)
257 1 {
258 2 ucComMF522Buf[0] = PICC_TRANSFER;
259 2 ucComMF522Buf[1] = addr;
260 2 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
261 2
262 2 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
263 2
264 2 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
265 2 { status = MI_ERR; }
266 2 }
267 1 return status;
268 1 }
269
270 /////////////////////////////////////////////////////////////////////
271 //功 能:备份钱包
272 //参数说明: sourceaddr[IN]:源地址
273 // goaladdr[IN]:目标地址
274 //返 回: 成功返回MI_OK
275 /////////////////////////////////////////////////////////////////////
276 char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
277 {
278 1 char status;
279 1 unsigned int unLen;
280 1 unsigned char ucComMF522Buf[MAXRLEN];
281 1
282 1 ucComMF522Buf[0] = PICC_RESTORE;
283 1 ucComMF522Buf[1] = sourceaddr;
284 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
285 1
286 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
287 1
288 1 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
289 1 { status = MI_ERR; }
290 1
291 1 if (status == MI_OK)
292 1 {
293 2 ucComMF522Buf[0] = 0;
294 2 ucComMF522Buf[1] = 0;
295 2 ucComMF522Buf[2] = 0;
296 2 ucComMF522Buf[3] = 0;
297 2 CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
298 2
299 2 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
300 2 if (status != MI_ERR)
301 2 { status = MI_OK; }
302 2 }
303 1
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 6
304 1 if (status != MI_OK)
305 1 { return MI_ERR; }
306 1
307 1 ucComMF522Buf[0] = PICC_TRANSFER;
308 1 ucComMF522Buf[1] = goaladdr;
309 1
310 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
311 1
312 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
313 1
314 1 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
315 1 { status = MI_ERR; }
316 1
317 1 return status;
318 1 }
319
320
321 /////////////////////////////////////////////////////////////////////
322 //功 能:命令卡片进入休眠状态
323 //返 回: 成功返回MI_OK
324 /////////////////////////////////////////////////////////////////////
325 char PcdHalt(void)
326 {
327 1 char status;
328 1 unsigned int unLen;
329 1 unsigned char ucComMF522Buf[MAXRLEN];
330 1
331 1 ucComMF522Buf[0] = PICC_HALT;
332 1 ucComMF522Buf[1] = 0;
333 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
334 1
335 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
336 1
337 1 return MI_OK;
338 1 }
339
340 /////////////////////////////////////////////////////////////////////
341 //用MF522计算CRC16函数
342 /////////////////////////////////////////////////////////////////////
343 void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
344 {
345 1 unsigned char i,n;
346 1 ClearBitMask(DivIrqReg,0x04);
347 1 WriteRawRC(CommandReg,PCD_IDLE);
348 1 SetBitMask(FIFOLevelReg,0x80);
349 1 for (i=0; i<len; i++)
350 1 { WriteRawRC(FIFODataReg, *(pIndata+i)); }
351 1 WriteRawRC(CommandReg, PCD_CALCCRC);
352 1 i = 0xFF;
353 1 do
354 1 {
355 2 n = ReadRawRC(DivIrqReg);
356 2 i--;
357 2 }
358 1 while ((i!=0) && !(n&0x04));
359 1 pOutData[0] = ReadRawRC(CRCResultRegL);
360 1 pOutData[1] = ReadRawRC(CRCResultRegM);
361 1 }
362
363 /////////////////////////////////////////////////////////////////////
364 //功 能:复位RC522
365 //返 回: 成功返回MI_OK
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 7
366 /////////////////////////////////////////////////////////////////////
367 char PcdReset(void)
368 {
369 1 MF522_RST=1;
370 1 _nop_();
371 1 MF522_RST=0;
372 1 _nop_();
373 1 MF522_RST=1;
374 1 _nop_();
375 1 WriteRawRC(CommandReg,PCD_RESETPHASE);
376 1 _nop_();
377 1
378 1 WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363
379 1 WriteRawRC(TReloadRegL,30);
380 1 WriteRawRC(TReloadRegH,0);
381 1 WriteRawRC(TModeReg,0x8D);
382 1 WriteRawRC(TPrescalerReg,0x3E);
383 1 WriteRawRC(TxAutoReg,0x40);
384 1 return MI_OK;
385 1 }
386 //////////////////////////////////////////////////////////////////////
387 //设置RC632的工作方式
388 //////////////////////////////////////////////////////////////////////
389 char M500PcdConfigISOType(unsigned char type)
390 {
391 1 if (type == 'A') //ISO14443_A
392 1 {
393 2 ClearBitMask(Status2Reg,0x08);
394 2
395 2 /* WriteRawRC(CommandReg,0x20); //as default
396 2 WriteRawRC(ComIEnReg,0x80); //as default
397 2 WriteRawRC(DivlEnReg,0x0); //as default
398 2 WriteRawRC(ComIrqReg,0x04); //as default
399 2 WriteRawRC(DivIrqReg,0x0); //as default
400 2 WriteRawRC(Status2Reg,0x0);//80 //trun off temperature sensor
401 2 WriteRawRC(WaterLevelReg,0x08); //as default
402 2 WriteRawRC(ControlReg,0x20); //as default
403 2 WriteRawRC(CollReg,0x80); //as default
404 2 */
405 2 WriteRawRC(ModeReg,0x3D);//3F
406 2 /* WriteRawRC(TxModeReg,0x0); //as default???
407 2 WriteRawRC(RxModeReg,0x0); //as default???
408 2 WriteRawRC(TxControlReg,0x80); //as default???
409 2
410 2 WriteRawRC(TxSelReg,0x10); //as default???
411 2 */
412 2 WriteRawRC(RxSelReg,0x86);//84
413 2 // WriteRawRC(RxThresholdReg,0x84);//as default
414 2 // WriteRawRC(DemodReg,0x4D); //as default
415 2
416 2 // WriteRawRC(ModWidthReg,0x13);//26
417 2 WriteRawRC(RFCfgReg,0x7F); //4F
418 2 /* WriteRawRC(GsNReg,0x88); //as default???
419 2 WriteRawRC(CWGsCfgReg,0x20); //as default???
420 2 WriteRawRC(ModGsCfgReg,0x20); //as default???
421 2 */
422 2 WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
423 2 WriteRawRC(TReloadRegH,0);
424 2 WriteRawRC(TModeReg,0x8D);
425 2 WriteRawRC(TPrescalerReg,0x3E);
426 2
427 2
C51 COMPILER V7.07 RC522 02/12/2007 09:56:17 PAGE 8
428 2 // PcdSetTmo(106);
429 2 DelayMs(1);
430 2 PcdAntennaOn();
431 2 }
432 1 else{ return -1; }
433 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -