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个扇区,那么推荐您直接修改默认秘钥,或者存储多个秘钥到数组内,并不是不能下载密码,而是这样可以更稳定