ili9341 к AtMega 16

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Родился
Сообщения: 1
Зарегистрирован: Ср фев 21, 2018 12:05:37

Сообщение Андрей_K »

Получил индикатор ILI9341, тачскрин (карандаш в комплекте).
Разъем 34 штыря.
Маркировка выводов такая (питание и общий упускаю).
Т_CS, CLK, PEN, F_CS, MISO, MOSI, BL, SDCS, D0…D15, RST, WR,RD, CS, RS.
Контактов на переключение СПИ-8-16 бит нет.
Кое что вроде понятно, но есть вопросы.
Как произвести переключение СПИ-8-16?
Или он будет работать только СПИ-16?
Какое назначение выводов, напр. Т_CS и др, которых нет в даташит на ILI9341?
Спасибо за ответ.
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

T_ххх это относится только к тачу, SDxx к флешке, а так из коробки он работает по параллельной шине.
А так нужно фото...
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

Сообщение AndyBig »

Mishany писал(а):T_ххх это относится только к тачу, SDxx к флешке
Как и весь SPI, скорее всего.
T_CS - чипселект для тача, F_CS - чипселект для флэшки, SDCS - чипеселект для SD.
Родился
Аватара пользователя
Сообщения: 17
Зарегистрирован: Вт окт 10, 2017 20:31:08

Сообщение aiRicko »

Привет всем, кто нибудь может подсказать как инициализировать этот дисплей?
(МК - ATMega8A, дисплей - китайский на плате, SPI)

Сейчас делаю так:
вывод CS подтягиваю к земле, LED к питанию (вся схема питается от 3,3 v)
1) Инициализирую SPI микроконтроллера (скопировал из сообщения cgw)
Спойлер//7-Разрешение прерывания от SPI
SPCR^=(1<<SPIE);// SPIE=0;
//6-Включение/выключение SPI
SPCR|=(1<<SPE);// SPE=1;
//5-Порядок передачи данных
SPCR^=(1<<DORD);// DORD=0;
//4-Выбор режима работы (Master/Slave)
SPCR^=(1<<MSTR);//MSTR=0;
//3-Полярность тактового сигнала
SPCR^=(1<<CPOL);// CPOL=0;
/*Полярность тактового сигнала.
0 —генерируются импульсы положительной полярности, при отсутствии импульсов на выводе присутствует НИЗКИЙ уровень;
1 —генерируются импульсы отрицательной полярности, при отсутствии импульсов на выводе присутствует ВЫСОКИЙ уровень*/

//2-Фаза тактового сигнала
SPCR^=(1<<CPHA);// CPHA=0;
/* Фаза тактового сигнала.
0 —обработка данных производится по переднему фронту импульсов сигнала SCK (для CPOL =0 —по нарастающему фронту, а для CPOL =1 —по спадающему фронту);
1 —обработка производится по заднему фронту импульсов сигнала SCK(для CPOL =0 —по спадающему фронту, а для CPOL =1 —по нарастающему фронту) */

//1,0-Скорость передачи
SPCR^=(1<<SPR1);// SPR1=0
SPCR^=(1<<SPR0);// SPR0=0
2) RST в 0 и обратно в 1, жду 100 мс.
3) отправляю команду 0x11, жду 120 мс. (Sleep OUT) (перед отправкой команд DC устанавливаю в 0)
4) отправляю команду 0x29, жду 120 мс. (Display ON)
цикл:
5) отправляю команду 0x2C (Memory Write)
6) отправляю 2 байта данных

На дисплее точек не появляется. Может кто-нибудь помочь?
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

[uquote="aiRicko",url="/forum/viewtopic.php?p=3314309#p3314309"]На дисплее точек не появляется. Может кто-нибудь помочь?[/uquote]
покажи, как настроен порты SPI. Особенно SS
Реклама
Родился
Аватара пользователя
Сообщения: 17
Зарегистрирован: Вт окт 10, 2017 20:31:08

Сообщение aiRicko »

(инициализацию вернул обратно свою SPCR=(1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);)
Спойлер1) прерывание по завершению передачи данных по SPI разрешено
2) активация интерфейса SPI
3) режим master
4-5) делитель частоты 128 (частота МК 2Mhz)
DDRB=0b11101111; PORTB=0b11111111;
все ножки на выход, кроме MISO.

SS не использую, CS дисплея подтягиваю к земле. (если использую SS - результат тот-же)
Реклама
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

[uquote="aiRicko",url="/forum/viewtopic.php?p=3314909#p3314909"]SS не использую, CS дисплея подтягиваю к земле. (если использую SS - результат тот-же)[/uquote]
возможно, именно тут собака и порылась

дело в следующем:
Если же микроконтроллер находится в режиме «Master» (разряд MSTR
регистра SPCR установлен в «1»), направление передачи данных через вывод
SSопределяется пользователем. Если вывод сконфигурирован как выход,
он работает как линия вывода общего назначения и не влияет на работу мо
дуля SPI. Как правило, в этом случае он используется для управления выво
дом SSмикроконтроллера, работающего в режиме «Slave».
Если же вывод сконфигурирован как вход, то для обеспечения нормаль
ной работы модуля SPI, на него должно быть подано напряжение
ВЫСОКОГО уровня. Подача на этотвход напряжения НИЗКОГО уровня
от какойлибо внешней схемы будет воспринята модулем SPI как выбор
данного микроконтроллера в качестве ведомого, и соответственно, начало
передачи ему данных.
Родился
Аватара пользователя
Сообщения: 17
Зарегистрирован: Вт окт 10, 2017 20:31:08

Сообщение aiRicko »

Контроллер в режиме master, вывод сконфигурирован на выход, получается все правильно.
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

[uquote="aiRicko",url="/forum/viewtopic.php?p=3315380#p3315380"]Контроллер в режиме master, вывод сконфигурирован на выход, получается все правильно.[/uquote]
ну, тогда надо подключать логический анализатор и смотреть, что там реально происходит.

у меня была такая беда, что я не сконфигурировал SS на выход и SPI не работал
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

есть рабочий тестовый проект под мегу 328п, можно порезать шрифты и пихнуть в 8мегу

Код: Выделить всё

#define  LCD_CS 2//Chip Select
#define  LCD_CD 1//Command/Data
#define  LCD_RESET 7//LCD Reset
void port_ini(void)
{
	DDRB|=(1<<3)|(1<<5)|(1<<LCD_CD)|(1<<LCD_CS);
	PORTB&=~((1<<LCD_CD)|(1<<LCD_CS));
	DDRD|=(1<<LCD_RESET);
	SPCR |= (1<<SPE)|(1<<MSTR)|(0<<CPHA)|(1<<CPOL);//fosc/2 16MHz/2
	SPSR |=(1<<SPI2X);
}
Родился
Аватара пользователя
Сообщения: 17
Зарегистрирован: Вт окт 10, 2017 20:31:08

Сообщение aiRicko »

ozonn, в proteus подключил к мк spi debagger, заметил странную вещь, spi один раз отправляет передаваемый байт + лишний бит, а затем все этот же байт до бесконечности, даже если убрать все задержки и не ждать окончания отправки, он все равно не начнет передавать следующий байт.
Спойлерint main(void)
{
DDRC=0b11111111; PORTC=0b11011111;
DDRB=0b11101111; PORTB=0b11111111;

cli();
spi_init();
sei();

ClearBit(PORTB,0); //Макрос, ножка к Reset дисплея в 0
_delay_ms(2);
SetBit(PORTB,0); //Макрос, ножка к Reset дисплея в 1
_delay_ms(100);

spic(0x11); //отправка команды
_delay_ms(120);
spic(0x29);
_delay_ms(120);

while(1)
{
color0++;
color1++;
spic(0x2C);
spi(color1); //отправка данных
spi(color0);
}
}

void spi_init () //Инициализация SPI
{
SPCR=(1<<SPIE)|(1<<SPE)|(1<<MSTR);//|(1<<SPR1)|(1<<SPR0);
}

void spi(char cmd) //Отправка данных
{
SetBit(PORTB,1); //макрос, ножка к dc дисплея в 1
SPDR = cmd; //отправляем данные по SPI
while(!(SPSR&(1<<SPIF))); //ждем окончания отправки
}

void spic(char cmd) //Отправка команды
{
ClearBit(PORTB,1); //макрос, ножка к dc дисплея в 0
SPDR = cmd; //отправляем данные по SPI
while(!(SPSR&(1<<SPIF))); //ждем окончания отправки
}
Mishany, было бы здорово, у меня и mega 328p есть.
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

TFT9341_V4.rar
(180.76 КБ) 392 скачивания
держи
А на кой прерывание по SPI? если обработчика нет? завесить МК?
Родился
Аватара пользователя
Сообщения: 17
Зарегистрирован: Вт окт 10, 2017 20:31:08

Сообщение aiRicko »

Никак не могу разобраться с проектом, при компиляции показывает eror-ы.
[img][img]http://img.radiokot.ru/files/126303/thumbnail/1ip92fmbnp.png[/img][/img]

Из своего кода прерывание по SPI убрал, дисплей ожил, но показывает только черно белые полосы на весь дисплей, на попытки порисовать не реагирует.
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

вот этот компилится, с V4 хз может что то сломал)))
Вложения
TFT9341_V3.rar
(146.98 КБ) 412 скачиваний
Родился
Аватара пользователя
Сообщения: 17
Зарегистрирован: Вт окт 10, 2017 20:31:08

Сообщение aiRicko »

Уррра its working :))
Большое спасибо.
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

и в чем же было дело?
Родился
Аватара пользователя
Сообщения: 17
Зарегистрирован: Вт окт 10, 2017 20:31:08

Сообщение aiRicko »

Заработало с библиотекой, очень рад что дисплей рабочий. А со своим кодом остановился на том, что после того как убрал прерывания spi - дисплей стал показывать черно-белые полосы, но рисовать по прежнему отказывался, дальше разбираться не стал.
Mishany, можешь подсказать как сделать на основе шрифта 48 шрифт еще большего размера, или в какой программе его можно нарисовать? С функциями понятно, вопрос только в самих шрифтах.
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

TheDotFactory-0.1.4
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

Народ, кто работал с параллельным 8-бит TFT ILI9341? У меня 2.4" 240x320, пытался прочитать ID - шлёт вроде 0xC0C0C0C0, не могу найти в инете нормального примера подключения и обращения индикатора к МК, почти всё Ардуиновские примеры.

Нашёл пример https://hubstub.ru/display/125-iniciali ... a-avr.html, но там подключение по 16-бит шине, вопрос: насколько я понял, команда (т.е. адрес) и параметры команды передаются по младшим битам 0..7, а уже данные для записи в буфер индикатора используют полную шину?

Ну тогда взял Arduino Uno, запустил среду Arduino IDE, наковырял примеров и раза с 10 скомпилировался скетч, прошил в контроллер, запустился тест индикатора, там было чтение типа контроллера - у меня контроллер отзывается и показывает тест ILI9327, 9341, 9488, ну я оставил ILI9341. Затем прочитал *.hex из контроллера, открыл AVR Stidio, хотел посмотреть как идёт обращение к индикатору - ничего не понял, в коде нет команд sbi/cbi, даже in/out всего несколько, и не к портам. Насколько я понял, компилятор использует lds/sts?

Так, вот вроде как в преферансе - карта слезу любит - поплакался, пришла мысль - раз ID чего-то не читается, можно прочитать статус индикатора (8.2.4. Read Display Status (09h) - чтобы проверить схему и подключение, поскольку юзаю макетку с ATmega8 (переставлю ATmega328), если будет мало памяти.
Хорошему коту и в декабре - март :)
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

Короче, полный песец, пока не подключил логический анализатор к Arduino Uno c подключеным TFT 2.4" 240х320 - не мог втыкнуть, как запустить дисплей. Подключил анализатор, посмотрел 4 сигнала управления и 4 бита данных - всё по даташиту - Chip Select дёргать вниз перед командой управления и отпускать вверх после чтения или записи последнего байта. Пробовал читать ID командой 8.3.23. Read ID4 (D3h) - читаются одни нули, зато чтение статуса дисплея совпало с даташитом - 0x00610000, также совпало чтение ещё некоторых команд статуса. Уже замечательно - тип контроллера определил - ILI9341, дисплей проверил, частично отладил прогу и проверил схему.
Хорошему коту и в декабре - март :)
Ответить

Вернуться в «Периферия»