RC522为什么有的卡只读一次,有的卡却连续读卡?
同样的代码,有的卡只读一次,有的卡却连续读卡。测试硬件是arduino 2560,用的标准库,代码如下:#include <SPI.h>
#include <RFID.h>
//public micro define
#define UBOUND(Array) (sizeof(Array)/sizeof(Array))
/**********************************
*变量定义
***********************************/
#define RFID_SS 53
#define RFID_RST 49
#define BLOCK_4 4
typedef struct PersonIDTag
{
byte IDCardNum;
byte PersonKind;
byte Reserv;
}PersonID;
union
{
struct
{
byte IDCardNum;
byte PersonKind;
byte Reserv;
}PersonIDStruct;
byte DataByte;
} Person;
PersonID PersonDatabase; //0-银行;1-维修人员;2-保洁人员;
union
{
unsigned char PersonInfo;
struct PersonInfoStruct
{
unsigned char KindCode;
unsigned char BankCode;
unsigned char ZoneCode;
unsigned char Reserv;
};
}PersonInfoUnion;
RFID RFIDDev(RFID_SS, RFID_RST);
unsigned char CardSerialNum;
unsigned char PersonInfo;
unsigned char PersonInfoToWrite;
//卡出厂默认密码
unsigned char InitalSectorKeyA = {
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } };
//重新设定的卡密码
unsigned char NewSectorKeyA = {
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11},
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 },
{ 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF,0xFF, 0x07, 0x80, 0x69, 0x51, 0x44, 0x80, 0x62, 0x62, 0x11 } };
void setup()
{
/* add setup code here */
Serial.begin(9600);
RFIDInit();
PersonInfoUnion.PersonInfo = 0x01;
PersonInfoUnion.PersonInfo = 0x02;
PersonInfoUnion.PersonInfo = 0x1A;
PersonInfoUnion.PersonInfo = 0x80;
PersonInfoUnion.PersonInfo = 0x62;
PersonInfoUnion.PersonInfo = 0x62;
PersonInfoUnion.PersonInfo = 0x11;
PersonInfoUnion.PersonInfo = 0x05;
PersonInfoUnion.PersonInfo = 0x32;
}
void loop()
{
/* add main program code here */
CheckCardID();
RFIDWriteBlock(4);
for (int i = 0; i < 16; i++)
{
RFIDReadBlock(i);
}
/*RFIDReadBlock(BLOCK_4);*/
RFIDDev.halt();
}
/***************************************
*函数定义
*****************************************/
//读卡器初始化
void RFIDInit()
{
SPI.begin();
RFIDDev.init();
}
//校验卡的身份
void CheckCardID()
{
RFIDDev.isCard();
if (RFIDDev.readCardSerial())
{
for (int i = 0; i < 5; i++)
{
CardSerialNum = RFIDDev.serNum;
//以下代码供调试用
Serial.print(CardSerialNum, HEX);
Serial.print("-");
}
Serial.println();
}
RFIDDev.selectTag(RFIDDev.serNum);
}
//读取数据块,校验密码A
void RFIDReadBlock(unsigned char BlockAddress)
{
if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA, RFIDDev.serNum)==MI_OK)
{
if (RFIDDev.read(BlockAddress, PersonInfo) == MI_OK)
{
//以下代码仅供调试
for (int i = 0; i < UBOUND(PersonInfo); i++)
{
Serial.print(PersonInfo, HEX);
}
Serial.println();
Serial.print(BlockAddress);
Serial.println("is read!");
/***************************************************/
}
}
//else
//{
// Serial.println("Card authority is not valid!");
// //后续处理……
//}
}
//写数据块,校验密码A
void RFIDWriteBlock(unsigned BlockAddress)
{
if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA, RFIDDev.serNum) == MI_OK)
{
if (RFIDDev.write(BlockAddress, PersonInfoUnion.PersonInfo) == MI_OK)
{
//以下代码仅供调试
for (int i = 0; i < UBOUND(PersonInfoUnion.PersonInfo); i++)
{
Serial.println(PersonInfoUnion.PersonInfo, HEX);
}
/***************************************************/
}
}
//else
//{
// Serial.println("Card authority is not valid!");
// //后续处理……
//}
}
//修改AB密码和存取控制区
void RFIDChangeControlWord(unsigned char BlockAddress)
{
if (RFIDDev.auth(PICC_AUTHENT1A, BlockAddress, InitalSectorKeyA, RFIDDev.serNum) == MI_OK)
{
if (RFIDDev.write(BlockAddress, NewSectorKeyA) == MI_OK)
{
//for debug only
Serial.println("Change control zone word success.");
}
else
{
//for debug only
Serial.println("Change control zone word failure.");
}
}
else
{
//for debug only
Serial.println("Authority is wrong!");
}
}
//修改报警主机本地身份卡数据
void ModifyPersonDatabase(byte KindCode,byte* IDCardNum)
{
for (int i = 0; i < UBOUND(PersonDatabase); i++)
{
if (KindCode == PersonDatabase.PersonKind)
{
for (int j = 0; j < UBOUND(PersonDatabase.IDCardNum); j++)
{
PersonDatabase.IDCardNum = IDCardNum;
}
break;
}
}
}
//校验卡序列号是否合法
boolean CheckCardSerialNum(unsigned char * CardSerial)
{
for (int i = 0; i < UBOUND(PersonDatabase); i++)
{
for (int j = 0; j < UBOUND(PersonDatabase.IDCardNum); j++)
{
if (CardSerial != PersonDatabase.IDCardNum)
{
break;
}
if (j == UBOUND(PersonDatabase.IDCardNum) - 1)
{
return true;
}
}
}
return false;
}
页:
[1]