0852300219 发表于 2013-8-24 21:58:40

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

最近用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 = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};   
unsigned char idata MLastSelectedSnr;
unsigned char xdata RevBuffer;
unsigned char idata COMBuffer;
/////////////////////////

///////////////////////////////
//延时子函数
void delay(unsigned int timer){
while(timer--);
}
//读卡操作函数
void iccardcode()
{ unsigned char t;   
   if( PcdRequest( PICC_REQIDL, &RevBuffer ) != MI_OK ){ //寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
if( PcdRequest( PICC_REQIDL, &RevBuffer ) != MI_OK ){ //寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
   return;
}
}
if( PcdAnticoll( &RevBuffer ) != MI_OK ){//防冲撞,返回卡的序列号 4字节
DisplayListChar(10,1,lyERR); //错误返回
return;
}
memcpy(MLastSelectedSnr,&RevBuffer,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)== MI_OK) // 读卡了?
{   if(PcdRead(1,&RevBuffer)== MI_OK)//再一次读卡确认
    {
DisplayListChar(10,1,lyERR);
   
    }
   else
      {
DisplayListChar(10,1,lyERR);
return;
   }
}


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

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

    for( t=0;t<=strlen(&RevBuffer);t++)
   {   Tx_Buf=*(&RevBuffer+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模块才能继续读取新的卡,这是什么情况啊,起码来一个新卡,重新读吧?该怎么改好呢,跪求大神指点一二

HANGKONG15 发表于 2018-2-2 11:01:18

楼主你的问题解决了吗?
页: [1]
查看完整版本: 需要每次单片机复位RFID-RC522才能继续读卡?