📄 iso14443a.lst
字号:
270 1 MfComData.MfData[1] = block;
271 1 memcpy(&MfComData.MfData[2], pSnr, 4);
272 1
273 1 status = PcdComTransceive(pi);
274 1 if (status == MI_OK)
275 1 {
276 2 if (ReadRawRC(RegSecondaryStatus) & 0x07)
277 2 { status = MI_BITCOUNTERR; }
278 2 else
279 2 {
280 3 MfComData.MfCommand = PCD_AUTHENT2;
281 3 MfComData.MfLength = 0;
282 3 status = PcdComTransceive(pi);
283 3 if (status == MI_OK)
284 3 {
285 4 if (ReadRawRC(RegControl) & 0x08)
286 4 { status = MI_OK; }
287 4 else
288 4 { status = MI_AUTHERR; }
289 4
290 4 }
291 3 }
292 2 }
293 1 return status;
294 1 }
295
296 /////////////////////////////////////////////////////////////////////
297 //读mifare_one卡上一块(block)数据(16字节)
298 //input: addr = 要读的绝对块号
299 //output:readdata = 读出的数据
300 /////////////////////////////////////////////////////////////////////
301 char PcdRead(unsigned char addr,unsigned char *pReaddata)
302 {
303 1 char status;
C51 COMPILER V8.05a ISO14443A 07/05/2010 23:34:45 PAGE 6
304 1 struct TranSciveBuffer MfComData;
305 1 struct TranSciveBuffer *pi;
306 1 pi = &MfComData;
307 1
308 1 PcdSetTmo(4);
309 1 WriteRawRC(RegChannelRedundancy,0x0F);
310 1 MfComData.MfCommand = PCD_TRANSCEIVE;
311 1 MfComData.MfLength = 2;
312 1 MfComData.MfData[0] = PICC_READ;
313 1 MfComData.MfData[1] = addr;
314 1
315 1 status = PcdComTransceive(pi);
316 1 if (status == MI_OK)
317 1 {
318 2 if (MfComData.MfLength != 0x80)
319 2 { status = MI_BITCOUNTERR; }
320 2 else
321 2 { memcpy(pReaddata, &MfComData.MfData[0], 16); }
322 2 }
323 1 return status;
324 1 }
325
326 /////////////////////////////////////////////////////////////////////
327 //写数据到卡上的一块
328 //input:adde=要写的绝对块号
329 // writedata=写入数据
330 /////////////////////////////////////////////////////////////////////
331 char PcdWrite(unsigned char addr,unsigned char *pWritedata)
332 {
333 1 char status;
334 1 struct TranSciveBuffer MfComData;
335 1 struct TranSciveBuffer *pi;
336 1 pi = &MfComData;
337 1
338 1 PcdSetTmo(5);
339 1 WriteRawRC(RegChannelRedundancy,0x07);
340 1 MfComData.MfCommand = PCD_TRANSCEIVE;
341 1 MfComData.MfLength = 2;
342 1 MfComData.MfData[0] = PICC_WRITE;
343 1 MfComData.MfData[1] = addr;
344 1
345 1 status = PcdComTransceive(pi);
346 1 if (status != MI_NOTAGERR)
347 1 {
348 2 if(MfComData.MfLength != 4)
349 2 { status=MI_BITCOUNTERR; }
350 2 else
351 2 {
352 3 MfComData.MfData[0] &= 0x0F;
353 3 switch (MfComData.MfData[0])
354 3 {
355 4 case 0x00:
356 4 status = MI_NOTAUTHERR;
357 4 break;
358 4 case 0x0A:
359 4 status = MI_OK;
360 4 break;
361 4 default:
362 4 status = MI_CODEERR;
363 4 break;
364 4 }
365 3 }
C51 COMPILER V8.05a ISO14443A 07/05/2010 23:34:45 PAGE 7
366 2 }
367 1 if (status == MI_OK)
368 1 {
369 2 PcdSetTmo(5);
370 2 MfComData.MfCommand = PCD_TRANSCEIVE;
371 2 MfComData.MfLength = 16;
372 2 memcpy(&MfComData.MfData[0], pWritedata, 16);
373 2
374 2 status = PcdComTransceive(pi);
375 2 if (status != MI_NOTAGERR)
376 2 {
377 3 MfComData.MfData[0] &= 0x0F;
378 3 switch(MfComData.MfData[0])
379 3 {
380 4 case 0x00:
381 4 status = MI_WRITEERR;
382 4 break;
383 4 case 0x0A:
384 4 status = MI_OK;
385 4 break;
386 4 default:
387 4 status = MI_CODEERR;
388 4 break;
389 4 }
390 3 }
391 2 PcdSetTmo(4);
392 2 }
393 1 return status;
394 1 }
395
396 /////////////////////////////////////////////////////////////////////
397 //扣款和充值
398 //input:dd_mode=命令字,0xC0:扣款,0xC1:充值
399 // addr=钱包的绝对块号
400 // value=4字节增(减)值首地址,16进制数,低位在前
401 /////////////////////////////////////////////////////////////////////
402 char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
403 {
404 1 char status;
405 1 struct TranSciveBuffer MfComData;
406 1 struct TranSciveBuffer *pi;
407 1 pi = &MfComData;
408 1
409 1 PcdSetTmo(5);
410 1 WriteRawRC(RegChannelRedundancy,0x0F);
411 1 MfComData.MfCommand = PCD_TRANSCEIVE;
412 1 MfComData.MfLength = 2;
413 1 MfComData.MfData[0] = dd_mode;
414 1 MfComData.MfData[1] = addr;
415 1
416 1 status = PcdComTransceive(pi);
417 1 if (status != MI_NOTAGERR)
418 1 {
419 2 if (MfComData.MfLength != 4)
420 2 { status = MI_BITCOUNTERR; }
421 2 else
422 2 {
423 3 MfComData.MfData[0] &= 0x0F;
424 3 switch (MfComData.MfData[0])
425 3 {
426 4 case 0x00:
427 4 status = MI_NOTAUTHERR;
C51 COMPILER V8.05a ISO14443A 07/05/2010 23:34:45 PAGE 8
428 4 break;
429 4 case 0x0A:
430 4 status = MI_OK;
431 4 break;
432 4 case 0x01:
433 4 status = MI_VALERR;
434 4 break;
435 4 default:
436 4 status = MI_CODEERR;
437 4 break;
438 4 }
439 3 }
440 2 }
441 1 if (status == MI_OK)
442 1 {
443 2 PcdSetTmo(5);
444 2 MfComData.MfCommand = PCD_TRANSCEIVE;
445 2 MfComData.MfLength = 4;
446 2 pi = &MfComData;
447 2 memcpy(&MfComData.MfData[0], pValue, 4);
448 2
449 2 status = PcdComTransceive(pi);
450 2 if (status==MI_OK)
451 2 {
452 3 if (MfComData.MfLength != 4)
453 3 { status = MI_BITCOUNTERR; }
454 3 else
455 3 { status = MI_OK; }
456 3 }
457 2 else if(status == MI_NOTAGERR)
458 2 { status = MI_OK; }
459 2 else
460 2 { status=MI_COM_ERR; }
461 2 }
462 1
463 1 if (status == MI_OK)
464 1 {
465 2 MfComData.MfCommand = PCD_TRANSCEIVE;
466 2 MfComData.MfLength = 2;
467 2 MfComData.MfData[0] = PICC_TRANSFER;
468 2 MfComData.MfData[1] = addr;
469 2
470 2 status = PcdComTransceive(pi);
471 2 if (status != MI_NOTAGERR)
472 2 {
473 3 if (MfComData.MfLength != 4)
474 3 { status = MI_BITCOUNTERR; }
475 3 else
476 3 {
477 4 MfComData.MfData[0] &= 0x0F;
478 4 switch(MfComData.MfData[0])
479 4 {
480 5 case 0x00:
481 5 status = MI_NOTAUTHERR;
482 5 break;
483 5 case 0x0a:
484 5 status = MI_OK;
485 5 break;
486 5 case 0x01:
487 5 status = MI_VALERR;
488 5 break;
489 5 default:
C51 COMPILER V8.05a ISO14443A 07/05/2010 23:34:45 PAGE 9
490 5 status = MI_CODEERR;
491 5 break;
492 5 }
493 4 }
494 3 }
495 2 }
496 1 return status;
497 1 }
498
499 /////////////////////////////////////////////////////////////////////
500 //将mifare_one卡一块数据调入卡缓冲区
501 //input:addr=绝对块号
502 /////////////////////////////////////////////////////////////////////
503 char PcdRestore(unsigned char addr)
504 {
505 1 char status;
506 1 struct TranSciveBuffer MfComData;
507 1 struct TranSciveBuffer *pi;
508 1 pi = &MfComData;
509 1
510 1 PcdSetTmo(4);
511 1 MfComData.MfCommand = PCD_TRANSCEIVE;
512 1 MfComData.MfLength = 2;
513 1 MfComData.MfData[0] = PICC_RESTORE;
514 1 MfComData.MfData[1] = addr;
515 1
516 1 status = PcdComTransceive(pi);
517 1 if (status != MI_NOTAGERR)
518 1 {
519 2 if (MfComData.MfLength != 4)
520 2 { status = MI_BITCOUNTERR; }
521 2 else
522 2 {
523 3 MfComData.MfData[0] &= 0x0F;
524 3 switch(MfComData.MfData[0])
525 3 {
526 4 case 0x00:
527 4 status = MI_NOTAUTHERR;
528 4 break;
529 4 case 0x0A:
530 4 status = MI_OK;
531 4 break;
532 4 case 0x01:
533 4 status = MI_VALERR;
534 4 break;
535 4 default:
536 4 status = MI_CODEERR;
537 4 break;
538 4 }
539 3 }
540 2 }
541 1 if (status == MI_OK)
542 1 {
543 2 PcdSetTmo(4);
544 2 MfComData.MfCommand = PCD_TRANSCEIVE;
545 2 MfComData.MfLength = 4;
546 2 MfComData.MfData[0] = 0;
547 2 MfComData.MfData[1] = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -