Arduino nano + Eth + RFID (SPI) Проблема связки

Calligraff
Offline
Зарегистрирован: 19.07.2021
Доброго времени суток.
Никак не могу понять одной возникшей проблемы с двумя SPI устройствами.
 
Попробую по порядку и подробнее.
 
Имеем три устройства:
1. Arduino nano (далее ANano)
2. Ethernet Shield ENC28J60 (далее ETH)
3. RFID-RC522 (далее RFID)
 
Итак.
Связка ANano + ETH работает отлично.
Связка ANano + RFID так же работает без проблем.
 
Теперь все это совмещаем ANano + ETH + RFID.
У RFID ножки SDA(SS) и RST подключаем к D7 и D8 соответственно, о чем так же делаем изменение в коде
 
#define RST_PIN         8
#define SS_PIN          7
 
Теперь о самой проблеме.
В связке ANano + ETH + RFID последний (т.е. RFID) отказывается работать.
Методом научного тыка было выявлено, что проблема вылазит когда на ножке D12 одновременно два этих устройства с SPI.
Стоит с D12 снять ETH, то RFID работает отлично. И наоборот, снять с D12 RFID, то ETH работает отлично.
Когда на D12 присутствуют оба устройства, то работает только ETH
 
Подскажите куда капать?
 
Используются библиотеки:
SPI версии 1.0
MFRC522 версии 1.4.8
UIPEthernet версии 2.0.10
 
Код программы:
 
#include <UIPEthernet.h>
#include <MFRC522.h>

#define RFID_RST_PIN    8                   // Configurable, see typical pin layout above
#define RFID_SS_PIN     7                   // Configurable, see typical pin layout above

MFRC522 mfrc522(RFID_SS_PIN, RFID_RST_PIN); // Create MFRC522 instance

EthernetClient client;

void setup() {

  Serial.begin(9600);
  Serial.println("Start setup");

  uint8_t mac[6] = {0x02,0xA7,0xD5,0x00,0x00,0x01};
  Ethernet.begin(mac);

  Serial.print("localIP: ");
  Serial.println(Ethernet.localIP());
  Serial.print("subnetMask: ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("gatewayIP: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("dnsServerIP: ");
  Serial.println(Ethernet.dnsServerIP());

  mfrc522.PCD_Init();                       // Init MFRC522 card
  Serial.println("Start main program");
}

void loop() {

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

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  Serial.println(F("**Card Detected:**"));

  mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid)); //dump some details about the card

}

 

 

Calligraff
Offline
Зарегистрирован: 19.07.2021

Небольшая попровка: ETH и без RFID и c RFID на D12 работает без проблем

Calligraff
Offline
Зарегистрирован: 19.07.2021

sadman41
Offline
Зарегистрирован: 19.10.2016

Мож RC522 считает, что один на линии и CS ему не указ.

Calligraff
Offline
Зарегистрирован: 19.07.2021

Или наоборот ETH так считает. осциллографа жаль нет

Calligraff
Offline
Зарегистрирован: 19.07.2021

Попробовал на обоих устройствак по очереди поодключать ногу SS. И тот и другой понимает когда им кидают или не кидают LOW на ножку SS

b707
Offline
Зарегистрирован: 26.05.2017

Тогда в коде, не надеясь на библиотеку, вручную рулите соответствующими ногами. Приходилось такое делать как раз с RC522- помогало

Calligraff
Offline
Зарегистрирован: 19.07.2021

Если правильно вас понял, то вот так тоже не хочет.

 

#include <UIPEthernet.h>
#include <MFRC522.h>

#define RFID_RST_PIN    8                   // Configurable, see typical pin layout above
#define RFID_SS_PIN     7                   // Configurable, see typical pin layout above

MFRC522 mfrc522(RFID_SS_PIN, RFID_RST_PIN); // Create MFRC522 instance

EthernetClient client;

void setup() {

  Serial.begin(9600);
  Serial.println("Start setup");

  uint8_t mac[6] = {0x02,0xA7,0xD5,0x00,0x00,0x01};
  Ethernet.begin(mac);

  Serial.print("localIP: ");
  Serial.println(Ethernet.localIP());
  Serial.print("subnetMask: ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("gatewayIP: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("dnsServerIP: ");
  Serial.println(Ethernet.dnsServerIP());

  mfrc522.PCD_Init();                       // Init MFRC522 card


  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  pinMode(RFID_SS_PIN, OUTPUT);
  digitalWrite(RFID_SS_PIN, HIGH);

  
  Serial.println("Start main program");
}

void loop() {
  digitalWrite(10, HIGH);
  digitalWrite(RFID_SS_PIN, LOW);
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    digitalWrite(RFID_SS_PIN, HIGH);
    return;
  }

  digitalWrite(10, HIGH);
  digitalWrite(RFID_SS_PIN, LOW);
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    digitalWrite(RFID_SS_PIN, HIGH);
    return;
  }
  digitalWrite(RFID_SS_PIN, HIGH);

  Serial.println(F("**Card Detected:**"));

  mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid)); //dump some details about the card

}

Такое ощущение, что ETH на себя забирает все что RFID пытается передать в ANano на ногу D12

sadman41
Offline
Зарегистрирован: 19.10.2016

ENC пока можно не дергать, на нее не жаловались.

b707
Offline
Зарегистрирован: 26.05.2017

Calligraff пишет:

Такое ощущение, что ETH на себя забирает все что RFID пытается передать в ANano на ногу D12

не вижу в коде, где вы задаете SS для Eth

sadman41 пишет:

ENC пока можно не дергать, на нее не жаловались.

не согласен. Если уж рулить вручную - то всеми модулями. тем более что это не трудно

Calligraff
Offline
Зарегистрирован: 19.07.2021

b707 пишет:

не вижу в коде, где вы задаете SS для Eth

Строки 30-31

  pinMode(10, OUTPUT);

  digitalWrite(10, HIGH);
 
b707
Offline
Зарегистрирован: 26.05.2017

Calligraff пишет:

Строки 30-31

  pinMode(10, OUTPUT);

  digitalWrite(10, HIGH);
 

отлично, а ETH как узнает, что пин 10 - это его SS ?

b707
Offline
Зарегистрирован: 26.05.2017

Calligraff, полез читать про ваш шилд и нашел такое инфо: (это из описания библиотеки UIPEthernet.h на гитхабе, файл UIPEthernet/hardware/README.md) :

The shields use logic gates (74HCT08) instead of a Tri-State Digital Buffer (74HC125) to convert the MISO line to 5 V . This creates problems. SPI device not selected by CS pin should release the MISO line by setting the output pin to HI-Z state. The enc28j60 of course does this, but the logic gate can't. It stays HIGH, blocking the bus. No other device can be used on SPI with this shield attached. (Many 5 V SD card adapters have the same problem with the level conversion on the MISO line.)

В общем, у меня для вас плохие новости - похоже ваш шилд полностью блокирует SPI шину ардуино.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

не согласен. Если уж рулить вручную - то всеми модулями. тем более что это не трудно

Те библиотеки, которые я видел, дергали SS перед каждым трансфером. А они там на каждый пук.

Так что не особо угадаешь - поможет ручной вынос модуля с линии или нет.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

The shields use logic gates (74HCT08) instead of a Tri-State Digital Buffer (74HC125) to convert the MISO line to 5 V . This creates problems. SPI device not selected by CS pin should release the MISO line by setting the output pin to HI-Z state. The enc28j60 of course does this, but the logic gate can't. It stays HIGH, blocking the bus. No other device can be used on SPI with this shield attached. (Many 5 V SD card adapters have the same problem with the level conversion on the MISO line.)

А вот это забавно. Надо будет запомнить. На моих синеньких вообще нет никакого левелшифтера и проблем не наблюдалось:

Придется SoftwareSPI городить или переключать ридер в I2C. Или модуль сетевой менять.

 

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Придется SoftwareSPI городить или переключать ридер в I2C. Или модуль сетевой менять.

можно еще поставить управляемый буфер типа FST3125 и отрубать ETH от MISO, в подобных ситуациях народ делал, говорят успешно

Calligraff
Offline
Зарегистрирован: 19.07.2021

Вот такой девайс еще откопал у себя

Calligraff
Offline
Зарегистрирован: 19.07.2021

Вообще если порыться, то у меня этих плат сетевых должно быть уйма. В свое время заказывал пачками всякого разного. Потом забросил все из-за работы. Сейчас вот на больничном разгребаю :)

Calligraff
Offline
Зарегистрирован: 19.07.2021
USR-TCP232-T2 это малогабаритный модуль преобразователь последовательного интерфейса в Ethernet, который может осуществлять двунаправленную прозрачную передачу данных между последовательным портом с TTL уровнем сигнала и портом RJ45. Его также можно применять для подключения интерфейсов RS232/ RS485, подключив преобразователь уровня сигналов.USR-TCP232-S2 построен на основе микроконтроллера с ядром Cortex-M0. Микроконтроллер характеризуется малым энергопотреблением, высоким быстродействием и эффективностью
Calligraff
Offline
Зарегистрирован: 19.07.2021

Нашел еще такую информацию:

Микросхема MFRC522 поддерживает интерфейсы SPI, UART и I2C. Выбор интерфейса осуществляется установкой логических уровней на определенных выводах микросхемы. В Arduino принято использовать SPI.

RC-522

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если проблема в том, что какое-то из SPI устройств не желает отпускать MISO и тем самым блокирует работу других устройств, можно попытаться подключить MISO этого устройства через резистор 1-2к. Я так делал с 74HC165, которые наряду с другими устройствами подключал к SPI.

Calligraff
Offline
Зарегистрирован: 19.07.2021

andriano пишет:

Если проблема в том, что какое-то из SPI устройств не желает отпускать MISO и тем самым блокирует работу других устройств, можно попытаться подключить MISO этого устройства через резистор 1-2к. Я так делал с 74HC165, которые наряду с другими устройствами подключал к SPI.

 

А ваш совет заработал. Посадил RFID напрямую к D12 ANano, а ETH на эту ногу посадил через сопротивление 660Ом (методом научного тыка подбор осуществлялся).

Спасибо Вам :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Calligraff пишет:

...сопротивление 660Ом

Может, 680?

Calligraff
Offline
Зарегистрирован: 19.07.2021

andriano пишет:

Calligraff пишет:

...сопротивление 660Ом

Может, 680?

 

Нет. 660 Ом. 2 сопротивления по 330 Ом :) Ну что под руку попалось