Mejora de Arduino, capítulo 20: lectura y escritura de datos de la tarjeta S50

El módulo RC522 no solo puede leer los datos en la etiqueta, sino también escribir los datos en la etiqueta.Este artículo presenta la operación de escritura de la tarjeta S50.

1. Introducción de la tarjeta S50

La capacidad de la tarjeta IC sin contacto S50 es EEPROM de 1K byte, también conocida como tarjeta M1. La EEPROM interna se divide en 16 sectores, cada sector se divide en 4 bloques, con bloques como unidades de acceso, cada bloque está compuesto por 16 bytes.

1. Indicadores principales de la tarjeta M1:

  • Cada sector tiene un conjunto independiente de contraseñas y control de acceso.
  • Cada tarjeta tiene un número de serie único de 32 bits.
  • Ninguna fuente de alimentación, con su propia antena, contiene lógica de control cifrada y circuito de lógica de comunicación.
  • El período de retención de datos es de 10 años, puede reescribirse 100,000 veces, leerse ilimitadamente
  • Frecuencia de trabajo: 13.56 MHz
  • Velocidad de comunicación: 106 KBPS
  • Temperatura de trabajo: -20 ℃ ~ 50 ℃ (humedad 90%)

2. Estructura de almacenamiento de la tarjeta M1

La estructura de almacenamiento es la siguiente, 16 sectores, 4 bloques por sector, 64 bloques de 16 sectores pueden numerarse del 0 al 63 de acuerdo con las direcciones absolutas.

Estructura de almacenamiento de tarjeta M1

El bloque 0 en el sector 0 se usa para almacenar el código del fabricante. Los primeros cuatro bytes son generalmente UID, que se han solidificado y generalmente no se pueden cambiar.

El bloque 0, el bloque 1 y el bloque 2 de cada sector son bloques de datos, que se pueden usar para almacenar datos, y el bloque 3 es un bloque de control, que incluye la contraseña A, el control de acceso y la contraseña B.

Bloque de control

3. Proceso de lectura y escritura.

La contraseña y el control de acceso de cada sector son independientes, y cada contraseña y control de acceso se pueden configurar según las necesidades reales. La contraseña predeterminada de fábrica de 6 bytes es 0xFF.

Las condiciones de acceso de cada bloque en el sector están determinadas conjuntamente por la contraseña y el control de acceso. Cada bloque tiene tres bits de control correspondientes, que están restringidos de acuerdo con ciertas reglas. Para más detalles, consulte el manual de datos de la tarjeta M1.

Esta demostración muestra la escritura de datos en el bloque 0 en el sector 1 y la dirección absoluta es el bloque 4. El proceso principal es el siguiente: el módulo realiza el escaneo de la tarjeta para leer la información de la tarjeta, realiza la autenticación de identidad a través de la contraseña, luego lee los datos del bloque antes de escribir, luego realiza la autenticación de identidad nuevamente y escribe datos personalizados, y luego lee nuevamente después de la autenticación de identidad Bloquee datos para detectar si la escritura fue exitosa.

2. Materiales experimentales.

  • Placa de desarrollo Uno R3
  • Cable de datos USB compatible
  • Tablero de pruebas y cable de soporte
  • Módulo RFID-RC522 y tarjeta blanca S50 compatible y tarjeta de forma especial

3. Pasos experimentales

1. Construya el diagrama del circuito de acuerdo con el diagrama esquemático.

Los 3.3V y GND del módulo RC522 corresponden respectivamente a los 3.3V y GND de la placa de desarrollo El MOSI, MISO y SCK del módulo están conectados respectivamente a las interfaces SPI 11, 12, 13 de la placa de desarrollo, y el SDA y RST del módulo están conectados a los pines digitales de la placa de desarrollo 10, 9.

El diagrama esquemático experimental se muestra a continuación:

Esquema experimental

El diagrama de conexión física se muestra a continuación:

Diagrama de conexión física

2. Cree un nuevo boceto, copie el siguiente código para reemplazar el código generado automáticamente y guárdelo.

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9
#define SS_PIN          10

MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;

void setup() {
  Serial.begin(9600);
  while (!Serial);    // 等待串口打开
  SPI.begin();
  mfrc522.PCD_Init();

  // 出厂默认使用FF FF FF FF FF FF作为密码A和B
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }

  Serial.println(F("开始扫描卡进行读写..."));
  Serial.print(F("使用密码:"));
  dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
  Serial.println();
  Serial.println(F("数据将被写入到#1扇区"));
}

void loop() {
  //寻找新卡
  if ( ! mfrc522.PICC_IsNewCardPresent())
    return;

  //验证UID是否可读
  if ( ! mfrc522.PICC_ReadCardSerial())
    return;

  //显示卡信息
  Serial.print(F("卡 UID:"));
  dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
  Serial.println();
  Serial.print(F("卡类型: "));
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(mfrc522.PICC_GetTypeName(piccType));

  // 检查是否MIFARE卡类型
  if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
          &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
          &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("不支持读取此卡类型"));
    return;
  }

  // 操作扇区1
  // 扇区1包括:块4~块7
  byte sector         = 1;
  byte blockAddr      = 4;
  byte dataBlock[]    = {
    0x01, 0x02, 0x03, 0x04,
    0x05, 0x06, 0x07, 0x08,
    0x09, 0x0A, 0x0B, 0x0C,
    0x0D, 0x0E, 0x0F, 0x10
  };//要写入的数据
  byte trailerBlock   = 7;
  MFRC522::StatusCode status;
  byte buffer[18];
  byte size = sizeof(buffer);

  // 使用密码A进行身份认证
  Serial.println(F("使用密码A进行身份认证..."));
  status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("身份认证失败 "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  // 显示当前扇区数据
  Serial.println(F("当前扇区数据:"));
  mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
  Serial.println();

  // 读取写入前块数据
  Serial.print(F("读取写入前块")); Serial.print(blockAddr);
  Serial.println(F("数据..."));
  status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("读取失败 "));
    Serial.println(mfrc522.GetStatusCodeName(status));
  }
  Serial.print(F("块")); Serial.print(blockAddr); Serial.println(F("数据:"));
  dump_byte_array(buffer, 16); Serial.println();
  Serial.println();

  // 使用密码B进行身份认证
  Serial.println(F("使用密码B进行身份认证..."));
  status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("身份认证失败 "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  //写入数据
  Serial.print(F("写数据到块")); Serial.print(blockAddr);
  Serial.println(F("..."));
  dump_byte_array(dataBlock, 16); Serial.println();
  status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("写入失败 "));
    Serial.println(mfrc522.GetStatusCodeName(status));
  }
  Serial.println();

  //读取写入后块数据
  Serial.print(F("读取写入后块")); Serial.print(blockAddr);
  Serial.println(F("数据..."));
  status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("读取失败 "));
    Serial.println(mfrc522.GetStatusCodeName(status));
  }
  Serial.print(F("块")); Serial.print(blockAddr); Serial.println(F("块:"));
  dump_byte_array(buffer, 16); Serial.println();

  // 显示当前扇区数据
  Serial.println(F("当前扇区数据:"));
  mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
  Serial.println();

  //使放置在读卡区的IC卡进入休眠状态,不再重复读卡
  mfrc522.PICC_HaltA();

  // 停止读卡模块编码
  mfrc522.PCD_StopCrypto1();
}

// 十六进制输出
void dump_byte_array(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

3. Conecte la placa de desarrollo, configure el número de puerto correspondiente y el tipo de placa de desarrollo y descargue el programa.

Descarga del programa

4. Fenómenos experimentales.

Abra el monitor en serie y configure la velocidad en baudios a 9600, que es consistente con el programa. Mueva la tarjeta cerca del módulo y, de acuerdo con la información de impresión, puede ver que los datos se escriben en el bloque especificado.

Fenómeno experimental


Siga la cuenta pública "TonyCode" para compartir contenido más emocionante.
Responda "1024" para obtener materiales de aprendizaje de 1000G.
Blog personal
Inserte la descripción de la imagen aquí

Publicado 73 artículos originales · elogiados 275 · 270,000 vistas +

Supongo que te gusta

Origin blog.csdn.net/TonyIOT/article/details/105505863
Recomendado
Clasificación