|
ILI9325 и ATsam4s32c, чего дальше |
|
|
|
Mar 3 2015, 05:56
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Здравствуйте, всем доброго времени суток. Относительно недавно начал разбираться с ARM'ами на примере контроллера Atsam4sd32c, который, в свою очередь установлен на отладочной плате sam4s-ek2. Так же на плате установлен LCD дисплей с контроллером ILI9325. Сам по себе дисплей не нужен, но в процессе работы с платой периодически необходимо отображать всякие всячины, но вот опыта работы с дисплеями - чуть меньше чем нисколько... короче затык. Прошу помочь со следующими вопросами: 1) Для управления используется 8-ми битный интерфейс, который выбирается установкой сигналов IM3...IM0. На плате, подключены лишь 2 IM1 и IM0. При том IM1 = 0 а IM0 = 1, но в даташите написано, что подобное включение не корректно (Setting invalid). В чём дело? 2) На просторах нета нашёл аппноут ILI9325AN_V0.22 в коем написано, что перед началом инициализации необходимо, подёргать ножкой nRESET Код //************* Reset LCD Driver ****************// LCD_nRESET = 1; delayms(1); // Delay 1ms LCD_nRESET = 0; delayms(10); // Delay 10ms // This delay time is necessary LCD_nRESET = 1; delayms(50); // Delay 50 ms однако у меня на плате, нога nRESET соединена с ногой nRESET контроллера... Данная микросхема может управлять своей ножкой nRESET или как тогда дисплей инициализировать? 3) Написал код инициализации в соответствии с аппноутом (без дёргания ресетом): CODE WDT -> WDT_MR = WDT_MR_WDDIS; // disable Watchdog Timer pmc_enable_periph_clk(ID_PIOC); // enable clk PIOC PIOC -> PIO_PER = PIO_PC0|PIO_PC1|PIO_PC2|PIO_PC3|PIO_PC4|PIO_PC5|PIO_PC6|PIO_PC7|PIO_PC8|PIO_PC11 | PIO_PC13|PIO_PC15|PIO_PC19; PIOC -> PIO_OER = PIO_PC0|PIO_PC1|PIO_PC2|PIO_PC3|PIO_PC4|PIO_PC5|PIO_PC6|PIO_PC7|PIO_PC8|PIO_PC11 | PIO_PC13|PIO_PC15|PIO_PC19; PIOC -> PIO_SODR = PIO_PC0|PIO_PC1|PIO_PC2|PIO_PC3|PIO_PC4|PIO_PC5|PIO_PC6|PIO_PC7|PIO_PC8|PIO_PC11 | PIO_PC13|PIO_PC15|PIO_PC19; syst_int_8_bit_write(0x00E3, 0x3008); syst_int_8_bit_write(0x00E7, 0x0012); syst_int_8_bit_write(0x00EF, 0x1231); syst_int_8_bit_write(0x0001, 0x0100); syst_int_8_bit_write(0x0002, 0x0700); syst_int_8_bit_write(0x0003, 0x1030); syst_int_8_bit_write(0x0004, 0x0000); syst_int_8_bit_write(0x0008, 0x0207); syst_int_8_bit_write(0x0009, 0x0000); syst_int_8_bit_write(0x000A, 0x0000); syst_int_8_bit_write(0x000C, 0x0000); syst_int_8_bit_write(0x000D, 0x0000); syst_int_8_bit_write(0x000F, 0x0000); //*************Power On sequence ****************/ syst_int_8_bit_write(0x0010, 0x0000); syst_int_8_bit_write(0x0011, 0x0007); syst_int_8_bit_write(0x0012, 0x0000); syst_int_8_bit_write(0x0013, 0x0000); delay_ms(201); syst_int_8_bit_write(0x0010, 0x1290); syst_int_8_bit_write(0x0011, 0x0227); delay_ms(51); syst_int_8_bit_write(0x0012, 0x001A); delay_ms(51); syst_int_8_bit_write(0x0013, 0x1800); syst_int_8_bit_write(0x0029, 0x0028); syst_int_8_bit_write(0x002B, 0x000C); delay_ms(51); syst_int_8_bit_write(0x0020, 0x0000); syst_int_8_bit_write(0x0021, 0x0000); // ----------- Adjust the Gamma Curve ----------// syst_int_8_bit_write(0x0030, 0x0000); syst_int_8_bit_write(0x0031, 0x0305); syst_int_8_bit_write(0x0032, 0x0003); syst_int_8_bit_write(0x0035, 0x0304); syst_int_8_bit_write(0x0036, 0x000F); syst_int_8_bit_write(0x0037, 0x0407); syst_int_8_bit_write(0x0038, 0x0204); syst_int_8_bit_write(0x0039, 0x0707); syst_int_8_bit_write(0x003C, 0x0403); syst_int_8_bit_write(0x003D, 0x1604); //------------------ Set GRAM area ---------------// syst_int_8_bit_write(0x0050, 0x0000); syst_int_8_bit_write(0x0051, 0x00EF); syst_int_8_bit_write(0x0052, 0x0000); syst_int_8_bit_write(0x0053, 0x013F); syst_int_8_bit_write(0x0060, 0xA700); syst_int_8_bit_write(0x0061, 0x0001); syst_int_8_bit_write(0x006A, 0x0000); //-------------- Partial Display Control ---------// syst_int_8_bit_write(0x0080, 0x0000); syst_int_8_bit_write(0x0081, 0x0000); syst_int_8_bit_write(0x0082, 0x0000); syst_int_8_bit_write(0x0083, 0x0000); syst_int_8_bit_write(0x0084, 0x0000); syst_int_8_bit_write(0x0085, 0x0000); //-------------- Panel Control -------------------// syst_int_8_bit_write(0x0090, 0x0010); syst_int_8_bit_write(0x0092, 0x0600); syst_int_8_bit_write(0x0007, 0x0133); Но что дальше делать? Ну как что нибудь нарисовать? Я так понял надо загнать в память дисплея координаты пикселя, т.е. Код syst_int_8_bit_write(0x20, 100); syst_int_8_bit_write(0x21, 100); syst_int_8_bit_write(0x22, 100); но ничего не отобразилось... Курение даташита на ILI9325 пока ответа не даёт. Заранее спасибо за помощь.
Сообщение отредактировал IgorKossak - Mar 3 2015, 15:42
Причина редактирования: [codebox] для длинного кода, [code] - для короткого
|
|
|
|
|
Mar 3 2015, 08:32
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Грендайзер @ Mar 3 2015, 08:56)  однако у меня на плате, нога nRESET соединена с ногой nRESET контроллера... Данная микросхема может управлять своей ножкой nRESET или как тогда дисплей инициализировать? nRESET bi-directional. RSTC->RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST);
|
|
|
|
|
Mar 3 2015, 09:26
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
На правильно включившемся дисплее, но с неочищенной GRAM, должна быть красивая хаотичная  мешанина из разноцветных пикселей. Это есть? Вообще-то в GRAM (адрес 0X22) должны писаться тройки байтов (дисплей RGB как-никак). Подходит ли syst_int_8_bit_write для этих целей? Т.е. на одно обращение к регистру 0x22, данные RGB должны писаться тройками байт за цикл шины ЖКИ.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Mar 3 2015, 10:45
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата nRESET bi-directional. RSTC->RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST); Так и думал, сейчас попробую с этой ногой разобраться. Цитата На правильно включившемся дисплее, но с неочищенной GRAM, должна быть красивая хаотичная sm.gif мешанина из разноцветных пикселей. Это есть? Мешанины к сожалению нет  Зато появляется некая "тельняшка". На экране проявляется полоска белых пикселей, затем чёрная, затем опять белая и т.д. На фотографиях до и после (извините за качество, телефон старый, с кнопками) Приведу код подпрограммы syst_int_8_bit_write: CODE void syst_int_8_bit_write(uint8_t num_reg, uint32_t reg_data) { pio_set(PIOC, PIO_PC11 | PIO_PC8); // RD/WR -> 1 pio_clear(PIOC, PIO_PC15); // CS -> 0 pio_clear(PIOC, PIO_PC19); // RS -> 0 pio_clear(PIOC, 0xFF); // index register H -> 00000000 pio_clear(PIOC, PIO_PC8); // WR -> 0 for(int i = 0; i < time_holde; i++){} // width WR negative pulse pio_set(PIOC, PIO_PC8); // WR -> 1 for(int i = 0; i < time_holde; i++){} // time hold pio_set(PIOC, 0xFF & num_reg); // index register L pio_clear(PIOC, PIO_PC8); // WR -> 0 for(int i = 0; i < time_holde; i++){} // width WR negative pulse pio_set(PIOC, PIO_PC8); // WR -> 1 for(int i = 0; i < time_holde; i++){} // time hold pio_set(PIOC, PIO_PC19); // RS -> 1 pio_clear(PIOC, 0xFF); // PC0...PC7 -> 0 uint16_t byteH = 0; uint16_t byteL = 0; byteL = reg_data; byteH = reg_data >> 8; pio_set(PIOC, byteH); pio_clear(PIOC, PIO_PC8); // WR -> 0 for(int i = 0; i < time_holde; i++){} // width WR negative pulse pio_set(PIOC, PIO_PC8); // WR -> 1 for(int i = 0; i < time_holde; i++){} // width WR negative pulse pio_clear(PIOC, 0xFF); // PC0...PC7 -> 0 pio_set(PIOC, 0xFF & byteL); pio_clear(PIOC, PIO_PC8); // WR -> 0 for(int i = 0; i < time_holde; i++){} // width WR negative pulse pio_set(PIOC, PIO_PC8); // WR -> 1 for(int i = 0; i < time_holde; i++){} // width WR negative pulse pio_set(PIOC, PIO_PC15); // CS -> 1 return; } Код Т.е. на одно обращение к регистру 0x22, данные RGB должны писаться тройками байт за цикл шины ЖКИ. Да, про это не подумал...
Сообщение отредактировал IgorKossak - Mar 3 2015, 15:43
Причина редактирования: [codebox] для длинного кода, [code] - для короткого
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 3 2015, 12:09
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Фигня это. Дисплей не проинициализирован. Кстати, ATMELовкая ASF не поможет? Там и исходники и примеры есть. Аргумент у функции: uint32_t reg_data В теле функции: uint16_t byteH = 0; uint16_t byteL = 0; byteL = reg_data; byteH = reg_data >> 8; - "эротично"  Байт у нас 16 или же 8 бит? Если "это наш крокодил - как хотим так имеряем", то - нет возражений.  Не подходит для записи в GRAM: на одну запись адреса регистра две записи данных, а надо - три.
Сообщение отредактировал IgorKossak - Mar 3 2015, 15:43
Причина редактирования: бездумное цитирование
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Mar 3 2015, 12:58
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата byteL = reg_data; byteH = reg_data >> 8; - "эротично" sm.gif Байт у нас 16 или же 8 бит? Если "это наш крокодил - как хотим так имеряем", то - нет возражений. sm.gif Это моё изобретение, я им горжусь  Но вообще не представляю, как записать сначала 8 бит, и потом другие 8 бит (шина записи в дисплей - 8-ми битная). Цитата Не подходит для записи в GRAM: на одну запись адреса регистра две записи данных, а надо - три. Ясно! Воощем план действий такой: 1) Научиться дрыгать ногой nRESET для нормальной инициализации дисплея; 2) Написать ф-цию, которая записывала бы данные о цвете пикселей "тройками" в регистр 0x22. Ну что ж попробуем!
Сообщение отредактировал Грендайзер - Mar 3 2015, 13:00
|
|
|
|
|
Mar 3 2015, 13:35
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Грендайзер @ Mar 3 2015, 16:58)  Это моё изобретение, я им горжусь  Но вообще не представляю, как записать сначала 8 бит, и потом другие 8 бит (шина записи в дисплей - 8-ми битная). Ясно! Воощем план действий такой: 1) Научиться дрыгать ногой nRESET для нормальной инициализации дисплея; 2) Написать ф-цию, которая записывала бы данные о цвете пикселей "тройками" в регистр 0x22. Ну что ж попробуем! Для нормальной инициализации дисплея не только Reset-ом дрыгать надо. Вообще имелось в виду другое: на входе uint32_t, байт был объявлен как uint16_t - винегрет. Как записать? Выделить требуемые разряды, сдвинуть в нужную позицию, и записать. Кроме того: градаций каждого цвета 64 => 0x00..0x3F, но отображаются значащие разряды не в DB[15..10], a в DB[17..12]; так что по-любому сдвигать.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Mar 3 2015, 14:46
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата Вообще имелось в виду другое: на входе uint32_t, байт был объявлен как uint16_t - винегрет. Действительно, как это я не заметил... спасибо.
|
|
|
|
|
Mar 4 2015, 07:32
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Снова здравствуйте. Никак не пойму, что там этому кортексу надо. Уже всё перепробывал, но нога ресет никак в 0 не сбрасывается. Написал вот такую программку: Код int main (void) { WDT -> WDT_MR = WDT_MR_WDDIS; // disable Watchdog Timer pmc_enable_periph_clk(ID_PIOC); // enable clk PIOC pmc_enable_periph_clk(ID_RSTC); RSTC -> RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST); RSTC -> RSTC_MR = (RSTC_MR_KEY_PASSWD | (~RSTC_MR_URSTEN)|(~RSTC_MR_URSTIEN));
while(1) { RSTC -> RSTC_MR = (RSTC_MR_KEY_PASSWD | RSTC_MR_ERSTL(60)); //delay_ms(10); } } Уже чего только не перепробывал...
|
|
|
|
|
Mar 4 2015, 08:05
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Грендайзер @ Mar 4 2015, 10:32)  Снова здравствуйте. Никак не пойму, что там этому кортексу надо. Уже всё перепробывал, но нога ресет никак в 0 не сбрасывается. Написал вот такую программку: Этого достаточно: RSTC -> RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST); После записи в RSTC_CR, вывод nRST будет выставлен в 0 длительностью 2^(ERSTL+1) Slow Clock cycles, потом вернется в 1. Если Вы ожидаете постоянный 0, то RSTC работает не так, а импульсом.
|
|
|
|
|
Mar 4 2015, 08:26
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Грендайзер @ Mar 4 2015, 11:32)  Снова здравствуйте. Никак не пойму, что там этому кортексу надо. Уже всё перепробывал, но нога ресет никак в 0 не сбрасывается. Написал вот такую программку:... Вот не поверите, но кортекс совершенно не при делах  Я извиняюсь, в datasheet надо всёже заглядывать: RSTC_MR_ERSTL(60) - как может быть аргументом число 60 при 4-ёхзначном поле ERSTL? Опять же, под отладчиком посмотреть: что легло в регистр RSTC_MR (благо он доступен и на чтение).
Сообщение отредактировал IgorKossak - Mar 4 2015, 11:22
Причина редактирования: избыточное цитирование
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Mar 4 2015, 08:44
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
DmitryM, не сумел сам толком разобраться. Большое Вам спасибо, теперь заработало. NRESET переодически сбрасывается из 1 в 0. Цитата Я извиняюсь, в datasheet надо всёже заглядывать Obam, да, Вы правы. Смотрел, читал... но чё то как то хреново смотрел. Большое спасибо, впредь буду внимательней!
Сообщение отредактировал Грендайзер - Mar 4 2015, 08:56
|
|
|
|
|
Mar 5 2015, 09:52
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Всё, я пас. Сделал всё как вот здесь написано http://meandr.org/archives/3719 результат - 0! Не пойму, в чём косяк... Испоьзовал ф-ции для управления LCD те, что приводятся в примере к плате в AtmelStudio, но я так понял, что если я изменю тактовую частоту проекта, то ничего работать не будет?
|
|
|
|
|
Mar 5 2015, 11:07
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Грендайзер @ Mar 5 2015, 13:52)  Всё, я пас. Сделал всё как вот здесь написано http://meandr.org/archives/3719 результат - 0! Не пойму, в чём косяк... Испоьзовал ф-ции для управления LCD те, что приводятся в примере к плате в AtmelStudio, но я так понял, что если я изменю тактовую частоту проекта, то ничего работать не будет? Быстро вы сдулись  хватило на 3 дня. Брать и повторять чужой проект - занятие малоперспективное: контроллер в ЖКИ может и совпадает, а реализаций дисплея (связка микросхема-стекло) - "воз и маленькая тележка". Вы обратили внимание сколько разных вариантов шлейфов и цоколёвок существует? Может лучше полностью взять какой-нибудь проект с ЖКИ из ASF? Дисплей исправен? Регистры дисплея, хоть они и помечены для записи, доступны на чтение: соответствуют ли считанные данные записанным? А вообще, остаётся рассмотреть, что собрано на гибкой плате, вкурить что куда пишется, пошаговый прогон, контроль (осциллографом) - заработали ли преобразователи напряжения (по большей части в инициализации запускаются именно они) и т.д. Да, согласен, муторно, но если с наскока не заработало - другого выхода нет.
--------------------
Пролетарий умственного труда.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|