Arduino nano + Eth + RFID (SPI) Проблема связки
- Войдите на сайт для отправки комментариев
Пнд, 19/07/2021 - 19:53
Доброго времени суток.
Никак не могу понять одной возникшей проблемы с двумя 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 }
Небольшая попровка: ETH и без RFID и c RFID на D12 работает без проблем
Мож RC522 считает, что один на линии и CS ему не указ.
Или наоборот ETH так считает. осциллографа жаль нет
Попробовал на обоих устройствак по очереди поодключать ногу SS. И тот и другой понимает когда им кидают или не кидают LOW на ножку SS
Тогда в коде, не надеясь на библиотеку, вручную рулите соответствующими ногами. Приходилось такое делать как раз с RC522- помогало
Если правильно вас понял, то вот так тоже не хочет.
Такое ощущение, что ETH на себя забирает все что RFID пытается передать в ANano на ногу D12
ENC пока можно не дергать, на нее не жаловались.
Такое ощущение, что ETH на себя забирает все что RFID пытается передать в ANano на ногу D12
не вижу в коде, где вы задаете SS для Eth
ENC пока можно не дергать, на нее не жаловались.
не согласен. Если уж рулить вручную - то всеми модулями. тем более что это не трудно
не вижу в коде, где вы задаете SS для Eth
Строки 30-31
pinMode(10, OUTPUT);
Строки 30-31
pinMode(10, OUTPUT);
отлично, а ETH как узнает, что пин 10 - это его SS ?
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 шину ардуино.
не согласен. Если уж рулить вручную - то всеми модулями. тем более что это не трудно
Те библиотеки, которые я видел, дергали SS перед каждым трансфером. А они там на каждый пук.
Так что не особо угадаешь - поможет ручной вынос модуля с линии или нет.
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. Или модуль сетевой менять.
Придется SoftwareSPI городить или переключать ридер в I2C. Или модуль сетевой менять.
можно еще поставить управляемый буфер типа FST3125 и отрубать ETH от MISO, в подобных ситуациях народ делал, говорят успешно
Вот такой девайс еще откопал у себя
Вообще если порыться, то у меня этих плат сетевых должно быть уйма. В свое время заказывал пачками всякого разного. Потом забросил все из-за работы. Сейчас вот на больничном разгребаю :)
Нашел еще такую информацию:
Микросхема MFRC522 поддерживает интерфейсы SPI, UART и I2C. Выбор интерфейса осуществляется установкой логических уровней на определенных выводах микросхемы. В Arduino принято использовать SPI.
Если проблема в том, что какое-то из SPI устройств не желает отпускать MISO и тем самым блокирует работу других устройств, можно попытаться подключить MISO этого устройства через резистор 1-2к. Я так делал с 74HC165, которые наряду с другими устройствами подключал к SPI.
Если проблема в том, что какое-то из SPI устройств не желает отпускать MISO и тем самым блокирует работу других устройств, можно попытаться подключить MISO этого устройства через резистор 1-2к. Я так делал с 74HC165, которые наряду с другими устройствами подключал к SPI.
А ваш совет заработал. Посадил RFID напрямую к D12 ANano, а ETH на эту ногу посадил через сопротивление 660Ом (методом научного тыка подбор осуществлялся).
Спасибо Вам :)
...сопротивление 660Ом
Может, 680?
...сопротивление 660Ом
Может, 680?
Нет. 660 Ом. 2 сопротивления по 330 Ом :) Ну что под руку попалось