ic卡白卡怎么写入数据_Arduino提高篇20—S50卡数据读写

关注、 星标公众,不错过精彩内容

0ebebaf05fd8f7412af9ba6393f1d296.png

编辑:Tony
来源:公众号TonyCode

RC522模块不但可以读取标签中的数据,还能将数据写入标签中,本篇介绍S50卡的写卡操作。

1 S50卡介绍

S50非接触式IC卡的容量为1K字节EEPROM,又称M1卡。内部EEPROM又分为16个扇区,每个扇区分4个块,以块为存取单位,每个块由16个字节组成。

1. M1卡主要指标
  • 每个扇区有独立的一组密码和访问控制。

  • 每张卡有唯一32位序列号。

  • 无电源,自带天线,内含加密控制逻辑和通讯逻辑电路。

  • 数据保存期为10年,可改写10万次,读无限次

  • 工作频率:13.56MHZ

  • 通信速率:106 KBPS

  • 工作温度:-20℃~50℃(湿度为90%)

2. M1卡存储结构

存储结构如下图,16个扇区,每个扇区4个块,可将16个扇区的64个块按绝对地址编号0-63。

20e62cc014ec42d0357e4f59d099ac2d.png
M1卡存储结构

其中第0扇区的块0,用于存放厂商代码,一般前四字节为UID,已经固化,一般不可更改。

每个扇区的块0、块1、块2为数据块,可用于存储数据,块3为控制块,包括了密码A,存取控制,密码B。

b5810597b8c917755aa3a3279e711567.png
控制块

3. 读写流程

每个扇区的密码和存取控制都是独立的,可根据实际需要设定各自的密码及存取控制。出厂默认的密码6个字节都为0xFF。

扇区中每个块的存取条件是由密码和存取控制共同决定的,每个块有相应的三个控制位,按照一定规则进行约束,具体可以参照M1卡数据手册。

本篇演示向扇区1的块0,绝对地址为块4中写入数据。主要流程为:模块进行卡扫描读取卡片信息,通过密码进行身份认证,然后读取写入前的块数据,然后再次进行身份认证并写入自定义数据,然后再次身份认证读取写入后的块数据来检测是否写入成功。

2 实验材料
  • Uno R3开发板

  • 配套USB数据线

  • 面包板及配套连接线

  • RFID-RC522模块及配套S50白卡和异形卡

3 实验材料

1. 根据原理图搭建电路图。

RC522模块的3.3V、GND分别对应连接开发板的3.3V、GND,模块的MOSI、MISO、SCK分别连接开发板的SPI接口11、12、13,模块的SDA、RST分别连接开发板数字管脚10、9。

实验原理图如下图所示:

61727d70d840e016a0dc9504105f0d3a.png
实验原理图

实物连接图如下图所示:

8a1318524b52341cd389fbb3ffec79c5.png
实物连接图

2. 代码较长,部分截取如下,全部代码文末获取。

 1...
2  // 使用密码A进行身份认证
3  Serial.println(F("使用密码A进行身份认证..."));
4  status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
5  if (status != MFRC522::STATUS_OK) {
6    Serial.print(F("身份认证失败 "));
7    Serial.println(mfrc522.GetStatusCodeName(status));
8    return;
9  }
10
11  // 显示当前扇区数据
12  Serial.println(F("当前扇区数据:"));
13  mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
14  Serial.println();
15
16  // 读取写入前块数据
17  Serial.print(F("读取写入前块")); Serial.print(blockAddr);
18  Serial.println(F("数据..."));
19  status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
20  if (status != MFRC522::STATUS_OK) {
21    Serial.print(F("读取失败 "));
22    Serial.println(mfrc522.GetStatusCodeName(status));
23  }
24  Serial.print(F("块")); Serial.print(blockAddr); Serial.println(F("数据:"));
25  dump_byte_array(buffer, 16); Serial.println();
26  Serial.println();
27
28  // 使用密码B进行身份认证
29  Serial.println(F("使用密码B进行身份认证..."));
30  status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
31  if (status != MFRC522::STATUS_OK) {
32    Serial.print(F("身份认证失败 "));
33    Serial.println(mfrc522.GetStatusCodeName(status));
34    return;
35  }
36
37  //写入数据
38  Serial.print(F("写数据到块")); Serial.print(blockAddr);
39  Serial.println(F("..."));
40  dump_byte_array(dataBlock, 16); Serial.println();
41  status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
42  if (status != MFRC522::STATUS_OK) {
43    Serial.print(F("写入失败 "));
44    Serial.println(mfrc522.GetStatusCodeName(status));
45  }
46  Serial.println();
47
48  //读取写入后块数据
49  Serial.print(F("读取写入后块")); Serial.print(blockAddr);
50  Serial.println(F("数据..."));
51  status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
52  if (status != MFRC522::STATUS_OK) {
53    Serial.print(F("读取失败 "));
54    Serial.println(mfrc522.GetStatusCodeName(status));
55  }
56  Serial.print(F("块")); Serial.print(blockAddr); Serial.println(F("块:"));
57  dump_byte_array(buffer, 16); Serial.println();
58...

3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

e465b08f4d25785e7caecbac0d7a8b21.png
程序下载
4 实验现象

打开串口监视器,波特率设置成与程序中相一致的9600。将卡靠近模块,根据打印信息可看到数据被写入到指定块中。

80446ecd320cd1bd4ae32f41aadf047a.gif
实验现象


推荐阅读:

Arduino提高篇19—RFID模块的使用

月球计划—ESP8266接入小爱同学控制彩灯

关注公众号「TonyCode」,后台回复提高,获取文中代码资源。

6262bf8cfa13c3c6634dc75d75e1cf79.png

后台回复「1024」获取1000G学习资料

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页