|
最近用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来反美的!
|