极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 189096|回复: 76

分享一个整理并测试好用的MFRC522 RFID库

  [复制链接]
发表于 2013-5-25 21:11:03 | 显示全部楼层 |阅读模式
本帖最后由 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();
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +4 收起 理由
zcbzjx + 4 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-5-25 21:38:27 | 显示全部楼层
好帖,虽然还没玩rfid,来顶
回复 支持 反对

使用道具 举报

发表于 2013-5-25 22:06:20 | 显示全部楼层
不错不错,这是个好例子,前段时间很多人问这个
回复 支持 反对

使用道具 举报

发表于 2013-5-26 00:58:07 | 显示全部楼层
玩RFID大概要多少錢呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-26 06:52:17 | 显示全部楼层
adanov 发表于 2013-5-26 00:58
玩RFID大概要多少錢呢?

我买的是39元再加13元快递
回复 支持 反对

使用道具 举报

发表于 2013-5-26 22:28:26 | 显示全部楼层
看起来不错,呵呵
回复 支持 反对

使用道具 举报

发表于 2013-5-27 17:16:56 | 显示全部楼层
bg1lsy 发表于 2013-5-26 06:52
我买的是39元再加13元快递

39是包括读写器么???卡要多少钱啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-28 17:53:17 | 显示全部楼层
friskit 发表于 2013-5-27 17:16
39是包括读写器么???卡要多少钱啊?


39元包括读写器模块和两张白卡,淘宝上有很多
回复 支持 反对

使用道具 举报

发表于 2013-5-29 00:32:47 | 显示全部楼层
bg1lsy 发表于 2013-5-28 17:53
39元包括读写器模块和两张白卡,淘宝上有很多

聽起來不錯!謝謝分享!
回复 支持 反对

使用道具 举报

发表于 2013-5-29 01:28:14 | 显示全部楼层
说不定可以移植到NFC上去
回复 支持 反对

使用道具 举报

发表于 2013-6-11 15:09:40 | 显示全部楼层
你好!!编译通不过,不知道什么原因~~用的1.01版本~~~我是新手,不好意思
ReadAndWriteRFID.cpp:4:18: warning: RFID.h: No such file or directory
ReadAndWriteRFID:5: error: 'RFID' does not name a type
ReadAndWriteRFID.cpp: In function 'void setup()':
ReadAndWriteRFID:26: error: 'rfid' was not declared in this scope
ReadAndWriteRFID.cpp: In function 'void loop()':
ReadAndWriteRFID:33: error: 'MAX_LEN' was not declared in this scope
ReadAndWriteRFID:38: error: 'rfid' was not declared in this scope
ReadAndWriteRFID:56: error: 'PICC_AUTHENT1A' was not declared in this scope
ReadAndWriteRFID:56: error: 'MI_OK' was not declared in this scope
ReadAndWriteRFID:73: error: 'PICC_AUTHENT1A' was not declared in this scope
ReadAndWriteRFID:74: error: 'MI_OK' was not declared in this scope
ReadAndWriteRFID:78: error: 'str' was not declared in this scope
ReadAndWriteRFID.cpp:35: warning: unused variable 'i'
ReadAndWriteRFID.cpp:35: warning: unused variable 'tmp'
ReadAndWriteRFID.cpp:38: warning: unused variable 'RC_size'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-11 21:05:29 | 显示全部楼层
天天向上/tp 发表于 2013-6-11 15:09
你好!!编译通不过,不知道什么原因~~用的1.01版本~~~我是新手,不好意思
ReadAndWriteRFID.cpp:4:18: wa ...

估计你是没有把库下载到libraries目录下吧。
回复 支持 反对

使用道具 举报

发表于 2013-6-11 22:03:19 | 显示全部楼层
下了库的啊,防到library里面的
回复 支持 反对

使用道具 举报

发表于 2013-6-19 18:10:03 | 显示全部楼层
很好哦·一直在找rfid的
回复 支持 反对

使用道具 举报

发表于 2013-7-1 23:04:18 | 显示全部楼层
调不通。7个针脚要怎么接呀。
会不会是rfid烧坏了,接过5v电压
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 06:30 , Processed in 0.043586 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表