Помогите подключить: Arduino DUE + 3.2" TFT (SSD1289)

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Добрый вечер.

Есть вот такой экран:

 

Piccy.info - Free Image HostingPiccy.info - Free Image Hosting

 

Вот информация по очень похожему дисплею: Ссылка

Рекомендуемое на этом сайте подключение:

Я подключил как и советовали:

(01) CS ---> pin D40
(02) RS ---> pin D38
(03) WR ---> pin D39
(04) RD ---> 3.3v
(05) RST---> pin D41
--------------------
(06) DB0 ---> pin D37
(07) DB1 ---> pin D36
(08) DB2 ---> pin D35
(09) DB3 ---> pin D34
(10) DB4 ---> pin D33
(11) DB5 ---> pin D32
(12) DB6 ---> pin D31
(13) DB7 ---> pin D30
--------------------
(14) DB8 ---> pin D22
(15) DB9 ---> pin D23
(16) DB10---> pin D24
(17) DB11---> pin D25
(18) DB12---> pin D26
(19) DB13---> pin D27
(20) DB14---> pin D28
(21) DB15---> pin D29
--------------------
(22) SDCS	
(23) BL_CTR ---> 3.3v
--------------------
(24) VDO    ---> 3.3v
(25) VDO    ---> 3.3v
(26) GND    ---> GND
(27) GND    ---> GND
--------------------
(28) NC
--------------------
(29) MISO
(30) MOSI
(31) T_PEN
(32) F_CS
(33) T_CS
(34) t_CLK

 

Результат: Белый экран. Непонятно с этим дисплеем. Написано что он, вроде, 5-ти вольтовый, но в схеме подключения нигде нет пяти вольт. Потом там же - напутано с шиной данных если присмотреться: на дисплее пины называются DB0-DB15, а на схеме: DB1-DB8 и DB10-DB17. DB9, почему-то пропущено. Это тоже странно.

Тач и SD не подключал пока что - нет смысла. Хочу найти схему переходного шилда для 34-х пинового разъёма что бы посмотреть так ли я всё подключил, потому что я подключал всё напрямую, по схеме. Но ничего не работает.

Перебрал все возможные варианты в UTFT, где используется чип SSD1289 - с тем же результатом.

Piccy.info - Free Image HostingPiccy.info - Free Image Hosting

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Листал форум в надежде найти похожую проблему и ее решение. Случайно зашёл на тему по дисплею 3.5" Ссылка, где прочитал совет попробовать в строке инициализации поставить "R61581" или "ILI9327". С обоими переменными, как ни странно, экран заветился. Однако в случае с "R61581" изображение сильно сдвинуто условно влево и отображено зеркально. Условно, потому что при использовании "ILI9327" изображение получается перевернутым на 180 градусов, но сдвиг, если не трогать дисплей, получается всёравно влево. Однако сдвиг уже не такой большой что даже при запуске "UTFT_Demo_400x240", заполняется полностью экран, но всё равно пару символов остаётся "за кадром".

Я сделал два видео с примеров "UTFT_Demo_320x240" и "UTFT_Demo_400x240" с заменой строки на "UTFT myGLCD(ILI9327,38,39,40,41);" :ILI9327_320x240 и ILI9327_400x240

Что можно сделать с этим сдвигом?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Кому интересно: проблема, вроде бы, решилась редактированием файла "UTFT.cpp":

Строка:

word  	dsy[] = {319, 399, 319, 319, 319, ......

была заменена на:

word 	dsy[] = {319, 319, 319, 319, 319, .....

Как видно, второй элемент массива изменен на 319 вместо 399. В результате пример "UTFT_Demo_320x240" стал отображаться корректно.

Значит это был всё-таки "ILI9327"

 

Piccy.info - Free Image HostingPiccy.info - Free Image Hosting

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Тачскрин "победился" с первого раза.

SD - под вопросом. Написано что SD и тач совместно используют MISO и MOSI. Однако судя из их пояснений "SCK(pin34)" и "DCLK(pin34)" тоже висят на одном пине. Так что, скорее всего, юзать в одном скетче карту памяти и тач, уже не получится. Хотя - кто их знает?...

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Вернемся к нашим баранам.

Не давала покоя мне мысль что я-таки неправильно соединил дисплей с ардуиной и теперь она превратилась в уверенность.

Например вот распиновка этого 34-х пинового разъёма дисплея:

У меня тут конфликт тача с SD и я, тогда, кое-как запустил тач в ущерб SD-слоту.

Тач подключается так: UTouch  myTouch (52, 43, 51, 50, 46);

Простенькая програмка показывает что SD-карту следует подключать вот так:

Initializing SD card...
SD_CS:   10
MOSI:    75
MISO:    74
SD_CLK:  76
Card failed, or not present

Как бы всё хорошо, никто никому не мешает. Но выводы дисплея SPI_MOSI, SPI_MISO и SPI_CLK я подключил фиг знает куда и вообше не сильно задумывался тогда куда их надо подключать - свободных пинов на DUE навалом. В общем совершенно случайно, методом научного тыка, мне повезло запустить тачскрин, но только и всего. Сейчас же я хочу запустить и SD-слот...

Чуть позже продолжу - надо на работу лететь...

 

 

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

Buzzer2010 пишет:
SD - под вопросом. Написано что SD и тач совместно используют MISO и MOSI. Однако судя из их пояснений "SCK(pin34)" и "DCLK(pin34)" тоже висят на одном пине. Так что, скорее всего, юзать в одном скетче карту памяти и тач, уже не получится. Хотя - кто их знает?...

В SPI кроме MISO/MOSI/SCK есть еще проводок, подключаемый к CS(он же SS). Переводится как Chip Select или Slave Select. Есть у вас какие-либо соображения по поводу его роли в обеспечении работы нескольких устройств на одной шине SPI?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

sadman41 пишет:
Buzzer2010 пишет:
SD - под вопросом. Написано что SD и тач совместно используют MISO и MOSI. Однако судя из их пояснений "SCK(pin34)" и "DCLK(pin34)" тоже висят на одном пине. Так что, скорее всего, юзать в одном скетче карту памяти и тач, уже не получится. Хотя - кто их знает?...

В SPI кроме MISO/MOSI/SCK есть еще проводок, подключаемый к CS(он же SS). Переводится как Chip Select или Slave Select. Есть у вас какие-либо соображения по поводу его роли в обеспечении работы нескольких устройств на одной шине SPI?

Соображения есть у автора этой статьи: "Touch Screen and SD Card share the MOSI and MISO, and they are controlled through T_CS and SD_CS separately.When T_CS is enabled,Touch Screen works;when SD_CS is enabled,SD Card works."

Тачскрин и SD совместно используют MOSI и MISO но управляются через пины "T_CS" и "SD_CS" раздельно. Когда открыт "T_CS" - работает тачскрин. Когда открыт "SD_CS" - SD карта.

Однако что куда цеплять - еще надо разобраться... на всякий случай сохраню тут распиновку DUE что бы не искать ее потом:

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

Buzzer2010 пишет:

Вернемся к нашим баранам.

Не давала покоя мне мысль что я-таки неправильно соединил дисплей с ардуиной и теперь она превратилась в уверенность.

Например вот распиновка этого 34-х пинового разъёма дисплея:

Очень похоже, что у дисплея не один интерфейс, а более. Т.е. вероятно, что ему можно передавать данные как по SPI, так и по параллельному интерфейсу. Последнее явно быстрее. Поэтому я советую посмотреть дэйташит на предмет того, может и вообще лучше забыть об SPI для этого дисплея.

Цитата:

У меня тут конфликт тача с SD и я, тогда, кое-как запустил тач в ущерб SD-слоту.

Тач подключается так: UTouch  myTouch (52, 43, 51, 50, 46);

Не знаю, откуда Вы взяли такую распиновку. Вероятно, она приведена для 2560-й Меги. По крайней мере, в Меге SPI именно на указанных контактах. В отличие от Due.

Цитата:

Простенькая програмка показывает что SD-карту следует подключать вот так:

Initializing SD card...
SD_CS:   10
MOSI:    75
MISO:    74
SD_CLK:  76
Card failed, or not present

[/quote]

Что-то странное. Я вообще не видел у Ардуино ног с номерами 7х.

Цитата:

Как бы всё хорошо, никто никому не мешает. Но выводы дисплея SPI_MOSI, SPI_MISO и SPI_CLK я подключил фиг знает куда и вообше не сильно задумывался тогда куда их надо подключать - свободных пинов на DUE навалом. В общем совершенно случайно, методом научного тыка, мне повезло запустить тачскрин, но только и всего. Сейчас же я хочу запустить и SD-слот...

Видте ли, обычно у микроконотроллеров разные пины имеют различные функции, но почти каждый из них можно использовать в качестве простого порта ввода/вывода. SPI можно реализовать как аппаратно, так и программно. В первом случае - только на строго определенных пинах, причем эти пины разные для разных моделей Ардуино. Во втором случе - на любых, но скорость передачи в этом случае будет намного ниже.

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

andriano пишет:
Очень похоже, что у дисплея не один интерфейс, а более. Т.е. вероятно, что ему можно передавать данные как по SPI, так и по параллельному интерфейсу. Последнее явно быстрее. Поэтому я советую посмотреть дэйташит на предмет того, может и вообще лучше забыть об SPI для этого дисплея.

Я еле нашёл вообще какую-то информацию по подключению. На даташит я и не расчитывал. По SPI тут работает только SD и тачскрин, насколько я понял, но я не имею ни малейшего представления как должен быть подключен тачскрин для работы с UTouch и как SD-слот для работы со стандартными библиотеками: по SPI, IIC или еще как...

andriano пишет:
Buzzer2010 пишет:
У меня тут конфликт тача с SD и я, тогда, кое-как запустил тач в ущерб SD-слоту.

Тач подключается так: UTouch  myTouch (52, 43, 51, 50, 46);

Не знаю, откуда Вы взяли такую распиновку. Вероятно, она приведена для 2560-й Меги. По крайней мере, в Меге SPI именно на указанных контактах. В отличие от Due.

Мега хоть внешне похожа на DUE, поэтому зту распиновку я нигде не брал, а распаял сам, потому что у меня 34-х пиновый шилд, на который я нигде не нашёл ни распиновок ни пояснений что куда и зачем. Поэтому на какие пины DUE пришлось, на такие и расписал потом в "UTouch  myTouch". Выход был только такой. Но  меня сейчас интересуют другие 2 вопроса:

1. Работает ли, обычно, тач по шине SPI?

2. Если не работает, то можно ли MOSI и MISO использовать как обычные пины, применительно к пинам для UTouch? Потому что судя по всему и SD и тач используют эти пины совместно.

andriano пишет:
Что-то странное. Я вообще не видел у Ардуино ног с номерами 7х.

Ну так посмотрите на распиновку DUE одним постом выше, там их 87цифровых и 144 последовательных.

andriano пишет:
Видте ли, обычно у микроконотроллеров разные пины имеют различные функции, но почти каждый из них можно использовать в качестве простого порта ввода/вывода. SPI можно реализовать как аппаратно, так и программно. В первом случае - только на строго определенных пинах, причем эти пины разные для разных моделей Ардуино. Во втором случе - на любых, но скорость передачи в этом случае будет намного ниже.

Ну вот часть ответа на второй вопрос уже, кое-как, забрезжила... Насколько я понимаю, в библиотеках для работы с SD, SPI всегда выбирается аппаратный, потому что у меня уже были попытки переназначить выводы SPI на другие контакты - ничего не удаётся, даже копая библиотеки. Вот поэтому и получается, что подключить этот шилд, задействуя все его возможности, одним шлейфом - не выйдет. SPI, как правило, распаяны отдельной группой контактов.

 

slider
Offline
Зарегистрирован: 17.06.2014

 для SD есть  либа програмного SPI (соответственно на любые пины можно) и аппаратного.

для тача на XPT2046 встречал только аппаратную. 

http://arduino.ru/forum/apparatnye-voprosy/35-tft-lcd-krasnyi-megovskii-mega-2560-r3-resheno-kak-reshit-drugie#comment-204256

но без проблем стыкуются 2 аппаратных дергая своими CS  (ChipSelect)

http://arduino.ru/forum/apparatnye-voprosy/kak-podklyuchit-displei-32-lcd-module?page=1#comment-156177

, в инете проектов на таких и похожих шилдах д.б. полно

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

slider пишет:

 для SD есть  либа програмного SPI (соответственно на любые пины можно) и аппаратного.

для тача на XPT2046 встречал только аппаратную. 

http://arduino.ru/forum/apparatnye-voprosy/35-tft-lcd-krasnyi-megovskii-mega-2560-r3-resheno-kak-reshit-drugie#comment-204256

но без проблем стыкуются 2 аппаратных дергая своими CS  (ChipSelect)

http://arduino.ru/forum/apparatnye-voprosy/kak-podklyuchit-displei-32-lcd-module?page=1#comment-156177

, в инете проектов на таких и похожих шилдах д.б. полно

Вторая ссылка полезная. Спасибо. Значит я плохо искал или искал сам не зная что.

slider
Offline
Зарегистрирован: 17.06.2014

млин, ошибся

slider пишет:

.....

для тача на XPT2046 встречал только аппаратную. 

......

там  програмный SPI (думал програмный, написал аппаратный :)  )  вызов UTouch  myTouch( 6, 5, 4, 3, 2); - на этих пинах не может быть аппаратного ни на Уно , ни на Меге , он  там на других разных пинах.

Buzzer2010 , обратите внимание , по 1 ссылке , шилды не требующие шилдов переходников.  Это значит , что для подключения вашего диспа к Меге напрмую - необходимы резисторы. номиналы там можно увидеть. 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

slider пишет:

млин, ошибся

slider пишет:

.....

для тача на XPT2046 встречал только аппаратную. 

......

там  програмный SPI (думал програмный, написал аппаратный :)  )  вызов UTouch  myTouch( 6, 5, 4, 3, 2); - на этих пинах не может быть аппаратного ни на Уно , ни на Меге , он  там на других разных пинах.

Buzzer2010 , обратите внимание , по 1 ссылке , шилды не требующие шилдов переходников.  Это значит , что для подключения вашего диспа к Меге напрмую - необходимы резисторы. номиналы там можно увидеть. 

А нафига искать выводы SPI, когда они и так указаны на распиновке, в моём случае - DUE ?

У меня не мега, у меня DUE!

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Распаял наконец-то как положено SD-пины и:

Initializing SD card...
SS:        10
SD_CS:     42
MOSI:      75
MISO:      74
SCK:       76
SD-card present

Ну SS (которое всегда висит на 10-м пине) - это я проверял и на 10 и на отвольном 42-м пине. Работает и на 10  и на 42, так что - не принципиально.

Кстати писать #include SPI.h - это значит использовать програмный SPI? Потому что у меня и без него работает:

#include <SD.h>
const int SD_CS = 42;
File dataFile;

void setup()
{
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  Serial.print("SS:    "); Serial.println(SS);
  Serial.print("SD_CS: "); Serial.println(SD_CS);
  Serial.print("MOSI:  "); Serial.println(MOSI);
  Serial.print("MISO:  "); Serial.println(MISO);
  Serial.print("SCK:   "); Serial.println(SCK);

  // make sure that the default chip select pin is set to
  // output, even if you don't use it:

  pinMode(SS, OUTPUT);

  // see if the card is present and can be initialized:
  if (!SD.begin(SD_CS)) {
    Serial.println("SD-card failed, or not present");
    // don't do anything more:
    while (1) ;
  }
  Serial.println("SD-card present");
}

void loop()
{

}








 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Как я и предполагал - тачскрин после переноса на SPI - не заработал ((((

UTouch  myTouch	(52,    43,  51,   50,    46); // Так было раньше и тач работал
UTouch	        (tclk,  tcs, tdin, dout, irq)
UTouch  myTouch (76,    43,  74,   75,    46);// Так - сейчас. SD работает, тач - нет

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

А всё потому что никто так и не сказал: нужно ли аппаратное SPI для работы тачскрина или нет и можно ли его пины использовать для работы с тачскрином. ((((

slider
Offline
Зарегистрирован: 17.06.2014

что вам сдался аппаратный SPI ? выводов у Дуе нехватат ?

Utouch примеры под програмный SPI .

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

 тогда уж используйте либу SD от того-же UTFT , а не адафруита (хотя не понял чья у вас либа). либы разные, их возможности и инструменты разные.

на сайте http://rinkydinkelectronics.com/library.php?id=51 и форумах можно узнать про совместное использование либ.

пробуйте это 

 URTouch  http://rinkydinkelectronics.com/library.php?id=92

+

tinyFAT  http://rinkydinkelectronics.com/library.php?id=37

но прийдется пробовать не на DUE , или подшаманить под нее

 Или всё-же повешайте тач на програмный, где он и должен быть.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

slider пишет:
что вам сдался аппаратный SPI ? выводов у Дуе нехватат ?

Та блин же! Вот что вы все только последний пост читаете и возмущаетесь потом?

Вот специально для "slider": SD и тачскрин совместно используют три провода: MOSI, MISO и SPI_CLK. Но дело в том что SD не работает ни на каких других пинах, кроме как на аппаратных MOSI, MISO и SPI_CLK! А теперь на этом SPI не работает тачскрин. Я вообще-то спрашиваю совсем о другом и никто не отвечает на вопрос, а советуют всякие непоянтные способы усложнить себе жизнь. Можно услышать членораздельный ответ на вопрос: обязательно ли SPI для работы UTouch или URTouch и если нет - почему нельзя использовать пины SPI под другие задачи? Я ведь читал где-то, что выводы SPI могут выполнять любые функции как обычные другие пины ардуино.

И вот, кстати, о том же "tinyFAT" пишут: "The SD card should be connected to the SPI-pins on your Arduino." Ну и что теперь получается? Для использовния SD распаивать надо под SPI, а для тача - на другие пины что ли? Это же фигня какая-то.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Интересное наблюдение: мешает только SPI_CLK. MOSI и MISO можно оставить на tdin и tdout: myTouch.dataAvailable() возвращает единицу, но X всегда 319, а Y - 239 (разрешение 320х240) . Принудительная запись единицы в tcs (pin D43) - ничего не даёт.

Вот же блин... Как заставить работать и тач и SD одновременно?

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

Buzzer2010 пишет:

Кстати писать #include SPI.h - это значит использовать програмный SPI? Потому что у меня и без него работает:

1. Наоборот - аппаратный.

2. А почему Вы решили, что "и без него работает"?

Buzzer2010 пишет:

Можно услышать членораздельный ответ на вопрос: обязательно ли SPI для работы UTouch или URTouch и если нет - почему нельзя использовать пины SPI под другие задачи? Я ведь читал где-то, что выводы SPI могут выполнять любые функции как обычные другие пины ардуино.

Могут - но не одновременно.

 

Ну и как бы общая информация: любое SPI устройство может работать как с программным SPI, так и с аппаратным. Ему все равно. Но в конкретной библиотеке может быть предусмотрен только один вполне конкретный вариант. Соответственно, необходимо либо учитывать эту особенность конкретной библиотеки, либо не пользоваться ею, а писать свою.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

andriano пишет:
Buzzer2010 пишет:
Кстати писать #include SPI.h - это значит использовать програмный SPI? Потому что у меня и без него работает:

1. Наоборот - аппаратный.

2. А почему Вы решили, что "и без него работает"?

Так. Тогда непонятно кое-что: Если #include SPI.h это аппаратный, то программный тогда как запускается?

Почему я решил что работает: Взял кусочек скетча из примера "SD.h", где проверяется наличие карты и результатом его работы теперь являются слова, что SD-карта обнаружена. Может я, конечно и как всегда, немного не правильно этот кусок выхватил, но уже, думаю, пора бы мне и с большим пониманием ковырять чужие скетчи:

#include <SD.h>
const int SD_CS = 42;
File dataFile;

void setup()
{
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  Serial.print("SS:    "); Serial.println(SS);
  Serial.print("SD_CS: "); Serial.println(SD_CS);
  Serial.print("MOSI:  "); Serial.println(MOSI);
  Serial.print("MISO:  "); Serial.println(MISO);
  Serial.print("SCK:   "); Serial.println(SCK);

  // make sure that the default chip select pin is set to
  // output, even if you don't use it:

  pinMode(SS, OUTPUT);

  // see if the card is present and can be initialized:
  if (!SD.begin(SD_CS)) {
    Serial.println("SD-card failed, or not present");
    // don't do anything more:
    while (1) ;
  }
  Serial.println("SD-card present");
}

void loop()
{

}


andriano пишет:
Buzzer2010 пишет:

Можно услышать членораздельный ответ на вопрос: обязательно ли SPI для работы UTouch или URTouch и если нет - почему нельзя использовать пины SPI под другие задачи? Я ведь читал где-то, что выводы SPI могут выполнять любые функции как обычные другие пины ардуино.

Могут - но не одновременно.

Так мне одновременно и не нужно! Мне, хотя бы, не перепаивать туда-сюда провода каждый раз, в зависимости что потребуется: SD или тач.

А обязательно для UTouch запускать SPI или нет? И что-то я ни разу нигде не встречал что бы SPI применялось с библиотекой UTouch. Для SD - понятно что надо, ("надо", в моём понимании это: #include <SPI.h>) И кстати непонятно с этим SPI опять никак. На фото распиновки DUE и на самой плате есть 6 штырьков, подписаных SPI, и MOSI с остальными находятся там же... А вот нашёл только что такую информацию:... и тут уже про какое-то ICSP пишут... Все эти моменты меня путают!

andriano пишет:
Ну и как бы общая информация: любое SPI устройство может работать как с программным SPI, так и с аппаратным. Ему все равно. Но в конкретной библиотеке может быть предусмотрен только один вполне конкретный вариант. Соответственно, необходимо либо учитывать эту особенность конкретной библиотеки, либо не пользоваться ею, а писать свою.

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

В общем текущее положение вещей таково: После переноса выводов шилда MOSI, MISO и SPI_CLK на соответсвующие контакты DUE, перестал работать тачскрин. Понятно что строку создания элемента класса UTouch myTouch я откорректировал в соответствии с внесенными изменениями. Однако - воз и ныне там (((

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

Buzzer2010, чтобы прояснить для себя отношение между SPI.h и SD.h, загляните в последний. Возможно тогда Вы поймете, что для того, чтобы ипользовать SPI (а равно любое другое устройство) далеко не всегда необходимо явно включать ссылку на него в скетч.

Что такое UTouch, я не знаю, никогда им не пользовался. Но совет остается прежним: хотите что-нибудь про него узнать, загляните в его исходник. Благо они все открытые.

Да, на Due SPI, насколько мне известно, выведен только на специальный разъем, и не дублируется среди "обычных" контактов, как на других моделях Ардуино.

По последнему абзацу: посмотрите все подключаемые Вами библиотеки. Вероятнее всего, хотя бы одна из них использует аппаратный SPI, что не дает возможности организовать на нем программный для UTouch.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

andriano пишет:
Buzzer2010, чтобы прояснить для себя отношение между SPI.h и SD.h, загляните в последний. Возможно тогда Вы поймете, что для того, чтобы ипользовать SPI (а равно любое другое устройство) далеко не всегда необходимо явно включать ссылку на него в скетч.

Но в своих примерах они его явно включают... Ну да. Они там его, таки, включают. И не только его:

SD.h :

#ifndef __SD_H__
#define __SD_H__

#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

#include <SPI.h>
#include <utility/SdFat.h>
#include <utility/SdFatUtil.h>

#define FILE_READ O_READ
#define FILE_WRITE (O_READ | O_WRITE | O_CREAT)

andriano пишет:
Что такое UTouch, я не знаю, никогда им не пользовался. Но совет остается прежним: хотите что-нибудь про него узнать, загляните в его исходник. Благо они все открытые.

UTouch.h - библиотека для работы с тачскрином. В заголовке ничего такого про SPI не говорится:

// UTouchCD.h
// ----------
//
// Since there are slight deviations in all touch screens you should run a
// calibration on your display module. Run the UTouch_Calibration sketch
// that came with this library and follow the on-screen instructions to
// update this file.
//
// Remember that is you have multiple display modules they will probably 
// require different calibration data so you should run the calibration
// every time you switch to another module.
// You can, of course, store calibration data for all your modules here
// and comment out the ones you dont need at the moment.
//

// These calibration settings works with my ITDB02-3.2S.
// They MIGHT work on your 320x240 display module, but you should run the
// calibration sketch anyway. If you are using a display with any other
// resolution you MUST calibrate it as these settings WILL NOT work.
#define CAL_X 0x00378F66UL
#define CAL_Y 0x03C34155UL
#define CAL_S 0x000EF13FUL

andriano пишет:
Да, на Due SPI, насколько мне известно, выведен только на специальный разъем, и не дублируется среди "обычных" контактов, как на других моделях Ардуино.
Мало того - он там еще и не один... И оба, насколько я помню - аппаратные...

В UTouch.cpp тоже никакого намёка на SPI нет пока что, но у них есть странные переменные, вроде P_CLK, T_CLK, B_CLK, P_CS и  B_CS, что наводит на мысль о том, что какой-то протокол они всё-же там используют.

UTouch.cpp :

/*
  UTouch.cpp - Arduino/chipKit library support for Color TFT LCD Touch screens 
  Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
  
  Basic functionality of this library are based on the demo-code provided by
  ITead studio.

  You can find the latest version of the library at 
  http://www.RinkyDinkElectronics.com/

  This library is free software; you can redistribute it and/or
  modify it under the terms of the CC BY-NC-SA 3.0 license.
  Please see the included documents for further information.

  Commercial use of this library requires you to buy a license that
  will allow commercial use. This includes using the library,
  modified or not, as a tool to sell products.

  The license applies to all part of the library including the 
  examples and tools supplied with the library.
*/

#include "UTouch.h"
#include "UTouchCD.h"

#if defined(__AVR__)
	#include "hardware/avr/HW_AVR.inc"
#elif defined(__PIC32MX__)
	#include "hardware/pic32/HW_PIC32.inc"
#elif defined(__arm__)
	#include "hardware/arm/HW_ARM.inc"
#endif

UTouch::UTouch(byte tclk, byte tcs, byte din, byte dout, byte irq)
{
	T_CLK	= tclk;
	T_CS	= tcs;
	T_DIN	= din;
	T_DOUT	= dout;
	T_IRQ	= irq;
}

void UTouch::InitTouch(byte orientation)
{
	orient					= orientation;
	_default_orientation	= CAL_S>>31;
	touch_x_left			= (CAL_X>>14) & 0x3FFF;
	touch_x_right			= CAL_X & 0x3FFF;
	touch_y_top				= (CAL_Y>>14) & 0x3FFF;
	touch_y_bottom			= CAL_Y & 0x3FFF;
	disp_x_size				= (CAL_S>>12) & 0x0FFF;
	disp_y_size				= CAL_S & 0x0FFF;
	prec					= 10;

	P_CLK	= portOutputRegister(digitalPinToPort(T_CLK));
	B_CLK	= digitalPinToBitMask(T_CLK);
	P_CS	= portOutputRegister(digitalPinToPort(T_CS));
	B_CS	= digitalPinToBitMask(T_CS);
	P_DIN	= portOutputRegister(digitalPinToPort(T_DIN));
	B_DIN	= digitalPinToBitMask(T_DIN);
	P_DOUT	= portInputRegister(digitalPinToPort(T_DOUT));
	B_DOUT	= digitalPinToBitMask(T_DOUT);
	P_IRQ	= portInputRegister(digitalPinToPort(T_IRQ));
	B_IRQ	= digitalPinToBitMask(T_IRQ);

	pinMode(T_CLK,  OUTPUT);
    pinMode(T_CS,   OUTPUT);
    pinMode(T_DIN,  OUTPUT);
    pinMode(T_DOUT, INPUT);
    pinMode(T_IRQ,  OUTPUT);

	sbi(P_CS, B_CS);
	sbi(P_CLK, B_CLK);
	sbi(P_DIN, B_DIN);
	sbi(P_IRQ, B_IRQ);
}

void UTouch::read()
{
	unsigned long tx=0, temp_x=0;
	unsigned long ty=0, temp_y=0;
	unsigned long minx=99999, maxx=0;
	unsigned long miny=99999, maxy=0;
	int datacount=0;

	cbi(P_CS, B_CS);                    

	pinMode(T_IRQ,  INPUT);
	for (int i=0; i<prec; i++)
	{
		if (!rbi(P_IRQ, B_IRQ))
		{
			touch_WriteData(0x90);        
			pulse_high(P_CLK, B_CLK);
			temp_x=touch_ReadData();

			if (!rbi(P_IRQ, B_IRQ))
			{
				touch_WriteData(0xD0);      
				pulse_high(P_CLK, B_CLK);
				temp_y=touch_ReadData();

				if ((temp_x>0) and (temp_x<4096) and (temp_y>0) and (temp_y<4096))
				{
					tx+=temp_x;
					ty+=temp_y;
					if (prec>5)
					{
						if (temp_x<minx)
							minx=temp_x;
						if (temp_x>maxx)
							maxx=temp_x;
						if (temp_y<miny)
							miny=temp_y;
						if (temp_y>maxy)
							maxy=temp_y;
					}
					datacount++;
				}
			}
		}
	}
	pinMode(T_IRQ,  OUTPUT);

	if (prec>5)
	{
		tx = tx-(minx+maxx);
		ty = ty-(miny+maxy);
		datacount -= 2;
	}

	sbi(P_CS, B_CS);                    
	if ((datacount==(prec-2)) or (datacount==PREC_LOW))
	{
		if (orient == _default_orientation)
		{
			TP_X=ty/datacount;
			TP_Y=tx/datacount;
		}
		else
		{
			TP_X=tx/datacount;
			TP_Y=ty/datacount;
		}
	}
	else
	{
		TP_X=-1;
		TP_Y=-1;
	}
}

bool UTouch::dataAvailable()
{
	bool avail;
	pinMode(T_IRQ,  INPUT);
	avail = !(rbi(P_IRQ, B_IRQ));
	pinMode(T_IRQ,  OUTPUT);
	return avail;
}

int16_t UTouch::getX()
{
	long c;

	if ((TP_X==-1) or (TP_Y==-1))
		return -1;
	if (orient == _default_orientation)
	{
		c = long(long(TP_X - touch_x_left) * (disp_x_size)) / long(touch_x_right - touch_x_left);
		if (c<0)
			c = 0;
		if (c>disp_x_size)
			c = disp_x_size;
	}
	else
	{
		if (_default_orientation == PORTRAIT)
			c = long(long(TP_X - touch_y_top) * (-disp_y_size)) / long(touch_y_bottom - touch_y_top) + long(disp_y_size);
		else
			c = long(long(TP_X - touch_y_top) * (disp_y_size)) / long(touch_y_bottom - touch_y_top);
		if (c<0)
			c = 0;
		if (c>disp_y_size)
			c = disp_y_size;
	}
	return c;
}

int16_t UTouch::getY()
{
	int c;

	if ((TP_X==-1) or (TP_Y==-1))
		return -1;
	if (orient == _default_orientation)
	{
		c = long(long(TP_Y - touch_y_top) * (disp_y_size)) / long(touch_y_bottom - touch_y_top);
		if (c<0)
			c = 0;
		if (c>disp_y_size)
			c = disp_y_size;
	}
	else
	{
		if (_default_orientation == PORTRAIT)
			c = long(long(TP_Y - touch_x_left) * (disp_x_size)) / long(touch_x_right - touch_x_left);
		else
			c = long(long(TP_Y - touch_x_left) * (-disp_x_size)) / long(touch_x_right - touch_x_left) + long(disp_x_size);
		if (c<0)
			c = 0;
		if (c>disp_x_size)
			c = disp_x_size;
	}
	return c;
}

void UTouch::setPrecision(byte precision)
{
	switch (precision)
	{
		case PREC_LOW:
			prec=1;		// DO NOT CHANGE!
			break;
		case PREC_MEDIUM:
			prec=12;	// Iterations + 2
			break;
		case PREC_HI:
			prec=27;	// Iterations + 2
			break;
		case PREC_EXTREME:
			prec=102;	// Iterations + 2
			break;
		default:
			prec=12;	// Iterations + 2
			break;
	}
}

void UTouch::calibrateRead()
{
	unsigned long tx=0;
	unsigned long ty=0;

	cbi(P_CS, B_CS);                    

	touch_WriteData(0x90);        
	pulse_high(P_CLK, B_CLK);
	tx=touch_ReadData();

	touch_WriteData(0xD0);      
	pulse_high(P_CLK, B_CLK);
	ty=touch_ReadData();

	sbi(P_CS, B_CS);                    

	TP_X=ty;
	TP_Y=tx;
}

 

andriano пишет:
По последнему абзацу: посмотрите все подключаемые Вами библиотеки. Вероятнее всего, хотя бы одна из них использует аппаратный SPI, что не дает возможности организовать на нем программный для UTouch.

Да вот далеко ходить и не надо. Если я в одном скетче задумаю использовать и SD.h и UToch.h, то скорее всего SD.h победит...

Но это еще не так критично, как то, что даже не включая в скетч ничего, чему бы мог потребоваться SPI.h, я всё равно не могу заставить работать на этих пинах тачскрин, который, как оказалось: "Touch Screen and SD Card share the MOSI and MISO".