📄 m500auc.lst
字号:
289 1 MInfo.nBytesToSend = 2;
290 1 status = M500PcdCmd(PCD_TRANSCEIVE,
291 1 SerBuffer,
292 1 &MInfo);
293 1 if (status)
294 1 {
295 2 // timeout error ==> no NAK received ==> OK
296 2 if (status == MI_NOTAGERR || status == MI_ACCESSTIMEOUT)
297 2 {
298 3 status = MI_OK;
299 3 }
300 2 }
301 1 //reset command register - no response from tag
302 1 WriteIO(RegCommand,PCD_IDLE);
303 1 return status;
C51 COMPILER V7.50 M500AUC 06/14/2005 11:34:17 PAGE 6
304 1 }
305
306 ///////////////////////////////////////////////////////////////////////
307 // Reset the MF RC500
308 ///////////////////////////////////////////////////////////////////////
309 char M500PcdReset(void)
310 {
311 1 char idata status = MI_OK;
312 1 unsigned int idata timecnt=0;
313 1
314 1 RC500RST = 0;
315 1 delay_1ms(25);
316 1 RC500RST = 1;
317 1 delay_50us(200);
318 1 RC500RST = 0;
319 1 delay_50us(50);
320 1 timecnt=1000;
321 1 while ((ReadIO(RegCommand) & 0x3F) && timecnt--);
322 1 if(!timecnt)
323 1 {
324 2 status = MI_RESETERR;
325 2 }
326 1 if (status == MI_OK)
327 1 {
328 2 //WriteIO(RegPage,0x80);
329 2 if (ReadIO(RegCommand) != 0x00)
330 2 {
331 3 status = MI_INTERFACEERR;
332 3 }
333 2 }
334 1 return status;
335 1 }
336
337 ///////////////////////////////////////////////////////////////////////
338 // Configures the MF RC500
339 ///////////////////////////////////////////////////////////////////////
340 char M500PcdConfig(void)
341 {
342 1 char idata status;
343 1
344 1 if ((status = M500PcdReset()) == MI_OK)
345 1 {
346 2 WriteIO(RegClockQControl,0x00);
347 2 WriteIO(RegClockQControl,0x40);
348 2 delay_50us(2);
349 2 ClearBitMask(RegClockQControl,0x40);
350 2 WriteIO(RegBitPhase,0xAD);
351 2 WriteIO(RegRxThreshold,0xFF);
352 2 WriteIO(RegRxControl2,0x01);
353 2 WriteIO(RegFIFOLevel,0x1A);
354 2 WriteIO(RegTimerControl,0x02);
355 2 WriteIO(RegIRqPinConfig,0x03);
356 2 M500PcdRfReset(1);
357 2 }
358 1 return status;
359 1 }
360
361 ///////////////////////////////////////////////////////////////////////
362 // Select Command defined in ISO14443(MIFARE)
363 ///////////////////////////////////////////////////////////////////////
364 char M500PcdMfOutSelect(unsigned char type)
365 {
C51 COMPILER V7.50 M500AUC 06/14/2005 11:34:17 PAGE 7
366 1 WriteIO(RegMfOutSelect,type&0x7);
367 1 return MI_OK;
368 1 }
369
370 ///////////////////////////////////////////////////////////////////////
371 // Request Command defined in ISO14443(MIFARE)
372 // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
373 // 寻卡,防冲突,选择卡 返回卡类型(2 bytes)+ 卡系列号(4 bytes)
374 ///////////////////////////////////////////////////////////////////////
375 char M500PiccCommonRequest(unsigned char req_code,unsigned char *atq)
376 {
377 1 char idata status = MI_OK;
378 1
379 1 M500PcdSetTmo(3);
380 1 WriteIO(RegChannelRedundancy,0x03);
381 1 ClearBitMask(RegControl,0x08);
382 1 WriteIO(RegBitFraming,0x07);
383 1 SetBitMask(RegTxControl,0x03);
384 1 ResetInfo(MInfo);
385 1 SerBuffer[0] = req_code;
386 1 MInfo.nBytesToSend = 1;
387 1
388 1 status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
389 1 if (status)
390 1 {
391 2 *atq = 0;
392 2 }
393 1 else
394 1 {
395 2 if (MInfo.nBitsReceived != 16)
396 2 {
397 3 *atq = 0;
398 3 status = MI_BITCOUNTERR;
399 3 }
400 2 else
401 2 {
402 3 status = MI_OK;
403 3 memcpy(atq,SerBuffer,2);
404 3 }
405 2 }
406 1 return status;
407 1 }
408
409 ///////////////////////////////////////////////////////////////////
410 // Cascaded Anti-Collision Command defined in ISO14443(MIFARE)
411 // 防冲突 读卡的系列号 MLastSelectedSnr
412 ///////////////////////////////////////////////////////////////////
413 char M500PiccCascAnticoll (unsigned char bcnt,unsigned char *snr)
414 {
415 1 char idata status = MI_OK;
416 1 char idata snr_in[5];//snr_in[4];
417 1 char idata nbytes = 0;
418 1 char idata nbits = 0;
419 1 char idata complete = 0;
420 1 char idata i = 0;
421 1 char idata byteOffset = 0;
422 1 unsigned char dummyShift1;
423 1 unsigned char dummyShift2;
424 1
425 1 M500PcdSetTmo(106);
426 1 memcpy(snr_in,snr,5);//memcpy(snr_in,snr,4);
427 1
C51 COMPILER V7.50 M500AUC 06/14/2005 11:34:17 PAGE 8
428 1 WriteIO(RegDecoderControl,0x28);
429 1 ClearBitMask(RegControl,0x08);
430 1 complete = 0;
431 1 while (!complete && (status == MI_OK) )
432 1 {
433 2 ResetInfo(MInfo);
434 2 WriteIO(RegChannelRedundancy,0x03);
435 2 nbits = bcnt % 8;
436 2 if(nbits)
437 2 {
438 3 WriteIO(RegBitFraming,nbits << 4| nbits);
439 3 nbytes = bcnt / 8 + 1;
440 3 if (nbits == 7)
441 3 {
442 4 MInfo.cmd = PICC_ANTICOLL1;
443 4 WriteIO(RegBitFraming,nbits);
444 4 }
445 3 }
446 2 else
447 2 {
448 3 nbytes = bcnt / 8;
449 3 }
450 2 SerBuffer[0] = 0x93;
451 2 SerBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;
452 2
453 2 for (i = 0; i < nbytes; i++)
454 2 {
455 3 SerBuffer[i + 2] = snr_in[i];
456 3 }
457 2 MInfo.nBytesToSend = 2 + nbytes;
458 2
459 2 status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
460 2 if (nbits == 7)
461 2 {
462 3 dummyShift1 = 0x00;
463 3 for (i = 0; i < MInfo.nBytesReceived; i++)
464 3 {
465 4 dummyShift2 = SerBuffer[i];
466 4 SerBuffer[i] = (dummyShift1 >> (i+1)) | (SerBuffer[i] << (7-i));
467 4 dummyShift1 = dummyShift2;
468 4 }
469 3 MInfo.nBitsReceived -= MInfo.nBytesReceived;
470 3 if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
471 3 }
472 2 if ( status == MI_OK || status == MI_COLLERR)
473 2 {
474 3 if ( MInfo.nBitsReceived != (40 - bcnt) )
475 3 {
476 4 status = MI_BITCOUNTERR;
477 4 }
478 3 else
479 3 {
480 4 byteOffset = 0;
481 4 if( nbits != 0 )
482 4 {
483 5 snr_in[nbytes - 1] = snr_in[nbytes - 1] | SerBuffer[0];
484 5 byteOffset = 1;
485 5 }
486 4
487 4 for ( i =0; i < (4 - nbytes); i++)
488 4 {
489 5 snr_in[nbytes + i] = SerBuffer[i + byteOffset];
C51 COMPILER V7.50 M500AUC 06/14/2005 11:34:17 PAGE 9
490 5 }
491 4
492 4 if (status != MI_COLLERR )
493 4 {
494 5 dummyShift2 = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
495 5 dummyShift1 = SerBuffer[MInfo.nBytesReceived - 1];
496 5 if (dummyShift2 != dummyShift1)
497 5 {
498 6 status = MI_SERNRERR;
499 6 }
500 5 else
501 5 {
502 6 complete = 1;
503 6 }
504 5 }
505 4 else
506 4 {
507 5 bcnt = bcnt + MInfo.collPos - nbits;
508 5 status = MI_OK;
509 5 }
510 4 }
511 3 }
512 2 }
513 1 if (status == MI_OK)
514 1 {
515 2 snr_in[4]=dummyShift1;
516 2 memcpy(snr,snr_in,5);
517 2 }
518 1 else
519 1 {
520 2 memcpy(snr,"00000",5);
521 2 }
522 1 ClearBitMask(RegDecoderControl,0x20);
523 1
524 1 return status;
525 1 }
526
527 ///////////////////////////////////////////////////////////////////////
528 // Reset Rf Card
529 ///////////////////////////////////////////////////////////////////////
530 char M500PcdRfReset(unsigned char ms)
531 {
532 1 char idata status = MI_OK;
533 1
534 1 if(ms)
535 1 {
536 2 ClearBitMask(RegTxControl,0x03);
537 2 delay_1ms(2);
538 2 SetBitMask(RegTxControl,0x03);
539 2 }
540 1 else
541 1 {
542 2 ClearBitMask(RegTxControl,0x03);
543 2 }
544 1 return status;
545 1 }
546
547 #pragma noaregs
548
549 ///////////////////////////////////////////////////////////////////////
550 // Delay 50us
551 ///////////////////////////////////////////////////////////////////////
C51 COMPILER V7.50 M500AUC 06/14/2005 11:34:17 PAGE 10
552 void delay_50us(unsigned char _50us)
553 {
554 1 while(_50us--)
555 1 {
556 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
557 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
558 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
559 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
560 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
561 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
562 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
563 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
564 2 }
565 1 }
566
567 ///////////////////////////////////////////////////////////////////////
568 // Delay 1ms
569 ///////////////////////////////////////////////////////////////////////
570 void delay_1ms(unsigned char _1ms)
571 {
572 1 #ifndef NO_TIMER2
RCAP2LH = RCAP2_1ms;
T2LH = RCAP2_1ms;
TR2 = TRUE;
while (_1ms--)
{
while (!TF2);
TF2 = FALSE;
}
TR2 = FALSE;
#else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -