本帖最后由 bg1lsy 于 2013-11-10 19:43 编辑
最近淘了一个MFRC522 RFID读卡器,在网上幸运的找到了国外网友写的源代码和国内网友整理的类库,但多少都有一些问题,调试是一波三折,耗费了我一整天的时间。
想着新来的同学可能也会像我一样把时间浪费在排除bug上,所以就进一步整理了找到的类库,整理了部分汉字提示、新增两个函数和一个扇区读写的例子,希望能给大家提供方便。
RFID -> Arduino UNO
-------------------
GND -> GND
VIN -> 5V
SS -> D10
SCK -> D13
MISI -> D11
MISO -> D12
3V# ->
RST -> D5
读取卡序列号的例子:
#include <SPI.h>
#include <RFID.h>
RFID rfid(10,5); //D10--读卡器SS引脚、D5--读卡器RST引脚
void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init();
}
void loop()
{
//找卡
if (rfid.isCard()) {
Serial.println("Find the card!");
//读取卡序列号
if (rfid.readCardSerial()) {
Serial.print("The card's number is : ");
Serial.print(rfid.serNum[0],HEX);
Serial.print(rfid.serNum[1],HEX);
Serial.print(rfid.serNum[2],HEX);
Serial.print(rfid.serNum[3],HEX);
Serial.print(rfid.serNum[4],HEX);
Serial.println(" ");
}
//选卡,可返回卡容量(锁定卡片,防止多数读取),去掉本行将连续读卡
rfid.selectTag(rfid.serNum);
}
rfid.halt();
}
读写扇区的例子:
#include <SPI.h>
#include <RFID.h>
RFID rfid(10,5); //D10--读卡器MOSI引脚、D5--读卡器RST引脚
//4字节卡序列号,第5字节为校验字节
unsigned char serNum[5];
//写卡数据
unsigned char writeDate[16] ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
//原扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorKeyA[16][16] = {
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
//新扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorNewKeyA[16][16] = {
{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},};
void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init();
}
void loop()
{
unsigned char i,tmp;
unsigned char status;
unsigned char str[MAX_LEN];
unsigned char RC_size;
unsigned char blockAddr; //选择操作的块地址0~63
//找卡
rfid.isCard();
//读取卡序列号
if (rfid.readCardSerial())
{
Serial.print("The card's number is : ");
Serial.print(rfid.serNum[0],HEX);
Serial.print(rfid.serNum[1],HEX);
Serial.print(rfid.serNum[2],HEX);
Serial.print(rfid.serNum[3],HEX);
Serial.print(rfid.serNum[4],HEX);
Serial.println(" ");
}
//选卡,返回卡容量(锁定卡片,防止多次读写)
rfid.selectTag(rfid.serNum);
//写数据卡
blockAddr = 7; //数据块7
if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK) //认证
{
//写数据
status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);
Serial.print("set the new card password, and can modify the data of the Sector: ");
Serial.println(blockAddr/4,DEC);
//写数据
blockAddr = blockAddr - 3 ; //数据块4
status = rfid.write(blockAddr, writeDate);
if(status == MI_OK)
{
Serial.println("Write card OK!");
}
}
//读卡
blockAddr = 7; //数据块7
status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);
if (status == MI_OK) //认证
{
//读数据
blockAddr = blockAddr - 3 ; //数据块4
if( rfid.read(blockAddr, str) == MI_OK)
{
Serial.print("Read from the card ,the data is : ");
Serial.println((char *)str);
}
}
rfid.halt();
}
|