Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ILI9325 и ATsam4s32c
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Грендайзер
Здравствуйте, всем доброго времени суток. Относительно недавно начал разбираться с 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 пока ответа не даёт. Заранее спасибо за помощь.
DmitryM
Цитата(Грендайзер @ Mar 3 2015, 08:56) *
однако у меня на плате, нога nRESET соединена с ногой nRESET контроллера... Данная микросхема может управлять своей ножкой nRESET или как тогда дисплей инициализировать?


nRESET bi-directional.
RSTC->RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST);
Obam
На правильно включившемся дисплее, но с неочищенной GRAM, должна быть красивая хаотичная sm.gif мешанина из разноцветных пикселей.
Это есть?

Вообще-то в GRAM (адрес 0X22) должны писаться тройки байтов (дисплей RGB как-никак).
Подходит ли syst_int_8_bit_write для этих целей?
Т.е. на одно обращение к регистру 0x22, данные RGB должны
писаться тройками байт за цикл шины ЖКИ.
Грендайзер
Цитата
nRESET bi-directional.
RSTC->RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST);

Так и думал, сейчас попробую с этой ногой разобраться.
Цитата
На правильно включившемся дисплее, но с неочищенной GRAM, должна быть красивая хаотичная sm.gif мешанина из разноцветных пикселей.
Это есть?

Мешанины к сожалению нет sad.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 должны
писаться тройками байт за цикл шины ЖКИ.

Да, про это не подумал...
Obam
Фигня это. Дисплей не проинициализирован.
Кстати, ATMELовкая ASF не поможет? Там и исходники и примеры есть.


Аргумент у функции: uint32_t reg_data
В теле функции:
uint16_t byteH = 0;
uint16_t byteL = 0;

byteL = reg_data;
byteH = reg_data >> 8; - "эротично" sm.gif Байт у нас 16 или же 8 бит? Если "это наш крокодил - как хотим так имеряем", то - нет возражений. sm.gif

Не подходит для записи в GRAM: на одну запись адреса регистра две записи данных, а надо - три.
Грендайзер
Цитата
byteL = reg_data;
byteH = reg_data >> 8; - "эротично" sm.gif Байт у нас 16 или же 8 бит? Если "это наш крокодил - как хотим так имеряем", то - нет возражений. sm.gif

Это моё изобретение, я им горжусь cool.gif Но вообще не представляю, как записать сначала 8 бит, и потом другие 8 бит (шина записи в дисплей - 8-ми битная).
Цитата
Не подходит для записи в GRAM: на одну запись адреса регистра две записи данных, а надо - три.

Ясно! Воощем план действий такой:
1) Научиться дрыгать ногой nRESET для нормальной инициализации дисплея;
2) Написать ф-цию, которая записывала бы данные о цвете пикселей "тройками" в регистр 0x22.
Ну что ж попробуем!
Obam
Цитата(Грендайзер @ Mar 3 2015, 16:58) *
Это моё изобретение, я им горжусь cool.gif Но вообще не представляю, как записать сначала 8 бит, и потом другие 8 бит (шина записи в дисплей - 8-ми битная).

Ясно! Воощем план действий такой:
1) Научиться дрыгать ногой nRESET для нормальной инициализации дисплея;
2) Написать ф-цию, которая записывала бы данные о цвете пикселей "тройками" в регистр 0x22.
Ну что ж попробуем!


Для нормальной инициализации дисплея не только Reset-ом дрыгать надо.

Вообще имелось в виду другое: на входе uint32_t, байт был объявлен как uint16_t - винегрет.
Как записать? Выделить требуемые разряды, сдвинуть в нужную позицию, и записать.
Кроме того: градаций каждого цвета 64 => 0x00..0x3F, но отображаются значащие разряды не в DB[15..10], a в DB[17..12]; так что по-любому сдвигать.
Грендайзер
Цитата
Вообще имелось в виду другое: на входе uint32_t, байт был объявлен как uint16_t - винегрет.

Действительно, как это я не заметил... спасибо.
Грендайзер
Снова здравствуйте. Никак не пойму, что там этому кортексу надо. Уже всё перепробывал, но нога ресет никак в 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
Цитата(Грендайзер @ 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 работает не так, а импульсом.
Obam
Цитата(Грендайзер @ Mar 4 2015, 11:32) *
Снова здравствуйте. Никак не пойму, что там этому кортексу надо. Уже всё перепробывал, но нога ресет никак в 0 не сбрасывается. Написал вот такую программку:...


Вот не поверите, но кортекс совершенно не при делах sm.gif

Я извиняюсь, в datasheet надо всёже заглядывать: RSTC_MR_ERSTL(60) - как может быть аргументом число 60 при
4-ёхзначном поле ERSTL? Опять же, под отладчиком посмотреть: что легло в регистр RSTC_MR (благо он доступен
и на чтение).
Грендайзер
DmitryM, не сумел сам толком разобраться. Большое Вам спасибо, теперь заработало. NRESET переодически сбрасывается из 1 в 0.
Цитата
Я извиняюсь, в datasheet надо всёже заглядывать

Obam, да, Вы правы. Смотрел, читал... но чё то как то хреново смотрел. Большое спасибо, впредь буду внимательней! blush.gif
Obam
Не томите уже, заводите ЖКИ
Грендайзер
Всё, я пас. Сделал всё как вот здесь написано http://meandr.org/archives/3719 результат - 0!
Не пойму, в чём косяк...
Испоьзовал ф-ции для управления LCD те, что приводятся в примере к плате в AtmelStudio, но я так понял, что если я изменю тактовую частоту проекта, то ничего работать не будет?
Obam
Цитата(Грендайзер @ Mar 5 2015, 13:52) *
Всё, я пас. Сделал всё как вот здесь написано http://meandr.org/archives/3719 результат - 0!
Не пойму, в чём косяк...
Испоьзовал ф-ции для управления LCD те, что приводятся в примере к плате в AtmelStudio, но я так понял, что если я изменю тактовую частоту проекта, то ничего работать не будет?


Быстро вы сдулись sm.gif хватило на 3 дня.

Брать и повторять чужой проект - занятие малоперспективное: контроллер в ЖКИ может и совпадает, а реализаций дисплея (связка микросхема-стекло) - "воз и маленькая тележка".
Вы обратили внимание сколько разных вариантов шлейфов и цоколёвок существует?

Может лучше полностью взять какой-нибудь проект с ЖКИ из ASF?
Дисплей исправен?

Регистры дисплея, хоть они и помечены для записи, доступны на чтение: соответствуют ли считанные данные записанным?

А вообще, остаётся рассмотреть, что собрано на гибкой плате, вкурить что куда пишется, пошаговый прогон, контроль (осциллографом) - заработали ли преобразователи напряжения
(по большей части в инициализации запускаются именно они) и т.д. Да, согласен, муторно, но если с наскока не заработало - другого выхода нет.
Грендайзер
Дисплей рабочий. Я включал его при помощи примера, который приведён в AtmelStudio для данной платы. Даже создавал свой проект используя ф-ции приведённые там. Вся загвоздка в том, что как я понял, там настраиваются всевозможные временные характеристики, например вот:
CODE

pmc_enable_periph_clk(ID_SMC);

/** Configure SMC interface for Lcd */
smc_set_setup_timing(SMC, ILI93XX_LCD_CS, SMC_SETUP_NWE_SETUP(2)
| SMC_SETUP_NCS_WR_SETUP(2)
| SMC_SETUP_NRD_SETUP(2)
| SMC_SETUP_NCS_RD_SETUP(2));
smc_set_pulse_timing(SMC, ILI93XX_LCD_CS, SMC_PULSE_NWE_PULSE(4)
| SMC_PULSE_NCS_WR_PULSE(4)
| SMC_PULSE_NRD_PULSE(10)
| SMC_PULSE_NCS_RD_PULSE(10));
smc_set_cycle_timing(SMC, ILI93XX_LCD_CS, SMC_CYCLE_NWE_CYCLE(10)
| SMC_CYCLE_NRD_CYCLE(22));
#if ((!defined(SAM4S)) && (!defined(SAM4E)))
smc_set_mode(SMC, ILI93XX_LCD_CS, SMC_MODE_READ_MODE
| SMC_MODE_WRITE_MODE
| SMC_MODE_DBW_8_BIT);
#else
smc_set_mode(SMC, ILI93XX_LCD_CS, SMC_MODE_READ_MODE
| SMC_MODE_WRITE_MODE);
#endif
/** Initialize display parameter */
g_ili93xx_display_opt.ul_width = ILI93XX_LCD_WIDTH;
g_ili93xx_display_opt.ul_height = ILI93XX_LCD_HEIGHT;
g_ili93xx_display_opt.foreground_color = COLOR_BLACK;
g_ili93xx_display_opt.background_color = COLOR_WHITE;

без них, проект не работает... Аесли я подключу другой резонатор, или pll врублю... то ничего работать не будет. А разобраться чё там где подключается не получилось... wacko.gif
Obam
Зачем тень на плетень наводите?! "…результат - 0…"
Всё нормально! "Скоро, Киса, только кошки родятся"

Сидеть, курить "доку", отладчик, пожаговый режим…
А с изменением частоты, может оказаться, что менять ни чего не надо будет;
контроллер в ЖКИ достаточно шустрый.
Грендайзер
Ясно, спасибо за помощь, ещё чуток поэксперементирую, буду надеятся что появятся конкретные вопросы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.