Не работает 1 из 4 модулей RFID RC522 подключенных к Nano

Добрый день!

Подключил по классической схеме (RST - D10, MOSI - D11, MISO - D12, SCK - D13), все выводы параллельно, кроме SDA (D6 - D9). Мой модуль на 6 пине не работает. (Сейчас он на D7 - не работает (попытка проверить пин ардуино)).

Пример с github страницы библиотеки MFRC522 на подключение нескольких модулей, немного измененный под 4 модуля.:

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


#define RST_PIN         10          // Configurable, see typical pin layout above

#define SS_1_PIN        6         // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 2
#define SS_2_PIN        7          // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 1
#define SS_3_PIN        8
#define SS_4_PIN        9

#define NR_OF_READERS   4

byte ssPins[] = {SS_1_PIN, SS_2_PIN, SS_3_PIN, SS_4_PIN};

MFRC522 mfrc522[NR_OF_READERS];   // Create MFRC522 instance.

/**

* Initialize.

*/

void setup() {



  Serial.begin(9600); // Initialize serial communications with the PC

  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)

  SPI.begin();        // Init SPI bus

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {

    mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN); // Init each MFRC522 card

    Serial.print(F("Reader "));

    Serial.print(reader);

    Serial.print(F(": "));

    mfrc522[reader].PCD_DumpVersionToSerial();

  }

}



/**

* Main loop.

*/

void loop() {

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {

    // Look for new cards
    if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {

      Serial.print(F("Reader "));

      Serial.print(reader);

      // Show some details of the PICC (that is: the tag/card)

      Serial.print(F(": Card UID:"));

      dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);

      Serial.println();

      Serial.print(F("PICC type: "));

      MFRC522::PICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);

      Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));



      // Halt PICC

      mfrc522[reader].PICC_HaltA();

      // Stop encryption on PCD

      mfrc522[reader].PCD_StopCrypto1();

    } //if (mfrc522[reader].PICC_IsNewC

  } //for(uint8_t reader

}
/**

* Helper routine to dump a byte array as hex values to Serial.

*/

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

  }
}

Что получаю в COM:

Reader 0: Firmware Version: 0x82
Reader 1: Firmware Version: 0xB2 (тот самый нерабочий модуль)
Reader 2: Firmware Version: 0x82
Reader 3: Firmware Version: 0x82

Рабочие модули выводят 0x82, читают, записывают. Что я пытался сделать для решения проблемы:

  • Попробовал два новых модуля вместо нерабочего

  • Заменил кабель (использую витую пару для этих модулей длиной 1 метр)

  • Я проверил все соединения и не обнаружил ошибок. Максимальное сопротивление между модулями и контактами Arduino составило 0,1 Ом.

  • Чат GPT подсказал, что один из модулей может создавать помехи на линии MOSI. Я физически отключал по очереди каждый работающий модуль от линии MOSI — в терминале тот же код (0xB2), даже после отключения всех модулей. Остальные теперь показывают 0x0.

Ничего не помогает, вторые сутки борюсь с проблемой.

Думал может проблема в питании, и нужно стабилизатор на 3.3 дополнительно поставить, а не брать с нано. Но тогда бы не было бы проблем только с одним конкретным, да ведь?

Это да. Так лучше сделать в любом случае

Попробуйте добавить небольшую задержку (100 - 300 ms) после SPI.begin();

модули можно все в мусорку, ЧИПЫ ПОДДЕЛЬНЫЕ, у правильных чипов Firmware Version 0x92

15:57:15.959 -> *****************************
15:57:15.959 -> MFRC522 Digital self test
15:57:15.959 -> *****************************
15:57:15.992 -> Firmware Version: 0x92 = v2.0
15:57:16.025 -> -----------------------------
15:57:16.092 -> Only known versions supported
15:57:16.092 -> -----------------------------
15:57:16.125 -> Performing test...
15:57:16.230 -> -----------------------------
15:57:16.230 -> Result: OK

ЗЫ какую библиотеку используете?

MFRC522.h

Не помогло(

Эту?

Да, ее

а отдельно модуль работает?

В принципе я могу сейчас заморочиться - отпаять его и на другой ардуинке протестировать, но я же уже 3 разных модуля пытался поставить на это место. При чем один из партии с озона, один с алика и один просто в магазине радиотехники. Единственная разница - с одним из них показывал 0x90, а не 0xB2

тут патчатся, попробуй:

/*
 * --------------------------------------------------------------------------------------------------------------------
 * Example sketch/program to test your firmware.
 * --------------------------------------------------------------------------------------------------------------------
 * This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
 * 
 * This example test the firmware of your MFRC522 reader module, only known version can be checked. If the test passed
 * it do not mean that your module is faultless! Some modules have bad or broken antennas or the PICC is broken.
 * 
 * @author Rotzbua
 * @license Released into the public domain.
 * 
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 *
 * More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
 */

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


#define RST_PIN         10        // Configurable, see typical pin layout above

#define SS_1_PIN        6         // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 2
#define SS_2_PIN        7         // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 1
#define SS_3_PIN        8
#define SS_4_PIN        9

#define NR_OF_READERS   4

byte ssPins[] = {SS_1_PIN, SS_2_PIN, SS_3_PIN, SS_4_PIN};

MFRC522 mfrc522[NR_OF_READERS];   // Create MFRC522 instance.

byte version;
volatile uint8_t rdr;

// Расширенный патч для проблемных клонов
void extendedPatchForV0x82() {
  version = mfrc522[rdr].PCD_ReadRegister(MFRC522::VersionReg);
  
  if (version == 0x82 || version == 0x80 || version == 0x81 || version == 0xB2) {
    Serial.println(F("Применяем расширенный патч"));
    
    // Полный сброс модуля
    digitalWrite(RST_PIN, LOW);
    delay(100);
    digitalWrite(RST_PIN, HIGH);
    delay(100);
    
    // Повторная инициализация
    //mfrc522.PCD_Init();
    mfrc522[rdr].PCD_Init(ssPins[rdr], RST_PIN);
    delay(10);
    
    // Расширенные настройки RF
    mfrc522[rdr].PCD_WriteRegister(MFRC522::RFCfgReg, 0x87);    // RxGain 43.3dB
    mfrc522[rdr].PCD_WriteRegister(MFRC522::GsNReg, 0x3D);      // 48dB gain
    //mfrc522[rdr].PCD_WriteRegister(MFRC522::CWGsCfgReg, 0x2B);  // Modulator conductance
    //mfrc522[rdr].PCD_WriteRegister(MFRC522::ModGsCfgReg, 0x1B); // Modulator settings
    
    // Настройка таймера
    mfrc522[rdr].PCD_WriteRegister(MFRC522::TModeReg, 0x8D);
    mfrc522[rdr].PCD_WriteRegister(MFRC522::TPrescalerReg, 0x3E);
    mfrc522[rdr].PCD_WriteRegister(MFRC522::TReloadRegL, 30);
    mfrc522[rdr].PCD_WriteRegister(MFRC522::TReloadRegH, 0);
    
    // Включение антенны
    mfrc522[rdr].PCD_WriteRegister(MFRC522::TxControlReg, 0x03);
    
    Serial.println(F("Расширенный патч применен"));
  }
}

/**
* Initialize.
*/
void setup() {

  Serial.begin(9600); // Initialize serial communications with the PC
  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();        // Init SPI bus
  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    rdr = reader;
    mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN); // Init each MFRC522 card
    Serial.print(F("Reader "));
    Serial.print(reader);
    Serial.print(F(": "));
    mfrc522[reader].PCD_DumpVersionToSerial();
    extendedPatchForV0x82();
  }
}



/**
* Main loop.
*/
void loop() {

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    // Look for new cards
    if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
      Serial.print(F("Reader "));
      Serial.print(reader);

      // Show some details of the PICC (that is: the tag/card)
      Serial.print(F(": Card UID:"));
      dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
      Serial.println();
      Serial.print(F("PICC type: "));
      MFRC522::PICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);
      Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));

      // Halt PICC
      mfrc522[reader].PICC_HaltA();
      // Stop encryption on PCD
      mfrc522[reader].PCD_StopCrypto1();
    } //if (mfrc522[reader].PICC_IsNewC
  } //for(uint8_t reader
}

/**
Helper routine to dump a byte array as hex values to Serial.
*/
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);
  }
}

Попробовал

Вывод с порта:

Reader 0: Firmware Version: 0x82 = (unknown)
Применяем расширенный патч
Расширенный патч применен
Reader 1: Firmware Version: 0xB2 = (unknown)
Применяем расширенный патч
Расширенный патч применен

Иногда такой:

Reader 0: Firmware Version: 0x82 = (unknown)
Применяем расширенный патч
Расширенный патч применен
Reader 1: 
byte ssPins[] = {SS_2_PIN, SS_1_PIN, SS_3_PIN, SS_4_PIN};

вот так еще сделайте что бы исключить проблему в пине)))

#define RST_PIN а разве можно 1 пин использовать ? не нужен ли для каждого устройства свой ? (тут я не уверен)

а что если уменьшить скорость spi ?

пока все хорошие варианты не разобрали, вот от меня тройка)))

должен все пропатчить иначе проблема уже на стадии инициализации

	switch (version) {
		case 0x88:	// Fudan Semiconductor FM17522 clone
			reference = FM17522_firmware_reference;
			break;
		case 0x90:	// Version 0.0
			reference = MFRC522_firmware_referenceV0_0;
			break;
		case 0x91:	// Version 1.0
			reference = MFRC522_firmware_referenceV1_0;
			break;
		case 0x92:	// Version 2.0
			reference = MFRC522_firmware_referenceV2_0;
			break;
				default:	// Unknown version
			return false; // abort test

Сделайте нормальное питание,
так же не помешает подтяжка на всех CS через резистор ~5кОм к +5в.

P.S. Или попробуйте перед стр.34 (инитом ридеров) , из #1 сообщения,
вставить

for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
   pinMode(ssPins[reader], OUTPUT);
   digitalWrite(ssPins[reader], HIGH);
   }

P.P.S. Про согласование лог. уровней забыл.
Добавьте хотя-бы резисторы ~ 300 Ом на линии MOSI

На такие вопросы давайте ПОЛНУЮ ссылку. Ну, конечно, если не считаете, что кто-то должен за Вас её искать.

С питанием пока не решил вопрос, никак не могу найти стабилизаторы на 3.3, давно не использовал и куда-то пропали. А вот ваш код на отключение всех модулей перед инициализацией дал интересный результат - теперь нерабочий модуль выдает 0x90 вместо 0xB2, но он все также не работает(

Ну так , пока идёт инит первого модуля - другие “болтаются”, если нет подтяжки. При этом могут мешать работе SPI.
Оставить модуль один на том же пине, поменять местами, но всё равно, сначала питание, и согласов. лог. уровней ИМХО

Добавил в этот код тоже эту часть, которую предложил дим димыч. Теперь все патчатся, кроме нерабочего, все не работают после патча

Reader 0: Firmware Version: 0x82 = (unknown)
Применяем расширенный патч
Расширенный патч применен
Reader 1: Firmware Version: 0x90 = v0.0
Reader 2: Firmware Version: 0x82 = (unknown)
Применяем расширенный патч
Расширенный патч применен
Reader 3: Firmware Version: 0x82 = (unknown)
Применяем расширенный патч
Расширенный патч применен

Если поменять “нерабочий” модуль пинами с “рабочим” - то что будет? Какой из двух модулей покажет ошибку ?