Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Информационные технологии
+2

Arduino nano и RC522 выдают ошибку PCD_Authenticate(): FAILEDTimeout in communication.

Здравствуйте! На днях решил познакомиться с библиотекой MFRC522. Нашел тестовый скетч:

#include <SPI.h>

#include <MFRC522.h>

const int RST_PIN = 9;

const int SS_PIN = 10;

MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {

Serial.begin(9600);

SPI.begin();

mfrc522.PCD_Init();

}

void loop() {

byte block = 4;

byte buffer[16];

byte buffer_size = sizeof(buffer);

MFRC522::MIFARE_Key key;

MFRC522::StatusCode status;

key = { 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5 };

byte data_set[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

if ( ! mfrc522.PICC_IsNewCardPresent()) { return; }

if ( ! mfrc522.PICC_ReadCardSerial()) { return; }

// AUTHENTICATE USING KEY A : STARTS

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"));

}

// AUTHENTICATE USING KEY A : ENDS

// WRITE BLOCK 4 : STARTS

status = mfrc522.MIFARE_Write(block, data_set, 16);

if (status != MFRC522::STATUS_OK) {

Serial.println(F("MIFARE_Write(): FAILED"));

Serial.println(mfrc522.GetStatusCodeName(status));

return;

} else {

Serial.println(F("MIFARE_Write(): SUCCESS"));

}

// WRITE BLOCK 4 : ENDS

mfrc522.PICC_HaltA(); // Halt PICC

mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD

}

Но в итоге в мониторе порта выходит ошибка

PCD_Authenticate(): FAILEDTimeout in communication.

Пробовал разные скетчи, но этот оказался самым удачным. Код аутентификации я поменял сам, т.к. моя карта немного отличается.

Странная особенность: если поменять блок с 4 на 0, то выходит ошибка записи, но не аутентификации.

Также пробовал стандартный скетч-пример из библиотеки (ReadAndWrite), ошибка та же:

Scan a MIFARE Classic PICC to demonstrate read and write.

Using key (for A and B): A0 A1 A2 A3 A4 A5

BEWARE: Data will be written to the PICC, in sector #1

Card UID: B0 03 E7 28

PICC type: MIFARE 1KB

Authenticating using key A...

PCD_Authenticate() failed: Timeout in communication.

По дате
По рейтингу
Аватар пользователя
Знаток

Ответ от [RawMind AI]:

Для решения проблемы с ошибкой PCD_Authenticate(): FAILEDTimeout in communication, можно попробовать следующие шаги:

  1. Проверьте подключение: Убедитесь, что все соединения между Arduino Nano и MFRC522 правильно установлены. Проверьте все провода на наличие окисления или плохих контактов.

  1. Настройки SPI: Убедитесь, что библиотека SPI корректно инициализирована в вашем скетче. В вашем коде это уже сделано:

12345678910111213141516171819202122232425262728293031
SPI.begin();
```

3. Использование правильных пинов: Проверьте, правильно ли вы задали пины для SS_PIN и RST_PIN. Убедитесь, что они соответствуют вашей схеме подключения.

4. Проверка библиотеки MFRC522: Обновите библиотеку MFRC522 до последней версии через менеджер библиотек Arduino IDE.

5. Настройки скорости SPI: Попробуйте изменить скорость SPI, чтобы убедиться, что она совместима с вашей платой MFRC522:
```cpp
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV16); // Установите делитель тактового сигнала SPI
```

6. Проверка ключа аутентификации: Убедитесь, что используемый вами ключ (0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5) соответствует вашей карте. Если это не так, замените его на правильный.

7. Проверка сектора и блока: Убедитесь, что вы пытаетесь записать в правильные секторы и блоки. Некоторые карты могут иметь ограничения или специфические требования к аутентификации для определенных секторов.

8. Проверка физического состояния карты: Убедитесь, что карта не повреждена и находится в рабочем состоянии. Попробуйте использовать другую карту для проверки.

9. Дебаггинг: Добавьте дополнительные выводы в монитор порта для отладки:
```cpp
Serial.println("Initializing MFRC522...");
if (!mfrc522.PCD_Init()) {
Serial.println(F("PCD Initialization failed!"));

while (1); // Зациклиться, если инициализация не удалась

}
```Если после выполнения этих шагов проблема все еще сохраняется, попробуйте использовать другой скетч для проверки работы модуля MFRC522. Например, стандартный пример `Read` из библиотеки MFRC522 может помочь определить, работает ли модуль вообще.

Если проблема остается, возможно, стоит обратиться к документации или форумам для получения дополнительной помощи и поддержкиржки.