【Makeblock使用】写RC522-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13655|回复: 7

【Makeblock使用】写RC522

[复制链接]
发表于 2016-6-10 11:49 | 显示全部楼层 |阅读模式
接上一篇帖子【Makeblock使用】小试RC522射频模块-Arduino中文社区 http://www.arduino.cn/thread-21478-1-1.html那篇帖子只是测试了一下卡的序列号,接下来写入卡数据

S50卡参数
一、            主要指标
l  容量为8K位EEPROM
l  分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位
l  每个扇区有独立的一组密码及访问控制
l  每张卡有唯一序列号,为32位
l  具有防冲突机制,支持多卡操作
l  无电源,自带天线,内含加密控制逻辑和通讯逻辑电路
l  数据保存期为10年,可改写10万次,读无限次
l  工作温度:-20℃~50℃(湿度为90%)
l  工作频率:13.56MHZ
l  通信速率:106 KBPS
l  读写距离:10 cm以内(与读写器有关)

二、            工作原理
卡片的电气部分只由一个天线和ASIC组成。
天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。
ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个
      8K位EEPROM组成。
工作原理:读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。





流程图
4.JPG

对数据块的操作
(Read):读一个块;
(Write):写一个块;
(Increment):对数值块进行加值;
(Decrement):对数值块进行减值;
存储(Restore):将块中的内容存到数据寄存器中;
传输(Transfer):将数据寄存器中的内容写入块中;
中止(Halt):将卡置于暂停工作状态;


测试
3.JPG
附程序,中间字符多写了一个“K”,
[mw_shl_code=bash,true]unsigned char serNum[5];
//写卡数据
unsigned char writeDate[16] ={'a', 'r', 'd', 'u', 'i', 'n', 'o', '.', 'k', 'c', 'n', 0, 0, 0, 0, 0};

unsigned char sectorKeyA[16][16] = {
        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};

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;      


  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 ;
    status = rfid.write(blockAddr, writeDate);
    if(status == MI_OK)
    {
      Serial.println("Write card OK!");
    }
  }

  
  blockAddr = 7;              
  status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);
  if (status == MI_OK)  //认证
  {
   
    blockAddr = blockAddr - 3 ;
    if( rfid.read(blockAddr, str) == MI_OK)
    {
      Serial.print("Read from the card ,the data is : ");
      Serial.println((char *)str);
    }
  }
  
  rfid.halt();
}[/mw_shl_code]

 楼主| 发表于 2016-6-10 12:04 | 显示全部楼层
纠正:RFID rfid(53,5); 程序中没修改过来
发表于 2016-6-12 10:58 | 显示全部楼层
好评,有库文件吗?
发表于 2016-7-23 14:42 | 显示全部楼层
如何识别多张卡啊我不同的卡都可以控制同一个目标
 楼主| 发表于 2016-7-24 07:11 | 显示全部楼层
陈小皮 发表于 2016-6-12 10:58
好评,有库文件吗?

有,怎么给你
 楼主| 发表于 2016-7-24 07:13 | 显示全部楼层
liyming 发表于 2016-7-23 14:42
如何识别多张卡啊我不同的卡都可以控制同一个目标

每个卡有唯一的序列号,也有密码,你可以通过读写器烧写密码,然后允许允许的密码控制目标
发表于 2016-7-25 18:43 | 显示全部楼层

我已经找到了 ,  文件可以打包成压缩包上传
发表于 2016-8-3 09:59 | 显示全部楼层
怎么对卡进行加减
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-3 02:08 , Processed in 0.103149 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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