Arduino Uno - Как записать персональные данные в NTAG213 с помощью RFID-RC522
Я пытаюсь написать некоторые данные в стикере NTAG213 с этим кодом:
#include <SPI.h>
#include <MFRC522.h>
constexpr uint8_t RST_PIN = 9; // Конфигурируемый, см. типичный макет pin выше
constexpr uint8_t SS_PIN = 10; // Конфигурируемый, см. типичный макет pin выше
MFRC522 mfrc522(SS_PIN, RST_PIN); // Создать экземпляр MFRC522
void setup() {
Serial.begin(9600); // Инициализация последовательной связи с ПК
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println(F("Запись персональных данных на MIFARE PICC "));
}
void loop() {
// Подготовить ключ - все ключи настроены на FFFFFFFFFFFFh при доставке чипа с завода.
MFRC522::MIFARE_Key key;
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
// Ищите новые карты
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Выберите одну из карт
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
Serial.print(F("Card UID:")); //Dump UID
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
Serial.print(F(" PICC type: ")); // Dump PICC type
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
byte buffer[34];
byte block;
MFRC522::StatusCode status;
byte len;
Serial.setTimeout(20000L) ; // подождите до 20 секунд для ввода от serial
// Запрашивать персональные данные: Фамилия
Serial.println(F("Введите фамилию, заканчивающуюся на #"));
len = Serial.readBytesUntil('#', (char *) buffer, 30) ; // read family name from serial
for (byte i = len; i < 30; i++) buffer[i] = ' '; // pad with spaces
block = 1;
//Serial.println(F("Аутентификация с использованием ключа A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("PCD_Authenticate() success: "));
// Write block
status = mfrc522.MIFARE_Write(block, buffer, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
block = 2;
//Serial.println(F("Аутентификация с использованием ключа A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write block
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
// Спросите личные данные: Имя
Serial.println(F("Введите имя, заканчивающееся на #"));
len = Serial.readBytesUntil('#', (char *) buffer, 20) ; // read first name from serial
for (byte i = len; i < 20; i++) buffer[i] = ' '; // pad with spaces
block = 4;
//Serial.println(F("Аутентификация с использованием ключа A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write block
status = mfrc522.MIFARE_Write(block, buffer, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
block = 5;
//Serial.println(F("Аутентификация с использованием ключа A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write block
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
Serial.println(" ");
mfrc522.PICC_HaltA(); // Halt PICC
mfrc522.PCD_StopCrypto1(); // Остановить шифрование на PCD
}
С тегом и картой, включенными в модуль (RC522), этот код отлично работает:
С наклейкой NTAG213 код не работает:
Мне нужно записать данные в эти стикеры, как я могу это сделать?
@davids182009, 👍2
Обсуждение1 ответ
▲ 2
Тот, который поставляется с RC552, - это MiFare Classic 1K
И запущенное программирование предназначено для того же самого.
Ntag213-это MiFare Ultralight C, который требует другого типа программирования..
Попробуй вот это
/* mifare ultralight example (25-02-2018)
*
* RFID-RC522 (SPI connexion)
*
* CARD RC522 Arduino (UNO)
* SDA ----------- 10 (Configurable, see SS_PIN constant)
* SCK ----------- 13
* MOSI ----------- 11
* MISO ----------- 12
* IRQ -----------
* GND ----------- GND
* RST ----------- 9 (onfigurable, see RST_PIN constant)
* 3.3V ----------- 3.3V
*
*/
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 6
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
MFRC522::StatusCode status; //variable to get card status
byte buffer[18]; //data transfer buffer (16+2 bytes data+CRC)
byte size = sizeof(buffer);
uint8_t pageAddr = 0x06; //In this example we will write/read 16 bytes (page 6,7,8 and 9).
//Ultraligth mem = 16 pages. 4 bytes per page.
//Pages 0 to 4 are for special functions.
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println(F("Sketch has been started!"));
memcpy(buffer,"HELLO WORLD! ;-)",16);
}
void loop() {
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
return;
// Write data ***********************************************
for (int i=0; i < 4; i++) {
//data is writen in blocks of 4 bytes (4 bytes per page)
status = (MFRC522::StatusCode) mfrc522.MIFARE_Ultralight_Write(pageAddr+i, &buffer[i*4], 4);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Read() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
}
Serial.println(F("MIFARE_Ultralight_Write() OK "));
Serial.println();
// Read data ***************************************************
Serial.println(F("Reading data ... "));
//data in 4 block is readed at once.
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(pageAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Read() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
Serial.print(F("Readed data: "));
//Dump a byte array to Serial
for (byte i = 0; i < 16; i++) {
Serial.write(buffer[i]);
}
Serial.println();
mfrc522.PICC_HaltA();
}
,
@Vivek B.
Смотрите также:
- Использование прерываний с RC522
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- rfid_default_keys проверить с помощью RC522
- MFRC522: прошивка неизвестна
- MFRC522 не сканируется карта
- RFID-RC522 не работает, горит красный светодиод
- Считывание одновременно RFID-МЕТКИ с помощью нескольких RFID-считывателей [MFRC522]
- Отправка данных из ESP8266 в PHP
Я также пытался использовать этот код, спасибо за ваш ответ, но я хотел бы записать данные в NTAG213 NFC-метки с последовательного монитора. Первый код (пример кода из библиотеки) работает с последовательным монитором. Как мы можем записывать данные с последовательного монитора?, @Gökhan