Загрузка данных


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

#define SS_PIN 10
#define RST_PIN 9

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

// Все данные с Ultralight (страницы 00-0B по 4 байта)
byte block1[16] = {
  0x04, 0xD5, 0x23, 0x7A,  // Addr 00
  0x62, 0x43, 0x60, 0x80,  // Addr 01
  0xC1, 0x48, 0x00, 0x00,  // Addr 02
  0x00, 0x00, 0x00, 0x00   // Addr 03
};

byte block2[16] = {
  0x44, 0x6F, 0x6D, 0x6F,  // Addr 04 = "Domo"
  0x66, 0x6F, 0x6E, 0x2E,  // Addr 05 = "fon."
  0x6E, 0x65, 0x74, 0x00,  // Addr 06 = "net"
  0x00, 0x00, 0x00, 0x00   // Addr 07
};

void initRFID() {
  rfid.PCD_Init();
  delay(50);
  rfid.PCD_SetAntennaGain(rfid.RxGain_max);
}

void setup() {
  Serial.begin(9600);
  SPI.begin();
  initRFID();
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
  Serial.println("Поднеси Classic карту для записи...");
}

void loop() {
  delay(200);

  if (!rfid.PICC_IsNewCardPresent()) return;
  if (!rfid.PICC_ReadCardSerial()) return;

  // Проверяем что это Classic
  MFRC522::PICC_Type type = rfid.PICC_GetType(rfid.uid.sak);
  Serial.print("Тип карты: ");
  Serial.println(rfid.PICC_GetTypeName(type));

  if (type != MFRC522::PICC_TYPE_MIFARE_MINI &&
      type != MFRC522::PICC_TYPE_MIFARE_1K &&
      type != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("Это не Classic! Нужна MIFARE Classic карта.");
    rfid.PICC_HaltA();
    return;
  }

  Serial.println("Classic найдена! Записываю...");

  // Записываем блок 1
  if (!writeBlock(1, block1)) return;
  Serial.println("Блок 1 записан!");

  // Записываем блок 2
  if (!writeBlock(2, block2)) return;
  Serial.println("Блок 2 записан!");

  Serial.println("Готово! Все данные записаны.");
  Serial.println("Поднеси снова чтобы записать ещё раз.");

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
  initRFID();
}

bool writeBlock(byte block, byte* data) {
  MFRC522::StatusCode s = rfid.PCD_Authenticate(
    MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &rfid.uid
  );
  if (s != MFRC522::STATUS_OK) {
    Serial.print("Ошибка аутентификации блока ");
    Serial.print(block);
    Serial.print(": ");
    Serial.println(rfid.GetStatusCodeName(s));
    rfid.PICC_HaltA();
    rfid.PCD_StopCrypto1();
    return false;
  }

  s = rfid.MIFARE_Write(block, data, 16);
  if (s != MFRC522::STATUS_OK) {
    Serial.print("Ошибка записи блока ");
    Serial.print(block);
    Serial.print(": ");
    Serial.println(rfid.GetStatusCodeName(s));
    rfid.PICC_HaltA();
    rfid.PCD_StopCrypto1();
    return false;
  }
  return true;
}