Конфликт между устройствами SPI на Mega 2560

Тема в разделе "Arduino & Shields", создана пользователем YeS, 30 янв 2017.

  1. YeS

    YeS Гик

    Добрый день всем! Подскажите пожалуйста что неправильно сделал. Имеется Arduino Mega 2560 + Ethernet Shield + TFT экран 1.8 SPI. Экран подсоединяю так:
    [​IMG]

    Вот объявление пинов (беру пример graphicstest2 из библиотеки Adafruit)
    Код (C++):
    #include <Adafruit_GFX.h>    // Core graphics library
    #include <Adafruit_ST7735.h> // Hardware-specific library
    #include <SPI.h>


    // For the breakout, you can use any 2 or 3 pins
    // These pins will also work for the 1.8" TFT shield
    #define TFT_CS     48
    #define TFT_RST    50
    #define TFT_DC     49

    // Option 1 (recommended): must use the hardware SPI pins
    // (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
    // an output. This is much faster - also required if you want
    // to use the microSD card (see the image drawing example)
    Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

    // Option 2: use any pins but a little slower!
    #define TFT_SCLK 52  // set these to be whatever pins you like!
    #define TFT_MOSI 51  // set these to be whatever pins you like!
    //Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
    Проблема в следующем. До тех пор пока не подключаю Ethernet Shield экран работает нормально. Подключаю шилд и экран перестаёт работать. На сколько я понимаю Ethernet шилд использует в качестве CS пинов 4 и 10. Экран использует 48. Почему конфликт?
     

    Вложения:

    • MegaTFTSPI.jpg
      MegaTFTSPI.jpg
      Размер файла:
      92,7 КБ
      Просмотров:
      8.659
    Последнее редактирование: 1 фев 2017
  2. Unixon

    Unixon Оракул Модератор

    Кто-то игнорирует CS и шину не отпускает...
     
  3. YeS

    YeS Гик

    Попробовать считывать состояние CS со всех пинов в сериал?
     
  4. YeS

    YeS Гик

    Определил, что экран перестаёт работать после команды
    Код (C++):
    Ethernet.begin(mac, ip, dnS, gateWay, subNet);
     
  5. sslobodyan

    sslobodyan Гик

    Нет, проверить надо MISO от шилда. Если не отпускает - подключить через 1-2 ком. Это все при условии рабочего софта, т.е. шилд отдельно работает и экран отдельно работает, а вместе не хотят.
     
  6. YeS

    YeS Гик

    Что вы имеете в виду под MISO от шилда? MISO у них ведь общий (и у шилда и у дисплея). Это 50 пин на Меге. Или я путаю уже (что легко может быть ибо мозги уже кипят от этой проблемы) :confused: Кстати к дисплею MISO подключаю через 1кОм (ну это из первой схемы видно даж).
    Отдельно всё работает без проблем.
     
  7. sslobodyan

    sslobodyan Гик

    Если логически подумать, то сигналы выбора кристалла у шилда и дисплея разные, поэтому мешают не они. Остается клок, мисо и моси, которые на одинаковые ноги меги подключены. Сигнал МОСИ - мастер оутпут, значит слейв (шилд и дисплей) работает на вход и не влияет на ногу меги. А вот МИСО - это как раз слейв оутпут, то есть слейв (и шилд и дисплей) выставляют свой уровень. Дисплей вы отвязали резистором, значит остается шилд, который в неактивном состоянии вместо того, чтобы перевести свою ногу в высокоимпедансное состояние, активно тянет сигнал. Вот для этого я и советовал подключить ногу МОСИ шилда к меге не напрямую, а через резистор. Вероятно, на шилде придется резать дорожку. Но проверить это легко. Сделайте тестовый скетч, который будет выводить на ногу МОСИ меандр. Запустите без шилда и потом вместе с подключенным шилдом. Если меандр пропадет или сильно просядет - вот вам и развязка.
     
  8. YeS

    YeS Гик

    Кстати заменил мегу и шилд на другие. Та же фигня.

    Спасибо. Сейчас буду пробовать. Только наверное не МОСИ, а МИСО.
     
    Последнее редактирование: 1 фев 2017
  9. YeS

    YeS Гик

    подключил через 1.1кОм. Не помогло.
     
  10. Unixon

    Unixon Оракул Модератор

    Поставьте тогда на MISO буфер с HiZ-состоянием и сами отрубайте ведомого по его CS.
     
  11. YeS

    YeS Гик

    а что это такое? :rolleyes:
     
  12. sslobodyan

    sslobodyan Гик

    Конечно МИСО, я ошибся.
    Я бы проверял так. Подключил к дуньке только экран. Смотрим - работает, ок. Потом подключаем от шилда только питание. Экран работает - продолжаем. Нет - не хватает питания. Затем по одной подключаем оставшиеся ноги шилда и контролируем экран. Как только экран перестанет работать - нога-виновница на шилде найдена и осталось проанализировать что это и как с ним бороться.
    Можно делать с точностью до наоборот - подключить шилд, проверить что работает. А потом по одному проводку от экрана с проверкой работы шилда.
     
  13. Unixon

    Unixon Оракул Модератор

    74HC125 например, умеет "отключать" выходы, переводя их в высокоимпедансное (т.е. с высоким сопротивлением) состояние. Правильное SPI устройство само должно отключаться при неактивном CS.
     
  14. rkit

    rkit Гуру

    Без команд на включение шилда все работает, говорят. Без ног команду не подать.
     
  15. YeS

    YeS Гик

    Экран работает нормально до тех пор пока программа не доходит до
    Код (C++):
    EthernetClient client = server.available();
    если эту строку закоментировать, то экран работает без проблем.
     
  16. YeS

    YeS Гик

    Решил попробовать подключить экран через программный SPI. Загрузил библиотеку DigitalIO. Правильно ли я понимаю, что EthernetShield сможет работать как раньше по аппаратному SPI, а экран попробовать завести через программный?
     
  17. sslobodyan

    sslobodyan Гик

    А у экрана убрать резисторы на МИСО МОСИ пробовали? С резисторами на шилде? Резисторы нужны только тому устройству, которое не отпускает линию.
     
  18. YeS

    YeS Гик

    Попробовал. Не помогло. Без шилда экран работает, с шилдом нет.
     
  19. YeS

    YeS Гик

    Подскажите пожалуйста, если попробовать поставить буфер на MISO шилда, такой буфер подойдёт?
     
  20. Unixon

    Unixon Оракул Модератор

    Нет, они неотключаемые.