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

suoma 发表于 2016-6-10 11:49

【Makeblock使用】写RC522

接上一篇帖子【Makeblock使用】小试RC522射频模块-Arduino中文社区 http://www.arduino.cn/thread-21478-1-1.html那篇帖子只是测试了一下卡的序列号,接下来写入卡数据

S50卡参数
一、            主要指标l容量为8K位EEPROMl分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位l每个扇区有独立的一组密码及访问控制l每张卡有唯一序列号,为32位l具有防冲突机制,支持多卡操作l无电源,自带天线,内含加密控制逻辑和通讯逻辑电路l数据保存期为10年,可改写10万次,读无限次l工作温度:-20℃~50℃(湿度为90%)l工作频率:13.56MHZl通信速率:106 KBPSl读写距离:10 cm以内(与读写器有关)
二、            工作原理卡片的电气部分只由一个天线和ASIC组成。天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个      8K位EEPROM组成。工作原理:读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。




流程图


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

测试

附程序,中间字符多写了一个“K”,
unsigned char serNum;
//写卡数据
unsigned char writeDate ={'a', 'r', 'd', 'u', 'i', 'n', 'o', '.', 'k', 'c', 'n', 0, 0, 0, 0, 0};

unsigned char sectorKeyA = {
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};

unsigned char sectorNewKeyA = {
      {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;
unsigned char RC_size;
unsigned char blockAddr;      


rfid.isCard();

if (rfid.readCardSerial())
{
    Serial.print("The card's number is: ");
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.print(rfid.serNum,HEX);
    Serial.println(" ");
}


rfid.selectTag(rfid.serNum);


blockAddr = 7;                //数据块7
if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA, rfid.serNum) == MI_OK)//认证
{
   
    status = rfid.write(blockAddr, sectorNewKeyA);
    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, 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();
}

suoma 发表于 2016-6-10 12:04

纠正:RFID rfid(53,5); 程序中没修改过来

陈小皮 发表于 2016-6-12 10:58

好评,有库文件吗?

liyming 发表于 2016-7-23 14:42

如何识别多张卡啊我不同的卡都可以控制同一个目标

suoma 发表于 2016-7-24 07:11

陈小皮 发表于 2016-6-12 10:58
好评,有库文件吗?

有,怎么给你

suoma 发表于 2016-7-24 07:13

liyming 发表于 2016-7-23 14:42
如何识别多张卡啊我不同的卡都可以控制同一个目标

每个卡有唯一的序列号,也有密码,你可以通过读写器烧写密码,然后允许允许的密码控制目标

陈小皮 发表于 2016-7-25 18:43

suoma 发表于 2016-7-24 07:11
有,怎么给你

我已经找到了 ,文件可以打包成压缩包上传

cycc2323 发表于 2016-8-3 09:59

怎么对卡进行加减
页: [1]
查看完整版本: 【Makeblock使用】写RC522