📄 rc522.lst
字号:
295
296 if (status != MI_OK)
297 { return MI_ERR; }
298
299 ucComMF522Buf[0] = PICC_TRANSFER;
300 ucComMF522Buf[1] = goaladdr; //目的块地址
301
302 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
303 //保存缓冲区数据到目的块
C51 COMPILER V6.23a RC522 04/14/2008 15:21:35 PAGE 6
304 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
305
306 if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
307 { status = MI_ERR; }
308
309 return status;
310 }
311
312 */
313 /////////////////////////////////////////////////////////////////////
314 //功 能:命令卡片进入休眠状态
315 //返 回: 成功返回MI_OK
316 /////////////////////////////////////////////////////////////////////
317 char PcdHalt(void)
318 {
319 1 char status;
320 1 unsigned int unLen;
321 1 unsigned char ucComMF522Buf[MAXRLEN];
322 1
323 1 ucComMF522Buf[0] = PICC_HALT;
324 1 ucComMF522Buf[1] = 0;
325 1 CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
326 1
327 1 status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
328 1
329 1 return MI_OK;
330 1 }
331
332 /////////////////////////////////////////////////////////////////////
333 //用MF522计算CRC16函数
334 /////////////////////////////////////////////////////////////////////
335 void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
336 {
337 1 unsigned char i,n;
338 1 ClearBitMask(DivIrqReg,0x04);
339 1 WriteRawRC(CommandReg,PCD_IDLE);
340 1 SetBitMask(FIFOLevelReg,0x80);
341 1 for (i=0; i<len; i++)
342 1 { WriteRawRC(FIFODataReg, *(pIndata+i)); }
343 1 WriteRawRC(CommandReg, PCD_CALCCRC);
344 1 i = 0xFF;
345 1 do
346 1 {
347 2 n = ReadRawRC(DivIrqReg);
348 2 i--;
349 2 }
350 1 while ((i!=0) && !(n&0x04));
351 1 pOutData[0] = ReadRawRC(CRCResultRegL);
352 1 pOutData[1] = ReadRawRC(CRCResultRegM);
353 1 }
354
355 /////////////////////////////////////////////////////////////////////
356 //功 能:复位RC522
357 //返 回: 成功返回MI_OK
358 /////////////////////////////////////////////////////////////////////
359 char PcdReset(void)
360 {
361 1 MF522_RST=1;
362 1 Delay1ms(5);
363 1 MF522_RST=0;
364 1 Delay1ms(5);
365 1 MF522_RST=1;
C51 COMPILER V6.23a RC522 04/14/2008 15:21:35 PAGE 7
366 1 Delay1ms(5);
367 1 WriteRawRC(CommandReg,PCD_RESETPHASE);
368 1 Delay1ms(5);
369 1
370 1 WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363
371 1 WriteRawRC(TReloadRegL,0x1E);
372 1 WriteRawRC(TReloadRegH,0);
373 1 WriteRawRC(TModeReg,0x8D);
374 1 WriteRawRC(TPrescalerReg,0x3E);
375 1 WriteRawRC(TxAskReg,0x40);
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 V6.23a RC522 04/14/2008 15:21:35 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 //参数说明:
474 /////////////////////////////////////////////////////////////////////
475 char PcdComMF522(unsigned char Command, //RC522命令字
476 unsigned char *pInData, //通过RC522发送到卡片的数据
477 unsigned char InLenByte, //InLenByte[IN]:发送数据的字节长度
478 unsigned char *pOutData, //pOutData[OUT]:接收到的卡片返回数据
479 unsigned int *pOutLenBit) //*pOutLenBit[OUT]:返回数据的位长度
480 {
481 1 char status = MI_ERR;
482 1 unsigned char irqEn = 0x00;
483 1 unsigned char waitFor = 0x00;
484 1 unsigned char lastBits;
485 1 unsigned char n;
486 1 unsigned int i;
487 1 switch (Command)
488 1 {
489 2 case PCD_AUTHENT: //密码验证:0EH
C51 COMPILER V6.23a RC522 04/14/2008 15:21:35 PAGE 9
490 2 irqEn = 0x12;
491 2 waitFor = 0x10;
492 2 break;
493 2 case PCD_TRANSCEIVE: //数据收发:0CH
494 2 irqEn = 0x77;
495 2 waitFor = 0x30;
496 2 break;
497 2 default:
498 2 break;
499 2 }
500 1
501 1 WriteRawRC(ComIEnReg,irqEn|0x80); //
502 1 ClearBitMask(ComIrqReg,0x80);
503 1 WriteRawRC(CommandReg,PCD_IDLE);
504 1 SetBitMask(FIFOLevelReg,0x80);
505 1
506 1 for (i=0; i<InLenByte; i++)
507 1 { WriteRawRC(FIFODataReg, pInData[i]); }
508 1 WriteRawRC(CommandReg, Command);
509 1
510 1
511 1 if (Command == PCD_TRANSCEIVE)
512 1 { SetBitMask(BitFramingReg,0x80); }
513 1
514 1 i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
515 1 do
516 1 {
517 2 n = ReadRawRC(ComIrqReg);
518 2 i--;
519 2 }
520 1 while ((i!=0) && !(n&0x01) && !(n&waitFor));
521 1 ClearBitMask(BitFramingReg,0x80);
522 1
523 1 if (i!=0)
524 1 {
525 2 if(!(ReadRawRC(ErrorReg)&0x1B))
526 2 {
527 3 status = MI_OK;
528 3 if (n & irqEn & 0x01)
529 3 { status = MI_NOTAGERR; }
530 3 if (Command == PCD_TRANSCEIVE)
531 3 {
532 4 n = ReadRawRC(FIFOLevelReg);
533 4 lastBits = ReadRawRC(ControlReg) & 0x07;
534 4 if (lastBits)
535 4 { *pOutLenBit = (n-1)*8 + lastBits; }
536 4 else
537 4 { *pOutLenBit = n*8; }
538 4 if (n == 0)
539 4 { n = 1; }
540 4 if (n > MAXRLEN)
541 4 { n = MAXRLEN; }
542 4 for (i=0; i<n; i++)
543 4 { pOutData[i] = ReadRawRC(FIFODataReg); }
544 4 }
545 3 }
546 2 else
547 2 { status = MI_ERR; }
548 2
549 2 }
550 1
551 1
C51 COMPILER V6.23a RC522 04/14/2008 15:21:35 PAGE 10
552 1 SetBitMask(ControlReg,0x80); // stop timer now
553 1 WriteRawRC(CommandReg,PCD_IDLE);
554 1 return status;
555 1 }
556
557
558 /////////////////////////////////////////////////////////////////////
559 //开启天线
560 //每次启动或关闭天线发射之间应至少有1ms的间隔
561 /////////////////////////////////////////////////////////////////////
562 void PcdAntennaOn()
563 {
564 1 unsigned char i;
565 1 i = ReadRawRC(TxControlReg);
566 1 if (!(i & 0x03))
567 1 { //TX1RFEN,TX2RFEN=11
568 2 SetBitMask(TxControlReg, 0x03);
569 2 }
570 1 }
571
572
573 /////////////////////////////////////////////////////////////////////
574 //关闭天线,//TX1RFEN,TX2RFEN=11
575 /////////////////////////////////////////////////////////////////////
576 void PcdAntennaOff()
577 {
578 1 ClearBitMask(TxControlReg, 0x03);
579 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1520 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 193
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 + -