Ruslan_nig

write_data1

Dec 22nd, 2021
1,612
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //https://arthurphdent.livejournal.com/1759.html
  2. //запись данных
  3. // Тестировалось на Arduino IDE 1.0.1
  4. #include <SPI.h>
  5. #include <MFRC522.h>
  6.  
  7.  
  8. #define RST_PIN         9          
  9. #define SS_PIN          10          
  10.  
  11. MFRC522 mfrc522(SS_PIN, RST_PIN);  
  12. MFRC522::MIFARE_Key key;
  13.  
  14. void setup() {
  15.     Serial.begin(9600);
  16.     while (!Serial);    
  17.     SPI.begin();        
  18.     mfrc522.PCD_Init();
  19.  
  20.     // Подготовим ключ
  21.     // используем ключ FFFFFFFFFFFFh который является стандартом для пустых карт
  22.     for (byte i = 0; i < 6; i++) {
  23.         key.keyByte[i] = 0xFF;
  24.     }
  25.  
  26.     Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write."));
  27.     Serial.print(F("Using key (for A and B):"));
  28.     dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
  29.     Serial.println();
  30.    
  31.     Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1"));
  32. }
  33.  
  34. void loop() {
  35.     // Ждем новую карту
  36.     if ( ! mfrc522.PICC_IsNewCardPresent())
  37.         return;
  38.  
  39.     // Выбираем одну из карт
  40.     if ( ! mfrc522.PICC_ReadCardSerial())
  41.         return;
  42.  
  43.     // Показываем подробности карты
  44.     Serial.print(F("Card UID:"));
  45.     dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
  46.     Serial.println();
  47.     Serial.print(F("PICC type: "));
  48.     byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  49.     Serial.println(mfrc522.PICC_GetTypeName(piccType));
  50.  
  51.     // Проверяем совместимость
  52.     if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
  53.         &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
  54.         &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
  55.         Serial.println(F("This sample only works with MIFARE Classic cards."));
  56.         return;
  57.     }
  58.  
  59.     // В этом примере мы используем первый сектор данных карты, блок 4
  60.     byte sector         = 1;
  61.     byte blockAddr      = 4;
  62.     byte dataBlock[]    = { // Данные, которые мы запишем на карту
  63.         0x01, 0x02, 0x03, 0x04, //  1,  2,   3,  4,
  64.         0x05, 0x06, 0x07, 0x08, //  5,  6,   7,  8,
  65.         0x08, 0x09, 0xff, 0x0b, //  9, 10, 255, 12,
  66.         0x0c, 0x0d, 0x0e, 0x0f  // 13, 14,  15, 16
  67.     };
  68.     byte trailerBlock   = 7;
  69.     byte status;
  70.     byte buffer[18];
  71.     byte size = sizeof(buffer);
  72.  
  73.     // Аутентификация
  74.     Serial.println(F("Authenticating using key A..."));
  75.     status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
  76.     if (status != MFRC522::STATUS_OK) {
  77.         Serial.print(F("PCD_Authenticate() failed: "));
  78.         Serial.println(mfrc522.GetStatusCodeName(status));
  79.         return;
  80.     }
  81.  
  82.     // Показываем текущие данные сектора
  83.     Serial.println(F("Current data in sector:"));
  84.     mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
  85.     Serial.println();
  86.  
  87.     // Читаем данные из блока
  88.     Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
  89.     Serial.println(F(" ..."));
  90.     status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
  91.     if (status != MFRC522::STATUS_OK) {
  92.         Serial.print(F("MIFARE_Read() failed: "));
  93.         Serial.println(mfrc522.GetStatusCodeName(status));
  94.     }
  95.     Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
  96.     dump_byte_array(buffer, 16); Serial.println();
  97.     Serial.println();
  98.  
  99.     // Аутентификация
  100.     Serial.println(F("Authenticating again using key B..."));
  101.     status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
  102.     if (status != MFRC522::STATUS_OK) {
  103.         Serial.print(F("PCD_Authenticate() failed: "));
  104.         Serial.println(mfrc522.GetStatusCodeName(status));
  105.         return;
  106.     }
  107.  
  108.     // Записываем данные в блок
  109.     Serial.print(F("Writing data into block ")); Serial.print(blockAddr);
  110.     Serial.println(F(" ..."));
  111.     dump_byte_array(dataBlock, 16); Serial.println();
  112.     status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
  113.     if (status != MFRC522::STATUS_OK) {
  114.         Serial.print(F("MIFARE_Write() failed: "));
  115.         Serial.println(mfrc522.GetStatusCodeName(status));
  116.     }
  117.     Serial.println();
  118.  
  119.     // Читаем данные снова, чтобы проверить, что запись прошла успешно
  120.     Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
  121.     Serial.println(F(" ..."));
  122.     status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
  123.     if (status != MFRC522::STATUS_OK) {
  124.         Serial.print(F("MIFARE_Read() failed: "));
  125.         Serial.println(mfrc522.GetStatusCodeName(status));
  126.     }
  127.     Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
  128.     dump_byte_array(buffer, 16); Serial.println();
  129.        
  130.     Serial.println(F("Checking result..."));
  131.     byte count = 0;
  132.     for (byte i = 0; i < 16; i++) {
  133.         if (buffer[i] == dataBlock[i])
  134.             count++;
  135.     }
  136.     Serial.print(F("Number of bytes that match = ")); Serial.println(count);
  137.     if (count == 16) {
  138.         Serial.println(F("Success :-)"));
  139.     } else {
  140.         Serial.println(F("Failure, no match :-("));
  141.         Serial.println(F("  perhaps the write didn't work properly..."));
  142.     }
  143.     Serial.println();
  144.        
  145.     // Выводим данные
  146.     Serial.println(F("Current data in sector:"));
  147.     mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
  148.     Serial.println();
  149.  
  150.     mfrc522.PICC_HaltA();
  151.     mfrc522.PCD_StopCrypto1();
  152. }
  153.  
  154. void dump_byte_array(byte *buffer, byte bufferSize) {
  155.     for (byte i = 0; i < bufferSize; i++) {
  156.         Serial.print(buffer[i] < 0x10 ? " 0" : " ");
  157.         Serial.print(buffer[i], HEX);
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment