搜索
bottom↓
回复: 1

需要每次单片机复位RFID-RC522才能继续读卡?

[复制链接]

出0入0汤圆

发表于 2013-8-24 21:58:40 | 显示全部楼层 |阅读模式
最近用51单片机研究射频卡522,事先给空白卡里面写入学号信息,刷卡也能读取了,但是问题来了:“每次刷卡,刷一两次(可以正常读取卡信息哦)后,若显示读卡失败“ERR”时,读卡模块就卡住了,不会读取新过来的卡的数据了”
需要每次单片机重新复位,才能继续读取新卡数据。
以下是部分主程序部分,另外NRF2401和RC522调用函数子程序网上基本一样的,所以这里版面问题没扔出来。
/***************************************************************************
标题: 读写卡程序
****************************************************************************/
#include "reg52.h"
#include "mfrc522.h"
#include "lcd1602.h"
#include <string.h>
#include"ctype.h"
#include "uart.h"
#include"2401.h"

////////////////////端口定义///////////////////////////

/////////////////数据定义//////////////////////////////////
unsigned char code lyERR[] = {"ERR"};

unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};   
unsigned char idata MLastSelectedSnr[4];
unsigned char xdata RevBuffer[10];  
unsigned char idata COMBuffer[5];
/////////////////////////

///////////////////////////////
//延时子函数
void delay(unsigned int timer){  
while(timer--);
}
//读卡操作函数
void iccardcode()
{ unsigned char t;     
     if( PcdRequest( PICC_REQIDL, &RevBuffer[0] ) != MI_OK ){ //寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
  if( PcdRequest( PICC_REQIDL, &RevBuffer[0] ) != MI_OK ){ //寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
   return;
  }
}
if( PcdAnticoll( &RevBuffer[2] ) != MI_OK ){  //防冲撞,返回卡的序列号 4字节
  DisplayListChar(10,1,lyERR); //错误返回
  return;
}
memcpy(MLastSelectedSnr,&RevBuffer[2],4);

if( PcdSelect(MLastSelectedSnr) != MI_OK ){ //选卡
  DisplayListChar(10,1,lyERR);
  return;
}
if(PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, MLastSelectedSnr) != MI_OK){ // 校验卡密码A
  DisplayListChar(10,1,lyERR);
  return;   
}
                                       
if(PcdRead(1,&RevBuffer[2])== MI_OK) // 读卡了?
{   if(PcdRead(1,&RevBuffer[2])== MI_OK)//再一次读卡确认
    {
  DisplayListChar(10,1,lyERR);
   
    }
     else
      {
  DisplayListChar(10,1,lyERR);
  return;
     }
}


  if(PcdWrite(1,&RevBuffer[2]) != MI_OK){ // 写卡
  DisplayListChar(10,1,lyERR);
  return;
}
if(PcdRead(1,&RevBuffer[2]) != MI_OK){ // 读卡
  DisplayListChar(10,1,lyERR);
  return;
}
PcdHalt(); //终止卡的操作

//以下是NRF24L01发送小部分程序

    for( t=0;t<=strlen(&RevBuffer[2]);t++)
     {   Tx_Buf[t]=*(&RevBuffer[2]+t);
      
     }
      UartSend_string(Tx_Buf);
DisplayListChar(0,1,Tx_Buf);
       nRF24L01_TxPacket(Tx_Buf);//Transmit(Tx_Buf);//发送数组中的数据  或者使用这一句 nRF24L01_TxPacket(unsigned char * tx_buf)
        Deelay(10);
        sta=SPI_Read(READ_REG +  STATUS);
   if(TX_DS)
       {
          //8位LED显示当前STATUS状态  发送中断应使bit5 = 1 灯灭  
         Deelay(100);
         SPI_RW_Reg(WRITE_REG + STATUS,sta); //把sta写入寄存器。
       }
   if(MAX_RT)
   {
         
         Deelay(150);
        SPI_RW_Reg(WRITE_REG+STATUS,sta);
    }
  



}
////////////////////////////////////////////////////////////////
//系统初始化
void InitializeSystem()
{
Delay400Ms();  //
LCDInit();   //液晶1602初始化
  
ReadDataLCD(); //测试用句无意义
     PcdReset(); //RC522模块初如化
     PcdAntennaOff();
     PcdAntennaOn();   
  M500PcdConfigISOType( 'A' );

}
////////////////////////////////////////////////////
//入口主函数
void main( )
{   
UartInital();
//DisplayConfigMenu();
    InitializeSystem( ); //初始化
CE=0;
    SCK=0;
    CSN=1; //nrf2401初始化
    while (1)
    {  
  iccardcode(); //扫描卡
    delay(200); //间隔时间
  
  }
}

那位大神帮忙看看,刷卡一两次后就要单片机复位,RC522模块才能继续读取新的卡,这是什么情况啊,起码来一个新卡,重新读吧?该怎么改好呢,跪求大神指点一二

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2018-2-2 11:01:18 | 显示全部楼层
楼主你的问题解决了吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 09:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表