Прочитал даташит. Прочитал много статей, там для STM,Arduino, Raspberry и т.п. А подключить не как, понял что мне надо (1110) 4-wire 8-bit data serial interface (SCL,SDI,D/CX,SDO, CSX) тип II по SPI. Шлю с помошью Atmega16 код но инициализация не проходит, нет мурашек которые вроди должны быть. пробывал как тут ссылка но ничего не вышло.
Может кто знает, может есть пример "без воды" как на Atmega16, запустить ili9341. Нужно ли его инициализировать? Должны ли появится мурашки? Или может что еще посоветуете.
Нащёл это но не знаю актуально ли это к нему(и что это за код).
А подключить не как, понял что мне надо (1110) 4-wire 8-bit data serial interface (SCL,SDI,D/CX,SDO, CSX) тип II по SPI.
Что там подключать-то? Всё же написано - CS, SCK, MOSI, MISO (может не потребоваться), ну и RESET.
cgw писал(а):
Может кто знает, может есть пример "без воды" как на Atmega16, запустить ili9341.
Есть, в даташите.
cgw писал(а):
Нужно ли его инициализировать?
Как я понимаю - именно даташит и не изучался? Разве в "статьях" не сказано про необходимость инициализации?
cgw писал(а):
Должны ли появится мурашки?
Про какие "мурашки" ты говоришь? Про экран, заполненный случайными точками? Не факт, у меня сразу белым экран светится после инициализации.
cgw писал(а):
Или может что еще посоветуете.
Прочитать даташит. Проверить правильность подключения. Настроить SPI в AVR. Попробовать прочитать ID из индикатора (тут предупреждаю - может не получиться. Сам поймал такое - ILI вообще ничего в ответ не шлёт, и в инете многие жалуются). В соответствии в даташитом настроить ILI - там описано как её запустить. Настроить цветопередачу и начало координат.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
програмный spi легче перенести с платформы на платформу -только порты настроить допустить ошибку как раз сложнее .. наглядно видно какой режим человек хочет запустить дисплей . ему пока скорость не нужна . вот когда начнет рисовать тогда уже переводить на апаратный если захочет
я наоборот перевел свои минипроектики с аппаратного на програмный .приятнее на вид и ноги любые назначать можно вот если бы у avr spi бы буфер байта на 4 это да.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
програмный spi легче перенести с платформы на платформу -только порты настроить
На разных платформах "ногодрыг" производится совершенно разными способами, как и настройка портов. По большей части придётся все функции программного SPI писать с нуля.
12val12 писал(а):
допустить ошибку как раз сложнее
Ну здрасте.... Чем больше размер кода - тем выше вероятность ошибки. И когда индикатор не работает - ищи где баг: в коде SPI или в коде инициализации.
12val12 писал(а):
я наоборот перевел свои минипроектики с аппаратного на програмный .приятнее на вид
Насчет приятного на вид - очень спорно. И я придерживаюсь обратной идеологии: нечего самому делать то, что может сделать аппаратная часть и прочая автоматика. Я уж молчу про лишний размер кода. Да - soft-SPI занимает копейки, и пофиг на это... до поры до времени.
12val12 писал(а):
ТАКОЕ ГАВНО напоминает stm32 письмена.
Можно полюбопытствовать почему гуано и почему stm32? Особенно в свете строчки "Copyright (c) 2012 Atmel Corporation."
Cразу белым экран светится после подачи питания +5в на LED без инициализации.
Вот что смущает это SPI:
//5-Порядок передачи данных СпойлерSPCR^=(1<<DORD);// DORD=0; Порядок передачи битов данных определяется состоянием бита DORD регистра SPCR. Если бит установлен в 1, первым передается младший бит байта, если же сброшен в 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 —по нарастающему фронту) */
Не ясно какие они должны быть в даташите не нащел, может кто знает?
вот это гавно возмущен этим бредом беспредельно { ili9341_select_command_mode(); ili9341_select_chip(); ili9341_send_byte(command); ili9341_wait_for_send_done(); ili9341_select_data_mode(); }
вместо понятного DC_LCD=0; CS_LSD=0; SPDR =command; // апаратный while (SPSR.7==0) ; DC_LCD=1;
пины описаны дефайнами в начале . и все таки програмный SPI для старта , когда нужно определиться в работоспособности дисплея.лучше
Cразу белым экран светится после подачи питания +5в на LED без инициализации.
Это работает подсветка, не более того.
cgw писал(а):
Вот что смущает это SPI: ... Не ясно какие они должны быть в даташите не нащел, может кто знает?
Давай почитаем даташит вместе. Первый попавшийся, https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf Страница 38, смотрим внимательно на графики... Прекрасно видно, что старший бит передается первым. Легко читается, что полярность тактового сигнала "генерируются импульсы положительной полярности", как и то, что "обработка данных производится по переднему фронту импульсов сигнала SCK" - там даже стрелочки нарисованы!
12val12 писал(а):
а вот и непонятки о которых я говорил .
Теперь я внимательно слушаю, как ты ответишь на эти-же вопросы при условии soft-SPI. Повторю вопрос: "какие должны быть сигналы"?
12val12 писал(а):
возмущен этим бредом беспредельно ili9341_select_command_mode(); ili9341_select_chip(); .... вместо понятного DC_LCD=0; CS_LSD=0; SPDR =command; // апаратный
У-у-у-у, ну ясно, ясно. Позволь я угадаю: в твоих исходниках практически нет комментариев и названия функций ни о чем не говорят, особенно постороннему человеку. А так же ты никогда не писал код для других (а тем более для обучения), и не работал над более-менее большим кодом в более-менее большой команде.
Насчет "понятности": ili9341_select_command_mode(); - сразу, без чтения хелпов понятно, что данная функция переводит ILI в командный режим. ili9341_select_chip(); - тут всем ясно, что активируется доступ к чипу.
DC_LCD=0; - что это значит? Понятно, то что-то с LCD-экраном. Можно догадаться, что это установка некого сигнала "DC". А что за сигнал? Надо лезть в описание кода, а оно есть? А "0" - это что? Активно, неактивно? CS_LSD=0; - а тут вообще реклама наркоты какая-то.
Выкладываю схему подключения и код (ili9341+Atmega16) может кто что увидит что неправильно. + может кому поможет.
Запускается код дисплей 4 раза мигает по 1 сек, потом инициализация и потом должен загореться дисплей и он не загорается. И так до бесконечности. Видимо что то неправильно с инициализацией.
Если порт PB0="+" то шьем его по SPI. Если порт PB0="-" то запускается программа дисплея.
Reset правильно к PB1 подключить.
Развернуть схему Спойлер
Развернуть код (лучше открыть notepad++ комментарий очень много) Спойлер
Код:
// Главный итоговый проект для ili9341
#define F_CPU 1000000UL
#include <avr/io.h> #include <stdint.h> // Заголовочный файл объявляет целочисленные типы #include <stdlib.h> // функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие. #include <string.h> //строковаые типы. #include <util/delay.h> //Задержка #include <avr/interrupt.h>//Прерывания
int main(void) { //char Flag0=1; // флаг если пин включен то работаем иначе пропускаем код. unsigned char Flag1=0; // флаш чтобы запустить программу только 1 раз. //unsigned char mi=0; //unsigned char zn=0;
init_port(); //Инициализируем порт A и B. spi_settings(); // Настройка SPI
while (1){
//Если на ноге PORTB0 ноль то выполним условие. if (!(PINB & (1<<PORTB0))) {
//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
//Формат регистра SPSR
/* 7 SPIF Флаг прерывания от SPI. Данный флаг устанавливается в 1 по окончании передачи очередного байта. Если флаг SPIE регистра SPCR установлен в 1 и прерывания разрешены, то одновременно с установкой флага генерируется прерывание от SPI. Также флаг SPIF устанавливается в 1 при переводе_мик- роконтроллера из режима Master в режим Slave посредством вывода SS (см. раздел 10.4). Флаг сбрасывается аппаратно либо при старте подпрограммы обработки прерывания, либо после чтения регистра состояния SPI с последующим обращением к регистру данных SPI (SPDR)
6 WCOL Флаг конфликта записи. Данный флаг устанавливается в 1 при попытке записи в регистр данных (SPDR) во время передачи очередного байта. Флаг сбрасывается аппаратно после чтения регистра состояния SPI с последующим обращением к регистру данных SPI
5...1 -
0 */ SPSR^=(1<<SPI2X);// SPI2X=0 /*Зарезервированы, читаются как 0 Удвоение скорости обмена. При установке этого бита в 1 и работе микроконтроллера в режиме Master частота сигнала SCK удваивается
Передаваемые данные записываются, а принимаемые — считываются из регистра данных SPDR. по адресу $0F ($2F), */ }
// spi_SPDR_otpravit(i); Эта функция передает код по SPI. то что в переменной idat. void spi_SPDR_otpravit(char idat) //функция с примера SPI server2 { SPDR = idat; // Начало передачи while(!(SPSR & (1<<SPIF))) ; // Ожидание окончания передачи //return;// SPDR; //возвращаем принятый байт }
/*char spi_SPDR_prinyat(void){ // Чтение из SPI //Включение SPI, режима ведомого, разрешаем прерывани¤ //7-Разрешение прерывания от SPI // SPIE=1; //6-Включение/выключение SPI // SPE=1; SPCR = (1<<SPE)|(1<<SPIE);
ISR(SPI_STC_vect) //прерывание по приему байта { if (SPDR!=(0x00)) {PORTA=SPDR; _delay_ms(1000);}//выводим байт на PORTA }
}*/
/* char spi_SPIF(void){ //Флаг прерывания от SPI return SPIF; }
char spi_WCOL(void){//Флаг конфликта записи SPI return WCOL; } */
//Отправить данные void SPI_DATA_otpravit(char data1) // "ЭТО ОТПРАВКА ПАРАМЕТРОВ из может быть несколько" //Также ты можешь и передавать после отправки комманды. { PIN_DC_1_data; PIN_CS_0; spi_SPDR_otpravit(data1); PIN_CS_1; //if (spi_SPDR_otpravit(data) > 0b00000000) {return 0b11111111;} else {return 0b00000000;} }
//uint8_t тип другой. // Инициализация void ili9341_init(void) {
PIN_CS_1;
// сброс дисплея PIN_RST_1;
SPI_CMD_otpravit(0x01); //ILI9341_RESET); /*приводит к программному сбросу. Она возвращает команды и параметры их S/W Reset значения по умолчанию. (См таблиц по умолчанию в каждом описании команды.) Примечание: Содержание кадровой памяти не затрагиваются этой командой Надо будет подождать 5msec перед отправкой новой команды следующие программного сброса. Дисплейный модуль загружает все дисплей поставщиком заводским значениям к регистрам в течение этого 5msec. Если Software Reset применяется в режиме Sleep Out, надо будет ждать 120msec перед отправкой Sleep out команды. Software Reset Command не может быть отправлено во время выполнения последовательности Sleep Out . Примечание мое. 1msec=0,001sec*/
_delay_ms(100);
/// настраиваем дисплей
//Power control A (CBh) SPI_CMD_otpravit(0xCB); // EXTC должен быть высоким, чтобы включить эту команду SPI_DATA_otpravit(0x39); //по умолчанию SPI_DATA_otpravit(0x2C); //по умолчанию SPI_DATA_otpravit(0x00); //по умолчанию SPI_DATA_otpravit(0x34); //по умолчанию Vcore 1,6V SPI_DATA_otpravit(0x02); //по умолчанию ddvdh 5,6V
SPI_CMD_otpravit(0xCF); //Power control B (CFh) /* Параметр 2-й: управление мощностью [1: 0] Только установка управления мощностью [1:0] = 11, уровень напряжения VGH и VGL приведены в табл. bit[5]: DRV_ena : Для VCOM ведущее улучшение возможности, DRV_ena = 1: Включите, и наоборот bit[6]: PCEQ: PC и EQ операция для экономии электроэнергии 0:disable эта функция 1:enable эта функция
rd параметр: значение по умолчанию: 30h bit[2:0]: DRV_vmh[2:0] 3’b000 корректируются по ширине диска для VMH(000: 1 op_clk ~111: 8 op_clk) bit[3]: DRV_vml[0] 1’b0 bit[4]: DC_ena: Разряд путь включения. Включите высоко для защиты ESD, 1: включено и наоборот bit[7:6] : DRV_vml[2:1] 2’b00 EXTC должен быть высоким, чтобы включить эту команду*/
SPI_DATA_otpravit(0x00); //по умолчанию SPI_DATA_otpravit(0xC1); //0b11000001 DRV_ena : Для VCOM=0 ведущее улучшение возможности выкл/экономии электроэнергии вкл / SPI_DATA_otpravit(0x30); //по умолчанию ESD=1: вкл для защиты
SPI_CMD_otpravit(0xE8); //Driver timing control A (E8h) SPI_DATA_otpravit(0x85); /* 1 parameter : gate управление синхронизацией неперекрытия драйвера. 1:default + 1unit */ SPI_DATA_otpravit(0x00); /* 2 parameter : EQ timing control 0: default – 1unit
parameter : CR timing control 0: default – 1unit */
SPI_DATA_otpravit(0x78); /* 3 parameter : управление синхронизацией перед обвинением 00:default – 2unit */
SPI_CMD_otpravit(0xEA);//Driver timing control B (EAh) // 1 parameter:gate управление синхронизацией драйвера
SPI_DATA_otpravit(0x00); /*VG_SW_T1[1:0]:EQ to GND 00: 0 unit VG_SW_T2[1:0]:EQ to DDVDH 00: 0 unit VG_SW_T3[1:0]:EQ to DDVDH 00: 0 unit VG_SW_T4[1:0]:EQ to GND 00: 0 unit */ SPI_DATA_otpravit(0x00); //по умолчанию
SPI_CMD_otpravit(0xED); //Power on sequence control (EDh) /* кадры 1кадр и 3кадра 1кадр и 4кадра 2кадра и 3кадра
Ограничение EXTC должен быть высоким, чтобы включить эту команду */ SPI_DATA_otpravit(0x64); //0b01(CP1 soft start =10) 01(CP23 soft start =00) 0b01100100 /*1 st parameter:soft start control 00:soft start keep 3 frame 01:soft start keep 2 frame 10:soft start keep 1 frame 11:disable*/
SPI_DATA_otpravit(0x03); //0b00000011 SPI_DATA_otpravit(0x12); //0b00010010 /* 2nd/ 3rd parameter:включите управление последовательностью 00:1st frame enable 01:2nd frame enable 10:3rd frame enable 11:4th frame enable */ SPI_DATA_otpravit(0x81); // 0b10000001 /* 4th parameter:DDVDH улучшите режим (только для 8 внешних конденсаторов) 1: enable */
SPI_CMD_otpravit(0xF7); //Pump ratio control (F7h) //EXTC должен быть высоким, чтобы включить эту команду SPI_DATA_otpravit(0x20); //0b00100000 /*1 st parameter:ratio control 10:DDVDH=2xVCI*/
SPI_CMD_otpravit(0xC0); //Power Control 1 (C0h) /*VRH [5:0]: Установите уровень GVDD, который является контрольным уровнем для уровня VCOM и полутонового уровня напряжения.*/ SPI_DATA_otpravit(0x23); // 0b00100011 4.6V (5v это 0b00101011=0x2B) см табл. /*Примечание1: Удостоверьтесь что VC и VRH урегулирование ограничения: GVDD (DDVDH - ? 0.2) V.*/
SPI_CMD_otpravit(0xC1); //Power Control 2 (C1h) SPI_DATA_otpravit(0x10); // по умолчанию 0b00010(000) /* BT [2:0]: Устанавливает фактор, используемый в схемах повышения. Выберите оптимальный фактор повышения для рабочего напряжения. Чтобы уменьшить потребляемую мощность, установите меньший фактор. BT [2:0] = 000 DDVDH=VCIx2 VGH=VCIx7 VGL=-VCIx4
Примечание 1: Удостоверьтесь что DDVDH урегулирование ограничения: DDVDH ? 5.8 В. 2: Удостоверьтесь что VGH и VGL урегулирование ограничения: VGH-VGL ? 28 В
EXTC должен быть высоким, чтобы включить эту команду */
SPI_CMD_otpravit(0xC5); //VCOM Control 1(C5h) //EXTC должен быть высоким, чтобы включить эту команду //VMH [6:0] : Установите напряжение VCOMH. SPI_DATA_otpravit(0x3E); //0 VMH[6:0] = 00111110 = 4.250V(VCOMH) //VML [6:0] : Установите напряжение VCOML. SPI_DATA_otpravit(0x28); //0 VML[6:0] = 00101000 = -1.500V(VCOML)
SPI_CMD_otpravit(0xC7); //VCOM Control 2(C7h) SPI_DATA_otpravit(0x86); //0b10000110 (nVM[7] VMF[6:0]) /* nVM: nVM равняется “0” после включают сброс и VCOM смещение равняется значению MTP программы. Когда набор nVM к “1”, урегулирование VMF [6:0] становится допустимым и VCOMH/VCOML может быть скорректирован. VMF [6:0]: Установите Напряжение смещения VCOM.
VMF=0000110 VCOMH=VMH -58 VCOML = VML -58 */
SPI_CMD_otpravit(0x36);//Memory Access Control (36h) /*Эта команда определяет направление сканирования чтения-записи памяти фрейма. Эта команда не вносит изменения на другом состоянии драйвера..*/ SPI_DATA_otpravit(0x48); //0b01001000
/* Эти 3 бита управления MCU на к памяти записи-чтения направления. 7 MY Row Address Order 6 MX Column Address Order 5 MV Row / Column Exchange (обрезка экрана выкл) 4 ML Vertical Refresh Order LCD вертикаль обновляет управление направлением. (сверху вниз вкл) 3 BGR RGB-BGR Order Цветное управление селектором (0=RGB панель цветового фильтра, 1=BGR панель цветового фильтра) (RGB вкл) 2 MH Horizontal Refresh ORDER LCD горизонталь освежающее управление направлением.(слево на право вкл.) [1:0]=00
Примечание: то, Когда BGR бит, изменено, новое урегулирование сразу активно без обновления содержание в Памяти Фрейма снова. X = Не заботиться.
*/
SPI_CMD_otpravit(0x3A);// COLMOD: Pixel Format Set (3Ah)
/* Это наборы команд пиксельный формат для RGB отображает данные, используемые интерфейсом. DPI [2:0] является пиксельным выбором формата RGB интерфейс и DBI [2:0] являются пиксельным форматом интерфейса MCU. Если определенный интерфейс, или интерфейс RGB или интерфейс MCU, не используемый тогда соответствующие биты в параметре проигнорированы. Пиксельный формат показан в таблице ниже.
Если использование Интерфейса RGB должно последовательный интерфейс выбора. X = Не заботиться */ SPI_DATA_otpravit(0x55); //0b01010101 0b0(101)0(101) 0b0(DPI[2:0])0(DBI[2:0]) /* DPI 16 bits / pixel DBI 16 bits / pixel */
SPI_CMD_otpravit(0xB1); //Frame Rate Control (In Normal Mode/Full Colors) (B1h) /* их 3 вида Frame Rate Control (In Normal Mode/Full Colors) (B1h) Frame Rate Control (In Idle Mode/8 colors) (B2h) Frame Rate control (In Partial Mode/Full Colors) (B3h)
Формула, чтобы вычислить кадровую частоту: Frame Rate= ( fosc )/(Clocks per line x Division ratio x (Lines + VBP + VFP) ) Устанавливает отношение подразделения для внутренних часов Normal режима в интерфейсе MCU. fosc: внутренняя частота осциллятора Часы за строку:RTNA настройки Отношение подразделения: DIVA настройки. Строки: общий ведущий номер строки VBP: номер строки задней porch VFP: передний номер строки porch
SPI_CMD_otpravit(0xB6);//Display Function Control (B6h) //EXTC должен быть высоким, чтобы включить эту команду. SPI_DATA_otpravit(0x08); //0b00001000 0b0000(10)(00) 0b0000(PTG[1:0])(PT[1:0]) /* PTG [1:0]: Установите режим сканирования в области недисплея. Выводы логического элемента в области недисплея = Сканирование интервала Исходные выводы в области недисплея = Набор с PT [2:0] биты Вывод VCOM пусто. PT [1:0]: Определите вывод источник /VCOM в области недисплея в partial режиме отображения. Источник Вывод на области недисплея Положительная полярность = V63 Источник Вывод на области недисплея Отрицательная полярность = V0 Вывод VCOM на область недисплея Положительная полярность = VCOML Вывод VCOM на область недисплея Отрицательная полярность =VCOMH */ SPI_DATA_otpravit(0x82); //0b10000010 0b(1)(0)(0)(0)(0010) 0b(REV)(GS)(SS)(SM)(ISC[3:0])
/*
REV: Выберите, является ли жидкокристаллический тип обычно белым типом или Нормальный черный тип . Жидкокристаллический тип = 0 Нормальный белый = 1 Нормальный черный
GS: Устанавливает направление сканирования драйвером логического элемента в диапазоне, определенном SCN [4:0] и NL [4:0]. Направление сканирования определяется GS = 0 может быть отменено установкой GS = 1. Gate Output Scan Direction Пропустите выходное направление сканирования =0 это G1 -> G320 =1 это G320 -> G1
SS: Выберите направление сдвига выводов от исходного драйвера. SS Исходное выходное направление сканирования =0 т.е S1 -> S720 В дополнение к направлению сдвига параметры настройки и для SS и для битов BGR требуются, чтобы изменять присвоение R, G, и точки B к исходным контактам драйвера. Чтобы присвоить R, G, B точки к исходным контактам драйвера от S1 до S720, устанавливают SS = 0. Чтобы присвоить R, G, B точки к исходным контактам драйвера от S720 до S1, устанавливают SS = 1.
SM: Устанавливает расположение контакта драйвера логического элемента в сочетании с битом GS выбирать оптимальный режим сканирования для модуля.
SM=0 GS=0 Scan Direction Направление сканирования сверху вниз G2 to G320 G1 to G318
ISC [3:0]: Определите интервал цикла сканирования драйвера логического элемента в области недисплея когда PTG [1:0] =” 10”, чтобы выбрать сканирование интервала. Тогда цикл сканирования установлен как нечетное число с 0~29 периодов фрейма. Полярность инвертирована каждый цикл сканирования.
/* NL [5:0]: Определяет номер строк, чтобы управлять жидкокристаллическим дисплеем в интервале 8 строк. Отображение GRAM адресов не затронуто числом строк, установленных NL [5:0]. Число строк должно быть тем же или больше, чем число необходимых строк для размера жидкокристаллической панели.
NL [5:0] = 100111 это 320 строк
*/
/*PCDIV [5:0]: Которого нет external fosc= (DOTCLK) /(2x (PCDIV+1))*/
SPI_CMD_otpravit(0xF2);//Enable 3G (F2h) /* 1 st Parameter: Enable 3 гамма управления 3G_enb high для 3 гамма управления enable Ограничение EXTC должен быть высоким, чтобы включить эту команду */ SPI_DATA_otpravit(0x00); // 3GAMMA_EN выкл.
SPI_CMD_otpravit(0x2A); //Column Address Set (2Ah) /* Эта команда используется, чтобы определить область столбца памяти фрейма Frame Memory , где MCU может получить доступ. Эта команда не вносит изменения на другом состоянии драйвера. Значения SC [15:0] и EC [15:0] отнесены, когда команда RAMWR прибывает. Каждое значение представляет строку на один столбец в Памяти Фрейма
SC [15:0] всегда должен быть равен или меньше, чем EC [15:0]. Отметьте 1: Когда SC [15:0] или EC [15:0] будет больше, чем 00EFh (Когда MADCTL's B5 = 0) или 013Fh (Когда MADCTL's B5 = 1), данные из диапазона будут проигнорированы.
SPI_CMD_otpravit(0x2B);//Page Address Set (2Bh) /* Эта команда используется для определения области строк Frame Memory памяти кадров, где MCU может получить доступ. Эта команда не делает никаких изменений на другой статус драйвера. Значения SP [15: 0] и EP [15: 0] называются, когда команда RAMWR приходит. Каждое значение представляет собой одну строку страницы в памяти кадров.
SP [15:0] всегда должен быть равен или меньше, чем EP [15:0] Отметьте 1: Когда SP [15:0] или EP [15:0] больше, чем 013Fh (Когда MADCTL's B5 = 0) или 00EFh (Когда MADCTL's B5 = 1), данные из диапазона будут проигнорированы.
SPI_CMD_otpravit(0x11);//Sleep Out (11h) /* Эта команда заставляет LCD модуль вводить минимальный режим потребляемой мощности. В этом режиме, например, преобразователе DC/DC остановлен, Внутренний осциллятор остановлен, и сканирование панели остановлено. Интерфейс MCU и память все еще работают, и память сохраняет свое содержание. X = Не заботиться Ограничение Эта команда не имеет никакого эффекта, когда модуль уже находится в режиме Sleep In. Sleep In режим может только оставить сон (Sleep Out) команда (11h) . Будет необходимо ожидать 5msec прежде, чем отправить следующий за командой, это должно позволить время для поставки напряжения и схемы часов, чтобы стабилизироваться. Будет необходимо ожидать 120msec после передающей команды Sleep Out (когда во Sleep In режиме), прежде чем команда Sleep In может быть отправлена. */
_delay_ms(100); SPI_CMD_otpravit(0x29);//Display ON (29h) /* Эта команда используется, чтобы восстановиться с режима DISPLAY OFF. Вывод от Frame Memory включена. Эта команда не вносит изменения содержания памяти фрейма. Эта команда не изменяет никакое другое состояние */
SPI_CMD_otpravit(0x2C); //Memory Write (2Ch) //ILI9341_GRAM - это команда Memory Write (2Ch) }
Давай почитаем даташит вместе. Первый попавшийся, https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf Страница 38, смотрим внимательно на графики... Прекрасно видно, что старший бит передается первым. Легко читается, что полярность тактового сигнала "генерируются импульсы положительной полярности",
спс, сам бы не догадался что по картинкам можно определить. Для Atmega16 + ili9341 в SPI должен быть.
CPOL = 0, CPHA = 0
Leading Edge Sample (Rising)
Trailing Edge SPI Mode Setup (Falling)
SPI Mode 0
Значит в коде он правильный.
Последний раз редактировалось cgw Вт апр 26, 2016 09:29:49, всего редактировалось 1 раз.
Зачем вход RESET у AVR соединен с RESET ILI? Даташит внимательно читался? Там указаны временные параметры формирования сигнала сброс.
Тот же даташит насколько внимательно изучался?! Раздел "19.2.1. General DC Characteristics"
Код:
Logic Operating Voltage VDDI ... MIN=1.65 Typ=2.8 MAX=3.3V Logic High Level Input Voltage VIH MIN=0.7*VDDI MAX=VDDI Logic Low Level Input Voltage VIL MIN=VSS MAX=0.3*VDDI
На плате экрана есть линейный преобразователь питания, так что из 5 вольт получаются нужные 3.3 для питания. А вот по входу радостно прибегают все 5 вольт, что по даташиту не полагается. Я не помню, насколько ILI защищена от перенапряжения по входу, так что шанс есть, что экран ещё живой...
Управление подсветкой прямо с вывода AVR? И какой ток потребляет подсветка? Не перегружаешь выход AVR? У меня для достаточно яркой подсветки при питании 3.3 всё равно потребовался гасящий резистор.
cgw писал(а):
#define PIN_DC_0_cmd PORTB^=(1<<PORTB3); //PA3 // выбор комманды0 или данные1. #define PIN_CS_0 PORTB^=(1<<PORTB4); //PA4 // выбор чипа.
В результате выполнения этого кода в регистре управления SPI будет: SPIE=1 SPE=1 DORD=1 MSTR=1 CPOL=1 CPHA=1 SPR1=1 SPR0=1 Подтверди что именно ЭТИ настройки тебе нужны для работы с ILI. И расскажи, как ты обрабатываешь прерывание от SPI?
cgw писал(а):
//Отправить комманду. void SPI_CMD_otpravit(char data0) // ЭТО ОТПРАВИТЬ ВЕРХНЮЮ КОММАНДУ 1 БИТ(8байт). { PIN_DC_0_cmd; PIN_CS_0; spi_SPDR_otpravit(data0); PIN_CS_1; //if (spi_SPDR_otpravit(data) > 0b00000000) {return 0b11111111;} else {return 0b00000000;} } //Отправить данные void SPI_DATA_otpravit(char data1) // "ЭТО ОТПРАВКА ПАРАМЕТРОВ из может быть несколько" //Также ты можешь и передавать после отправки комманды. { PIN_DC_1_data; PIN_CS_0; spi_SPDR_otpravit(data1); PIN_CS_1; //if (spi_SPDR_otpravit(data) > 0b00000000) {return 0b11111111;} else {return 0b00000000;} }
Угу: сигнал CS становится активным (лог."0") перед передачей каждого байта, и становится неактивным (лог."1") после окончания передачи. В то время как в даташите несколько раз приведены диаграммы SPI-передачи команды с параметрами. И там видно, как сигнал CS становится активным перед передачей первого байта (т.е. команды), и остаётся на низком уровне до окончания передачи последнего байта параметров. Почитай в даташите раздел "7.1.11. Data Transfer Break and Recovery"
Не знал куда его, я переключил на ногу PB1 тоже самое.
mas123 писал(а):
На плате экрана есть линейный преобразователь питания, так что из 5 вольт получаются нужные 3.3 для питания. А вот по входу радостно прибегают все 5 вольт, что по даташиту не полагается.
А я считал 5в так 5в куда угодно.
mas123 писал(а):
Управление подсветкой прямо с вывода AVR? И какой ток потребляет подсветка? Не перегружаешь выход AVR?
ток на проводе 80mA при включенной подсветке.
mas123 писал(а):
Напомни, какое действие выполняет оператор "^"?
У меня так #define PIN_LED_1 PORTB=PORTB|(1<<PORTB2); //Подсветка горит 80mА 4,7v #define PIN_LED_0 PORTB^=(1<<PORTB2); //Подсветка не горит 0mА 0v Это работает на подсветке дисплея на практике, на счет SPI не знаю надо проверить.
Может это SPCR|=(1<<SPE);// SPE=??? а надо так SPCR=SPCR|(1<<SPE);// SPE=1
mas123 писал(а):
И расскажи, как ты обрабатываешь прерывание от SPI?
void spi_SPDR_otpravit(char idat) { SPDR = idat; // Начало передачи while(!(SPSR & (1<<SPIF))) ; // Ожидание окончания передачи }
А тут понял с CS неправильно. SPI_CMD_otpravit SPI_DATA_otpravit
Не знал куда его, я переключил на ногу PB1 тоже самое.
Разумеется. Толку от переключения, если ты сигнал сброс не формируешь.
cgw писал(а):
А я считал 5в так 5в куда угодно.
В этом мире уже давно и часто применяется напряжение питания 3.3, а в особо запущенных случаях 1.8В. А ещё низковольтовые м/с бывают как толерантны к высокому напряжению на входе, так и нет.
cgw писал(а):
ток на проводе 80mA при включенной подсветке.
Прекрасно. Давай теперь заглянем в даташит на Атмегу и посмотрим - а какой же ток допустимо снимать с выхода?
cgw писал(а):
У меня так #define PIN_LED_1 PORTB=PORTB|(1<<PORTB2); //Подсветка горит 80mА 4,7v #define PIN_LED_0 PORTB^=(1<<PORTB2); //Подсветка не горит 0mА 0v Это работает на подсветке дисплея на практике,
Я повторяю свой вопрос: какое действие в языке Си выполняет оператор "^"? Попробуй дважды вызвать "PIN_LED_0" и расскажи что случилось и почему.
cgw писал(а):
mas123 писал(а):
И расскажи, как ты обрабатываешь прерывание от SPI?
void spi_SPDR_otpravit(char idat)
Я спросил не про передачу байта. В момент окончания передачи у тебя формируется прерывание SPI. Обработчика прерывания нет. Тебя спасает лишь то, что глобальные прерывания у тебя запрещены.
cgw писал(а):
mas123 писал(а):
Э-э-э, какой такой сброс?
Как тут
Ты хочешь сказать, что сигналом "сброс" является переход пина из "1" и "1". Причем пина, настроенного как вход?
cgw писал(а):
Интересно какой в SPI для дисплея DORD должен быть 1 или 0?
Интересно, когда же ты просто откроешь даташит на ILI и на Atmega и почитаешь их?
Разумеется. Толку от переключения, если ты сигнал сброс не формируешь. Ты хочешь сказать, что сигналом "сброс" является переход пина из "1" и "1". Причем пина, настроенного как вход?
Формирую при начале инициализации, только не знаю зачем. Чета я не пойму,что сброс не нужен так? Или он не правильно настроен?
mas123 писал(а):
Прекрасно. Давай теперь заглянем в даташит на Атмегу и посмотрим - а какой же ток допустимо снимать с выхода?
27.1 Абсолютные максимальные рейтинги * DC Current per I/O Pin 40.0mA у меня 80mA DC Current V CC and GND Pins 200.0mA PDIP у меня 0,9A Output Low Voltage(Ports A,B,C,D) IOL = 20mA, VCC = 5V Входной ток утечки I / O Pin Vcc = 5.5V, pin low (absolute value) Max 1µA
Странно но оно еще работает, значит не совсем максимальные. Я думал на эту тему искал по форумам и понял Что чем больше ампер тем лучше(лишь бы не меньше), главное чтобы вольт было точно, разве не так?
mas123 писал(а):
Я повторяю свой вопрос: какое действие в языке Си выполняет оператор "^"? Попробуй дважды вызвать "PIN_LED_0" и расскажи что случилось и почему.
исключающее ИЛИ 11110000 XOR 10101010 = 01011010 11=0 00=0 10=1 01=1 Подбирал, подбирал заработало, ура. Вот так они выставлялись особо та и не понимая что это такое. Как по другому выставлять биты в регистре не нащёл.
Запускаю два раза PIN_LED_0 (PORTB^=(1<<PORTB2)) МК выполняет 2 раза и 2 раза включает и выключает 2й бит. порта B. on off on off
При отладки вижу, у меня весь код не рабочий. define не правильные вместо 1, шлю 0; SPI не правильно. Вместо 0, шлю 1;
mas123 писал(а):
Я спросил не про передачу байта. В момент окончания передачи у тебя формируется прерывание SPI. Обработчика прерывания нет. Тебя спасает лишь то, что глобальные прерывания у тебя запрещены.
Прерывания запрещены, по умолчанию нули, туда не лазил еще. А когда вызываю PIN_LED_0; PIN_LED_0; 5й бит GIFR почему-то включается.
mas123 писал(а):
Интересно, когда же ты просто откроешь даташит на ILI и на Atmega и почитаешь их?
Нет его в даташите дисплея. Поиском искал DORD нету. В меге есть, так мне надо знать какой он для дисплея нужен. Ааа на графике 7й бит передается первым. MSB first (DORD = 0) т.е. как на стр 38 по даташиту Atmel при DORD = 0 передаем так. 7 6 5 4 3 2 1 0
DC Current per I/O Pin 40.0mA у меня 80mA Странно но оно еще работает, значит не совсем максимальные.
Мдя-я-я-я. А ты дорогу переходишь на красный свет, да? "Странно, но я ещё живой и меня не сбили - значит не совсем запрещено".
cgw писал(а):
Что чем больше ампер тем лучше(лишь бы не меньше), главное чтобы вольт было точно, разве не так?
Если через светодиод подсветки пустить бОльший ток, чем положено - он сгорит. Про связь тока и напряжение - см. закон Ома.
cgw писал(а):
Подбирал, подбирал заработало, ура. Вот так они выставлялись особо та и не понимая что это такое.
Жесть... и прочий аллюминий...
cgw писал(а):
Как по другому выставлять биты в регистре не нащёл.
Гм, может тебе вначале выучить язык Си? Ибо методом подбора ты ничего не сделаешь. Я тебе даже подскажу - в районе описания "^" есть описания и других логических операторов "~", "!", "|" и "&"
cgw писал(а):
Запускаю два раза PIN_LED_0 (PORTB^=(1<<PORTB2)) МК выполняет 2 раза и 2 раза включает и выключает 2й бит. порта B.
Тебе это не кажется несколько странным? Ты даёшь команду "выключить", а он выполняет "переключить"...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения