📄 rc522.lst
字号:
297 1 if (status != MI_OK)
298 1 { return MI_ERR; }
299 1
300 1 ucComMF522Buf[0] = PICC_TRANSFER;
301 1 ucComMF522Buf[1] = goaladdr;
302 1
303 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
C51 COMPILER V7.20 RC522 12/15/2005 16:36:52 PAGE 6
304 1
305 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
306 1
307 1 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
308 1 { status = MI_ERR; }
309 1
310 1 return status;
311 1 }
312
313
314 /////////////////////////////////////////////////////////////////////
315 //功 能:命令卡片进入休眠状态
316 //返 回: 成功返回MI_OK
317 /////////////////////////////////////////////////////////////////////
318 char PcdHalt(void)
319 {
320 1 char status;
321 1 unsigned int unLen;
322 1 unsigned char ucComMF522Buf[MAXRLEN];
323 1
324 1 ucComMF522Buf[0] = PICC_HALT;
325 1 ucComMF522Buf[1] = 0;
326 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
327 1
328 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
329 1
330 1 return MI_OK;
331 1 }
332
333 /////////////////////////////////////////////////////////////////////
334 //用MF522计算CRC16函数
335 /////////////////////////////////////////////////////////////////////
336 void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
337 {
338 1 unsigned char i,n;
339 1 ClearBitMask(DivIrqReg,0x04);
340 1 WriteRawRC(CommandReg,PCD_IDLE);
341 1 SetBitMask(FIFOLevelReg,0x80);
342 1 for (i=0; i<len; i++)
343 1 { WriteRawRC(FIFODataReg, *(pIndata+i)); }
344 1 WriteRawRC(CommandReg, PCD_CALCCRC);
345 1 i = 0xFF;
346 1 do
347 1 {
348 2 n = ReadRawRC(DivIrqReg);
349 2 i--;
350 2 }
351 1 while ((i!=0) && !(n&0x04));
352 1 pOutData[0] = ReadRawRC(CRCResultRegL);
353 1 pOutData[1] = ReadRawRC(CRCResultRegM);
354 1 }
355
356 /////////////////////////////////////////////////////////////////////
357 //功 能:复位RC522
358 //返 回: 成功返回MI_OK
359 /////////////////////////////////////////////////////////////////////
360 char PcdReset(void)
361 {
362 1 MF522_RST=1;
363 1 _nop_();
364 1 MF522_RST=0;
365 1 _nop_();
C51 COMPILER V7.20 RC522 12/15/2005 16:36:52 PAGE 7
366 1 MF522_RST=1;
367 1 _nop_();
368 1 WriteRawRC(CommandReg,PCD_RESETPHASE);
369 1 _nop_();
370 1
371 1 WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363
372 1 WriteRawRC(TReloadRegL,30);
373 1 WriteRawRC(TReloadRegH,0);
374 1 WriteRawRC(TModeReg,0x8D);
375 1 WriteRawRC(TPrescalerReg,0x3E);
376 1
377 1 return MI_OK;
378 1 }
379
380 /////////////////////////////////////////////////////////////////////
381 //功 能:读RC632寄存器
382 //参数说明:Address[IN]:寄存器地址
383 //返 回:读出的值
384 /////////////////////////////////////////////////////////////////////
385 unsigned char ReadRawRC(unsigned char Address)
386 {
387 1 unsigned char i, ucAddr;
388 1 unsigned char ucResult=0;
389 1
390 1 MF522_SCK = 0;
391 1 MF522_NSS = 0;
392 1 ucAddr = ((Address<<1)&0x7E)|0x80;
393 1
394 1 for(i=8;i>0;i--)
395 1 {
396 2 MF522_SI = ((ucAddr&0x80)==0x80);
397 2 MF522_SCK = 1;
398 2 ucAddr <<= 1;
399 2 MF522_SCK = 0;
400 2 }
401 1
402 1 for(i=8;i>0;i--)
403 1 {
404 2 MF522_SCK = 1;
405 2 ucResult <<= 1;
406 2 ucResult|=(bit)MF522_SO;
407 2 MF522_SCK = 0;
408 2 }
409 1
410 1 MF522_NSS = 1;
411 1 MF522_SCK = 1;
412 1 return ucResult;
413 1 }
414
415 /////////////////////////////////////////////////////////////////////
416 //功 能:写RC632寄存器
417 //参数说明:Address[IN]:寄存器地址
418 // value[IN]:写入的值
419 /////////////////////////////////////////////////////////////////////
420 void WriteRawRC(unsigned char Address, unsigned char value)
421 {
422 1 unsigned char i, ucAddr;
423 1
424 1 MF522_SCK = 0;
425 1 MF522_NSS = 0;
426 1 ucAddr = ((Address<<1)&0x7E);
427 1
C51 COMPILER V7.20 RC522 12/15/2005 16:36:52 PAGE 8
428 1 for(i=8;i>0;i--)
429 1 {
430 2 MF522_SI = ((ucAddr&0x80)==0x80);
431 2 MF522_SCK = 1;
432 2 ucAddr <<= 1;
433 2 MF522_SCK = 0;
434 2 }
435 1
436 1 for(i=8;i>0;i--)
437 1 {
438 2 MF522_SI = ((value&0x80)==0x80);
439 2 MF522_SCK = 1;
440 2 value <<= 1;
441 2 MF522_SCK = 0;
442 2 }
443 1 MF522_NSS = 1;
444 1 MF522_SCK = 1;
445 1 }
446
447 /////////////////////////////////////////////////////////////////////
448 //功 能:置RC522寄存器位
449 //参数说明:reg[IN]:寄存器地址
450 // mask[IN]:置位值
451 /////////////////////////////////////////////////////////////////////
452 void SetBitMask(unsigned char reg,unsigned char mask)
453 {
454 1 char tmp = 0x0;
455 1 tmp = ReadRawRC(reg);
456 1 WriteRawRC(reg,tmp | mask); // set bit mask
457 1 }
458
459 /////////////////////////////////////////////////////////////////////
460 //功 能:清RC522寄存器位
461 //参数说明:reg[IN]:寄存器地址
462 // mask[IN]:清位值
463 /////////////////////////////////////////////////////////////////////
464 void ClearBitMask(unsigned char reg,unsigned char mask)
465 {
466 1 char tmp = 0x0;
467 1 tmp = ReadRawRC(reg);
468 1 WriteRawRC(reg, tmp & ~mask); // clear bit mask
469 1 }
470
471 /////////////////////////////////////////////////////////////////////
472 //功 能:通过RC522和ISO14443卡通讯
473 //参数说明:Command[IN]:RC522命令字
474 // pInData[IN]:通过RC522发送到卡片的数据
475 // InLenByte[IN]:发送数据的字节长度
476 // pOutData[OUT]:接收到的卡片返回数据
477 // *pOutLenBit[OUT]:返回数据的位长度
478 /////////////////////////////////////////////////////////////////////
479 char PcdComMF522(unsigned char Command,
480 unsigned char *pInData,
481 unsigned char InLenByte,
482 unsigned char *pOutData,
483 unsigned int *pOutLenBit)
484 {
485 1 char status = MI_ERR;
486 1 unsigned char irqEn = 0x00;
487 1 unsigned char waitFor = 0x00;
488 1 unsigned char lastBits;
489 1 unsigned char n;
C51 COMPILER V7.20 RC522 12/15/2005 16:36:52 PAGE 9
490 1 unsigned int i;
491 1 switch (Command)
492 1 {
493 2 case PCD_AUTHENT:
494 2 irqEn = 0x12;
495 2 waitFor = 0x10;
496 2 break;
497 2 case PCD_TRANSCEIVE:
498 2 irqEn = 0x77;
499 2 waitFor = 0x30;
500 2 break;
501 2 default:
502 2 break;
503 2 }
504 1
505 1 WriteRawRC(ComIEnReg,irqEn|0x80);
506 1 ClearBitMask(ComIrqReg,0x80);
507 1 WriteRawRC(CommandReg,PCD_IDLE);
508 1 SetBitMask(FIFOLevelReg,0x80);
509 1
510 1 for (i=0; i<InLenByte; i++)
511 1 { WriteRawRC(FIFODataReg, pInData[i]); }
512 1 WriteRawRC(CommandReg, Command);
513 1
514 1
515 1 if (Command == PCD_TRANSCEIVE)
516 1 { SetBitMask(BitFramingReg,0x80); }
517 1
518 1 i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
519 1 do
520 1 {
521 2 n = ReadRawRC(ComIrqReg);
522 2 i--;
523 2 }
524 1 while ((i!=0) && !(n&0x01) && !(n&waitFor));
525 1 ClearBitMask(BitFramingReg,0x80);
526 1
527 1 if (i!=0)
528 1 {
529 2 if(!(ReadRawRC(ErrorReg)&0x1B))
530 2 {
531 3 status = MI_OK;
532 3 if (n & irqEn & 0x01)
533 3 { status = MI_NOTAGERR; }
534 3 if (Command == PCD_TRANSCEIVE)
535 3 {
536 4 n = ReadRawRC(FIFOLevelReg);
537 4 lastBits = ReadRawRC(ControlReg) & 0x07;
538 4 if (lastBits)
539 4 { *pOutLenBit = (n-1)*8 + lastBits; }
540 4 else
541 4 { *pOutLenBit = n*8; }
542 4 if (n == 0)
543 4 { n = 1; }
544 4 if (n > MAXRLEN)
545 4 { n = MAXRLEN; }
546 4 for (i=0; i<n; i++)
547 4 { pOutData[i] = ReadRawRC(FIFODataReg); }
548 4 }
549 3 }
550 2 else
551 2 { status = MI_ERR; }
C51 COMPILER V7.20 RC522 12/15/2005 16:36:52 PAGE 10
552 2
553 2 }
554 1
555 1
556 1 SetBitMask(ControlReg,0x80); // stop timer now
557 1 WriteRawRC(CommandReg,PCD_IDLE);
558 1 return status;
559 1 }
560
561
562 /////////////////////////////////////////////////////////////////////
563 //开启天线
564 //每次启动或关闭天险发射之间应至少有1ms的间隔
565 /////////////////////////////////////////////////////////////////////
566 void PcdAntennaOn()
567 {
568 1 unsigned char i;
569 1 i = ReadRawRC(TxControlReg);
570 1 if (!(i & 0x03))
571 1 {
572 2 SetBitMask(TxControlReg, 0x03);
573 2 }
574 1 }
575
576
577 /////////////////////////////////////////////////////////////////////
578 //关闭天线
579 /////////////////////////////////////////////////////////////////////
580 void PcdAntennaOff()
581 {
582 1 ClearBitMask(TxControlReg, 0x03);
583 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1955 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 238
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -