Грендайзер 0 3 марта, 2015 Опубликовано 3 марта, 2015 (изменено) · Жалоба Здравствуйте, всем доброго времени суток. Относительно недавно начал разбираться с 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) Написал код инициализации в соответствии с аппноутом (без дёргания ресетом): 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 пока ответа не даёт. Заранее спасибо за помощь. Изменено 3 марта, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryM 0 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба однако у меня на плате, нога nRESET соединена с ногой nRESET контроллера... Данная микросхема может управлять своей ножкой nRESET или как тогда дисплей инициализировать? nRESET bi-directional. RSTC->RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба На правильно включившемся дисплее, но с неочищенной GRAM, должна быть красивая хаотичная :) мешанина из разноцветных пикселей. Это есть? Вообще-то в GRAM (адрес 0X22) должны писаться тройки байтов (дисплей RGB как-никак). Подходит ли syst_int_8_bit_write для этих целей? Т.е. на одно обращение к регистру 0x22, данные RGB должны писаться тройками байт за цикл шины ЖКИ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 3 марта, 2015 Опубликовано 3 марта, 2015 (изменено) · Жалоба nRESET bi-directional. RSTC->RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST); Так и думал, сейчас попробую с этой ногой разобраться. На правильно включившемся дисплее, но с неочищенной GRAM, должна быть красивая хаотичная sm.gif мешанина из разноцветных пикселей. Это есть? Мешанины к сожалению нет :( Зато появляется некая "тельняшка". На экране проявляется полоска белых пикселей, затем чёрная, затем опять белая и т.д. На фотографиях до и после (извините за качество, телефон старый, с кнопками) Приведу код подпрограммы syst_int_8_bit_write: 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 должны писаться тройками байт за цикл шины ЖКИ. Да, про это не подумал... Изменено 3 марта, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 3 марта, 2015 Опубликовано 3 марта, 2015 (изменено) · Жалоба Фигня это. Дисплей не проинициализирован. Кстати, ATMELовкая ASF не поможет? Там и исходники и примеры есть. Аргумент у функции: uint32_t reg_data В теле функции: uint16_t byteH = 0; uint16_t byteL = 0; byteL = reg_data; byteH = reg_data >> 8; - "эротично" :) Байт у нас 16 или же 8 бит? Если "это наш крокодил - как хотим так имеряем", то - нет возражений. :) Не подходит для записи в GRAM: на одну запись адреса регистра две записи данных, а надо - три. Изменено 3 марта, 2015 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 3 марта, 2015 Опубликовано 3 марта, 2015 (изменено) · Жалоба byteL = reg_data; byteH = reg_data >> 8; - "эротично" sm.gif Байт у нас 16 или же 8 бит? Если "это наш крокодил - как хотим так имеряем", то - нет возражений. sm.gif Это моё изобретение, я им горжусь B) Но вообще не представляю, как записать сначала 8 бит, и потом другие 8 бит (шина записи в дисплей - 8-ми битная). Не подходит для записи в GRAM: на одну запись адреса регистра две записи данных, а надо - три. Ясно! Воощем план действий такой: 1) Научиться дрыгать ногой nRESET для нормальной инициализации дисплея; 2) Написать ф-цию, которая записывала бы данные о цвете пикселей "тройками" в регистр 0x22. Ну что ж попробуем! Изменено 3 марта, 2015 пользователем Грендайзер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Это моё изобретение, я им горжусь B) Но вообще не представляю, как записать сначала 8 бит, и потом другие 8 бит (шина записи в дисплей - 8-ми битная). Ясно! Воощем план действий такой: 1) Научиться дрыгать ногой nRESET для нормальной инициализации дисплея; 2) Написать ф-цию, которая записывала бы данные о цвете пикселей "тройками" в регистр 0x22. Ну что ж попробуем! Для нормальной инициализации дисплея не только Reset-ом дрыгать надо. Вообще имелось в виду другое: на входе uint32_t, байт был объявлен как uint16_t - винегрет. Как записать? Выделить требуемые разряды, сдвинуть в нужную позицию, и записать. Кроме того: градаций каждого цвета 64 => 0x00..0x3F, но отображаются значащие разряды не в DB[15..10], a в DB[17..12]; так что по-любому сдвигать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 3 марта, 2015 Опубликовано 3 марта, 2015 · Жалоба Вообще имелось в виду другое: на входе uint32_t, байт был объявлен как uint16_t - винегрет. Действительно, как это я не заметил... спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 4 марта, 2015 Опубликовано 4 марта, 2015 · Жалоба Снова здравствуйте. Никак не пойму, что там этому кортексу надо. Уже всё перепробывал, но нога ресет никак в 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); } } Уже чего только не перепробывал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryM 0 4 марта, 2015 Опубликовано 4 марта, 2015 · Жалоба Снова здравствуйте. Никак не пойму, что там этому кортексу надо. Уже всё перепробывал, но нога ресет никак в 0 не сбрасывается. Написал вот такую программку: Этого достаточно: RSTC -> RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST); После записи в RSTC_CR, вывод nRST будет выставлен в 0 длительностью 2^(ERSTL+1) Slow Clock cycles, потом вернется в 1. Если Вы ожидаете постоянный 0, то RSTC работает не так, а импульсом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 4 марта, 2015 Опубликовано 4 марта, 2015 (изменено) · Жалоба Снова здравствуйте. Никак не пойму, что там этому кортексу надо. Уже всё перепробывал, но нога ресет никак в 0 не сбрасывается. Написал вот такую программку:... Вот не поверите, но кортекс совершенно не при делах :) Я извиняюсь, в datasheet надо всёже заглядывать: RSTC_MR_ERSTL(60) - как может быть аргументом число 60 при 4-ёхзначном поле ERSTL? Опять же, под отладчиком посмотреть: что легло в регистр RSTC_MR (благо он доступен и на чтение). Изменено 4 марта, 2015 пользователем IgorKossak избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 4 марта, 2015 Опубликовано 4 марта, 2015 (изменено) · Жалоба DmitryM, не сумел сам толком разобраться. Большое Вам спасибо, теперь заработало. NRESET переодически сбрасывается из 1 в 0. Я извиняюсь, в datasheet надо всёже заглядывать Obam, да, Вы правы. Смотрел, читал... но чё то как то хреново смотрел. Большое спасибо, впредь буду внимательней! Изменено 4 марта, 2015 пользователем Грендайзер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 4 марта, 2015 Опубликовано 4 марта, 2015 · Жалоба Не томите уже, заводите ЖКИ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 5 марта, 2015 Опубликовано 5 марта, 2015 · Жалоба Всё, я пас. Сделал всё как вот здесь написано http://meandr.org/archives/3719 результат - 0! Не пойму, в чём косяк... Испоьзовал ф-ции для управления LCD те, что приводятся в примере к плате в AtmelStudio, но я так понял, что если я изменю тактовую частоту проекта, то ничего работать не будет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 5 марта, 2015 Опубликовано 5 марта, 2015 · Жалоба Всё, я пас. Сделал всё как вот здесь написано http://meandr.org/archives/3719 результат - 0! Не пойму, в чём косяк... Испоьзовал ф-ции для управления LCD те, что приводятся в примере к плате в AtmelStudio, но я так понял, что если я изменю тактовую частоту проекта, то ничего работать не будет? Быстро вы сдулись :) хватило на 3 дня. Брать и повторять чужой проект - занятие малоперспективное: контроллер в ЖКИ может и совпадает, а реализаций дисплея (связка микросхема-стекло) - "воз и маленькая тележка". Вы обратили внимание сколько разных вариантов шлейфов и цоколёвок существует? Может лучше полностью взять какой-нибудь проект с ЖКИ из ASF? Дисплей исправен? Регистры дисплея, хоть они и помечены для записи, доступны на чтение: соответствуют ли считанные данные записанным? А вообще, остаётся рассмотреть, что собрано на гибкой плате, вкурить что куда пишется, пошаговый прогон, контроль (осциллографом) - заработали ли преобразователи напряжения (по большей части в инициализации запускаются именно они) и т.д. Да, согласен, муторно, но если с наскока не заработало - другого выхода нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться