RC522 解决读卡器不能正常连接的问题 扇区读写错误的问题
直接使用RC522.C和MFRC522.H编译下载到STC89C52,上位机和串口指令均不能正确响应,
而单片机开启2倍振荡后偶尔可以正常工作,分析认为是单片机频率的问题,板载的是11.0592Mhz的晶振
而MAIN.H需要修改为如下
////////////////////////////////// //端口定义 ///////////////////////////////////////////////////////////////////// //MFRC522 sbit MF522_RST = P1^3; //RC500片选 sbit MF522_NSS = P1^6; sbit MF522_SCK = P1^7; sbit MF522_SI = P1^4; sbit MF522_SO = P1^5; //指示灯 sbit LED_GREEN = P1^0; sbit P26=P1^1; ///////////////////////////////////////////////////////////////////// //函数原型 ///////////////////////////////////////////////////////////////////// void InitializeSystem(); #define BAUD_115200 256 - (OSC_FREQ/192L)/115200L // 255 #define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254 #define BAUD_38400 256 - (OSC_FREQ/192L)/38400L // 253 #define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 252 #define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 250 #define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 248 #define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 244 #define OSC_FREQ 11059200L //#define OSC_FREQ 7372800L #define OSC_FREQ 11059200L #define RCAP2_50us 65536L - OSC_FREQ/40417L #define RCAP2_1ms 65536L - OSC_FREQ/2000L #define RCAP2_10ms 65536L - OSC_FREQ/1200L #define TIME0_500us 65536L - OSC_FREQ/8000L #define TIME0_10ms 65536L - OSC_FREQ/200
另外一个问题是密码下载有问题,解决方案是单片机读扇区时,发送秘钥,而不是按照上位机的方式
或者修改函数
/////////////////////////////////////////////////////////////////////
//功 能:验证卡片密码
//参数说明: auth_mode[IN]: 密码验证模式
// 0x60 = 验证A密钥
// 0x61 = 验证B密钥
// addr[IN]:块地址
// pKey[IN]:密码
// pSnr[IN]:卡片序列号,4字节
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = auth_mode;
ucComMF522Buf[1] = addr;
for (i=0; i<6; i++)
{ ucComMF522Buf[i+2] = *(pKey+i); }
for (i=0; i<6; i++)
{ ucComMF522Buf[i+8] = *(pSnr+i); }
// memcpy(&ucComMF522Buf[2], pKey, 6);
// memcpy(&ucComMF522Buf[8], pSnr, 4);
status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
//if (status != MI_OK)
if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
{ status = MI_ERR; }
return status;
}为
/////////////////////////////////////////////////////////////////////
//功 能:验证卡片密码
//参数说明: auth_mode[IN]: 密码验证模式
// 0x60 = 验证A密钥
// 0x61 = 验证B密钥
// addr[IN]:块地址
// pKey[IN]:密码
// pSnr[IN]:卡片序列号,4字节
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = auth_mode;
ucComMF522Buf[1] = addr;
for (i=0; i<6; i++)
{ ucComMF522Buf[i+2] = *(pKey+i); }
for (i=0; i<6; i++)
{ ucComMF522Buf[i+8] = *(pSnr+i); }
// memcpy(&ucComMF522Buf[2], pKey, 6);
// memcpy(&ucComMF522Buf[8], pSnr, 4);
status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
//if (status != MI_OK)
if (status != MI_OK)
{ status = MI_ERR; }
return status;
}不进行验证,或者修改
DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};如果你的项目只用到了1个扇区,那么推荐您直接修改默认秘钥,或者存储多个秘钥到数组内,并不是不能下载密码,而是这样可以更稳定


