Два дисплея ILI9341 IPS на одной шине.

filosow
Offline
Зарегистрирован: 06.04.2021

Dctv здравствовать! Приобрел пару вот таких дисплейчиков

 

Как видно, отсутствует вывод CS. По распиновке он пятый на шлейфе, запаян на GND; и т.к. вывод MISO использовать не планирую, решил его переделать в CS, отрезав его от GND и  MISO от шлейфа:

Так вот нет реакции на CS: даже с отключенным CS дисплей стартует. А при подключении двух дисплеев, оба выводят одну картинку. (MOSI, RST, DC, SCK параллельно, CS у каждого свой)

#include <SPI.h>
#include <ILI9341_due_config.h>
#include <ILI9341_due.h>

#include "fonts/Arial_bold_14.h"

#define TFT_RST 4
#define TFT_DC  5
#define TFT_CS  6
#define TFT_CS2 7

ILI9341_due tft  = ILI9341_due(TFT_CS,  TFT_DC, TFT_RST);
ILI9341_due tft2 = ILI9341_due(TFT_CS2, TFT_DC, TFT_RST);

void setup()
{
  //Serial.begin(9600);

  tft.begin();
  
  //Serial.print("TFT begin successful: ");
  //Serial.println(result ? "YES" : "NO");
  tft.setRotation(iliRotation90);
  tft.fillScreen(0xFFE0);

  tft.setFont(Arial_bold_14);
  tft.setTextLetterSpacing(5);
  tft.setTextColor(0x0000, 0xFFE0);
  tft.printAligned(F("Hello World"), gTextAlignMiddleCenter);

  tft2.begin();

  tft2.setRotation(iliRotation90);
  tft2.fillScreen(0x0000);

  tft2.setFont(Arial_bold_14);
  tft2.setTextLetterSpacing(5);
  tft2.setTextColor(0xFFE0, 0x0000);
  tft2.printAligned(F("Hello World"), gTextAlignMiddleCenter);
}

void loop()
{

  /* add main program code here */

}

Из чего делаю вывод, что вывод CS конкретно на этих дисплеях не работает. 

На шине будут висеть еще пара устройств DAC и ADC. Изначально планировалось использовать 3.2 TFT ili9341 (с ним все отлично работает), но уж больно хороша картинка у этих. И так как один большой IPS с несложным запуском найти не получилось, решил использовать два поменьше. И тут такой облом, запуск одновременно двух невозможен.

Есть ли какой вариант победить? Может мультиплексор SPI? Если кто сталкивался, подскажите. 

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

Я что-то не увидел в коде, где Вы переключаете CS.

По логике, если на дисплее использование этого пина не предусмотрено, то и библиотека вряд ли будет заниматься его переключением. Следовательно, об этом должен заботиться Ваш код.

Ну и, опять же, что показывает логический анализатор?

mixail844
Offline
Зарегистрирован: 30.04.2012

andriano пишет:

Я что-то не увидел в коде, где Вы переключаете CS.

По логике, если на дисплее использование этого пина не предусмотрено, то и библиотека вряд ли будет заниматься его переключением. Следовательно, об этом должен заботиться Ваш код

кмк, проблема в самой библиотеке граф дисплея , там есть tft.begin() ,которая судя коду делает SPI_CS = "0" , но нет ,условного , tft.end() - которое бы делала SPI_CS = "1" ,поэтому оба дисплея выбраны одновременно . 
 
ТС , скажите , у вас оба изображения одинаковы и равны строкам 24-29  или строкам  34-39 ? 
filosow
Offline
Зарегистрирован: 06.04.2021

Заработало, нужно было сделать не только отдельный CS, но и REST.

#define TFT_RST 5
#define TFT_RST2 9
#define TFT_DC  4
#define TFT_CS  6
#define TFT_CS2 7

ILI9341_due tft  = ILI9341_due(TFT_CS,  TFT_DC, TFT_RST);
ILI9341_due tft2 = ILI9341_due(TFT_CS2, TFT_DC, TFT_RST2);

Загнал код в loop - поочередно экранчики прорисовываются.