Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: ili9341 к AtMega 16

Ср фев 21, 2018 12:13:29

Получил индикатор 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?
Спасибо за ответ.

Re: ili9341 к AtMega 16

Ср фев 21, 2018 19:16:18

T_ххх это относится только к тачу, SDxx к флешке, а так из коробки он работает по параллельной шине.
А так нужно фото...

Re: ili9341 к AtMega 16

Ср фев 21, 2018 19:26:38

Mishany писал(а):T_ххх это относится только к тачу, SDxx к флешке

Как и весь SPI, скорее всего.
T_CS - чипселект для тача, F_CS - чипселект для флэшки, SDCS - чипеселект для SD.

Re: ili9341 к AtMega 16

Ср фев 21, 2018 21:15:05

Привет всем, кто нибудь может подсказать как инициализировать этот дисплей?
(МК - 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 байта данных

На дисплее точек не появляется. Может кто-нибудь помочь?

Re: ili9341 к AtMega 16

Чт фев 22, 2018 09:13:40

На дисплее точек не появляется. Может кто-нибудь помочь?

покажи, как настроен порты SPI. Особенно SS

Re: ili9341 к AtMega 16

Чт фев 22, 2018 18:44:52

(инициализацию вернул обратно свою 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 - результат тот-же)

Re: ili9341 к AtMega 16

Пт фев 23, 2018 08:50:13

SS не использую, CS дисплея подтягиваю к земле. (если использую SS - результат тот-же)

возможно, именно тут собака и порылась

дело в следующем:

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

Re: ili9341 к AtMega 16

Пт фев 23, 2018 12:27:52

Контроллер в режиме master, вывод сконфигурирован на выход, получается все правильно.

Re: ili9341 к AtMega 16

Пт фев 23, 2018 16:42:52

Контроллер в режиме master, вывод сконфигурирован на выход, получается все правильно.

ну, тогда надо подключать логический анализатор и смотреть, что там реально происходит.

у меня была такая беда, что я не сконфигурировал SS на выход и SPI не работал

Re: ili9341 к AtMega 16

Пт фев 23, 2018 21:26:20

есть рабочий тестовый проект под мегу 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);
}

Re: ili9341 к AtMega 16

Пт фев 23, 2018 23:32:09

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 есть.

Re: ili9341 к AtMega 16

Сб фев 24, 2018 08:55:19

TFT9341_V4.rar
(180.76 KiB) Скачиваний: 356
держи
А на кой прерывание по SPI? если обработчика нет? завесить МК?

Re: ili9341 к AtMega 16

Вт фев 27, 2018 20:45:35

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

Из своего кода прерывание по SPI убрал, дисплей ожил, но показывает только черно белые полосы на весь дисплей, на попытки порисовать не реагирует.

Re: ili9341 к AtMega 16

Ср фев 28, 2018 11:17:02

вот этот компилится, с V4 хз может что то сломал)))
Вложения
TFT9341_V3.rar
(146.98 KiB) Скачиваний: 369

Re: ili9341 к AtMega 16

Ср фев 28, 2018 21:29:08

Уррра its working :))
Большое спасибо.

Re: ili9341 к AtMega 16

Чт мар 01, 2018 10:32:43

и в чем же было дело?

Re: ili9341 к AtMega 16

Вс мар 04, 2018 12:35:36

Заработало с библиотекой, очень рад что дисплей рабочий. А со своим кодом остановился на том, что после того как убрал прерывания spi - дисплей стал показывать черно-белые полосы, но рисовать по прежнему отказывался, дальше разбираться не стал.
Mishany, можешь подсказать как сделать на основе шрифта 48 шрифт еще большего размера, или в какой программе его можно нарисовать? С функциями понятно, вопрос только в самих шрифтах.

Re: ili9341 к AtMega 16

Ср мар 07, 2018 07:28:32

TheDotFactory-0.1.4

Re: ili9341 к AtMega 16

Пт май 11, 2018 13:39:49

Народ, кто работал с параллельным 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), если будет мало памяти.

Re: ili9341 к AtMega 16

Сб май 12, 2018 18:52:01

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