W5500 и ILI9341 не работают вместе

Пишу первый раз, может чир не так оформлю, простите

Есть проект , основа Arduino Mega 2560 Pro Mini, модуль usr-es1 W5500 и экранчик на ILI9341, при тестировании по отдельности все работает как надо.
W5500 подключен к хардовым пинам SPI SS к выводу 53. библа Ethernet2.h
строка инициализации для ILI9341 -
Adafruit_ILI9341 tft = Adafruit_ILI9341(3, 7, 51, 52, 6, 50); // CS,DC,MOSI,SCK,RESET,MISO

так же отдельным пином у меня включается подсветка

как только я активирую обе железки
tft.begin(); Ethernet.begin(mac, ip);
случается следующее,W5500 работает как задумывалось, а экранчик доходит до включения подсветки и на этом все, ничего не отображается, хотя расставив контрольные метки по скетчу и мониторя их в порту сделал вывод что экранчик что то делает, временные задержки между контрольными сообщениями такие же как если бы экран что то отображал, если закоментить запуск W5500 - экран все отображает, полез по библиотекам в Ethernet2.h нашел следующее

EthernetClass() { _dhcp = NULL; w5500_cspin = 10; }
void init(uint8_t _cspin = 10) { w5500_cspin = _cspin; }

у меня CS - 53, поменял 10 на 53 ничего не поменялось после компиляции

в W5500.cpp нашел такой блок

// SPI details
SPISettings wiznet_SPI_settings(8000000, MSBFIRST, SPI_MODE0);
uint8_t SPI_CS;

void W5500Class::init(uint8_t ss_pin)
{
  SPI_CS = ss_pin;

  delay(1000);
  initSS();
  SPI.begin();
  w5500.swReset();
  for (int i=0; i<MAX_SOCK_NUM; i++) {
    uint8_t cntl_byte = (0x0C + (i<<5));
    write( 0x1E, cntl_byte, 2); //0x1E - Sn_RXBUF_SIZE
    write( 0x1F, cntl_byte, 2); //0x1F - Sn_TXBUF_SIZE
  }
}

в Adafruit_ILI9341.cpp вот такие строчки есть

#if defined(ARDUINO_ARCH_ARC32) || defined(ARDUINO_MAXIM)
#define SPI_DEFAULT_FREQ 16000000
// Teensy 3.0, 3.1/3.2, 3.5, 3.6
#elif defined(__MK20DX128__) || defined(__MK20DX256__) ||                      \
    defined(__MK64FX512__) || defined(__MK66FX1M0__)
#define SPI_DEFAULT_FREQ 40000000
#elif defined(__AVR__) || defined(TEENSYDUINO)
#define SPI_DEFAULT_FREQ 8000000
#elif defined(ESP8266) || defined(ESP32)
#define SPI_DEFAULT_FREQ 40000000
#elif defined(RASPI)
#define SPI_DEFAULT_FREQ 80000000
#elif defined(ARDUINO_ARCH_STM32F1)
#define SPI_DEFAULT_FREQ 36000000
#else
#define SPI_DEFAULT_FREQ 24000000 ///< Default SPI data clock frequency
#endif
```
не хватает знаний у меня чтоб поженить эти 2 устройства, помогите или направьте на путь истинный

может конфликт в настройках SPI?, не хватает моих знаний чтоб разобраться в проблеме, на форумах и просторах инета не нашел ничего похожего

А что с питанием? какой БП и как подключен к плате? Питание у Эзернет и экрана отдельное или от ардуино?

Питание устроено так приходит 12В идет на Vin Ардуины и на отдельный стабилизатор 5V
W5500 питается от выхода 3,3V Ардуины, а экранчик уже от отдельного стабилизатора

А у экрана какой?

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

у экрана CS - 3, строчку инициализации выкладывал

скетч завтра уже выложу, тот который родной уж слишком много букав

Это МК что-то делает, а экран - необязательно.
А так да, присоединяюсь к ЕвгенийП - демоскетч с печатью одного слова на экране и получением IP адреса проиллюстрирует проблему.

Mega от RobotDyn, стабилизатор на 3.3V приличный?

Брал не у них, но такая же, на стаб не грешу, у меня уже поздно, завтра с утреца подготовлю скетч демо и схемку как у меня питание организовано, чтоб все было поприличней и выложу

я б попробовал следующее:
1 запитать Мегу + экран от 5 вольт
2 запитать W5500 от отдельных 3.3 вольт
3 инициализировать Ili9341 самостоятельно, без adafruit библиотек, пример:
https://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/st7735-160-na-128-podsvetka-barakhlit?page=10#comment-670119

и насколько я помню - SPI W5500 и ili9341 работают от логики 3.3 вольт - преобразователи уровней установлены?

usr-es1 W5500 Питается от 3,3V но толерантен к 5В логике, установлен в паре устройств, все норм, дисплей на резистивных делителях

по вашем советам публикую тестовые скетчи
для W5500

#include <SPI.h>
#include <Ethernet2.h>
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
EthernetClient client;
void setup() {
  Serial.begin(9600);
  Serial.println ("Старт");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for (;;)
      ;
    Serial.print("My IP address: ");
    for (byte thisByte = 0; thisByte < 4; thisByte++) {
      Serial.print(Ethernet.localIP()[thisByte], DEC);
      Serial.print(".");
    }
    Serial.println();
  }
}
void loop() {          
  Ethernet.begin(mac);
  Serial.print("My IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print(".");
  }
  Serial.println();
}

код в LOOPe зациклил для проверки соединения

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

Тестовый скетч для ILI9341

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
Adafruit_ILI9341 tft = Adafruit_ILI9341(3, 7, 51,  52,   6,   50);
//  CS,DC,MOSI,SCK,RESET,MISO
#include "Cooper12pt8b.h";          // https://github.com/immortalserg/AdafruitGFXRusFonts
#include "Cooper16pt8b.h";
#define lcdOn A6
void setup() {
  tft.begin();
  tft.setRotation(3);
  Serial.begin(9600);
  Serial.println("Старт");
  pinMode(lcdOn, OUTPUT);           // Включаем подсветку дисплея
  digitalWrite(lcdOn, HIGH);
}
void loop() {
  myIP();
  hello ();
}
void myIP () {
}
void hello () {
  Serial.println("Hello");

  tft.fillScreen(0);
  tft.setTextSize(2);
  tft.setTextColor(0xFFFF);
  tft.setFont(&Cooper12pt8b);
  tft.setCursor(30, 45);
  tft.println("Привет");
  tft.setTextColor(0xFFE0);
  tft.setCursor(30, 90);
  tft.println ("Форуму");
  tft.setTextColor(0x07E0);
  tft.setCursor(0, 140);
  tft.println ("Arduino.ru");
  delay (50000);
}

результат

теперь пробую поженить 2 железки

#include <SPI.h>
#include <Ethernet2.h>
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
EthernetClient client;
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
Adafruit_ILI9341 tft = Adafruit_ILI9341(3, 7, 51,  52,   6,   50);
                                    //  CS,DC,MOSI,SCK,RESET,MISO
#include "Cooper12pt8b.h";          // https://github.com/immortalserg/AdafruitGFXRusFonts
#include "Cooper16pt8b.h";
#define lcdOn A6
void setup() {
  tft.begin();
  tft.setRotation(3);
  Ethernet.begin(mac);
  Serial.begin(9600);
  Serial.println("Старт");
  pinMode(lcdOn, OUTPUT);           // Включаем подсветку дисплея
  digitalWrite(lcdOn, HIGH);
}
void loop() {
  myIP();
  hello ();
}
void myIP () {
   Serial.print("My IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print(".");
  }
  Serial.println();
}
void hello () {
  Serial.println("Hello");

  tft.fillScreen(0);
  tft.setTextSize(2);
  tft.setTextColor(0xFFFF);
  tft.setFont(&Cooper12pt8b);
  tft.setCursor(30, 45);
  tft.println("Привет");
  tft.setTextColor(0xFFE0);
  tft.setCursor(30, 90);
  tft.println ("Форуму");
  tft.setTextColor(0x07E0);
  tft.setCursor(0, 140);
  tft.println ("Arduino.ru");
  delay (1000);
}

в мониторе порта

экран просто белый

питание у меня так выполнено

пока вроде все, с питанием ничего пока не делал, только с работы, послушаю ваших советов

а если попробовать использовать хард SPI?
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1);

1 лайк

не проходит инициализация дисплея

так я хард SPI и использую и там и там, у каждого SS только свой у W5500 53 вывлд у экранчика 3

Это вам так кажется, для хард инициализации пины SPI не указываются (для TFT Adafruit точно, библиотеку сетевого девайса не смотрел)

1 лайк

Понять бы почему, как в том Ералаше, я понимаю что параллельные линии не пересекаются, а вто почему он не пересекаются?

для W5500 да не указываются, все на харде, а для экрана я могу в принципе любые указать
у меня так

Adafruit_ILI9341 tft = Adafruit_ILI9341(3, 7, 51,  52,   6,   50);
                                    //  CS,DC,MOSI,SCK,RESET,MISO

MOSI, MISO. SCK - это хардовые пины для меги

Пины хардовые но ты запускаешь SOFT SPI (тебе долго попробовать убрать ненужное из инициализации?)

1 лайк

не понял почему SOFT, попробовать могу и сейчас, все под рукой

ПАТАМУШТА так написано в библиотеке

1 лайк