реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ILI9325 и ATsam4s32c, чего дальше
Грендайзер
сообщение Mar 3 2015, 05:56
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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] - для короткого
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Mar 3 2015, 08:32
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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);
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 3 2015, 09:26
Сообщение #3


Знающий
****

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



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

Вообще-то в GRAM (адрес 0X22) должны писаться тройки байтов (дисплей RGB как-никак).
Подходит ли syst_int_8_bit_write для этих целей?
Т.е. на одно обращение к регистру 0x22, данные RGB должны
писаться тройками байт за цикл шины ЖКИ.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Mar 3 2015, 10:45
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



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

Да, про это не подумал...

Сообщение отредактировал IgorKossak - Mar 3 2015, 15:43
Причина редактирования: [codebox] для длинного кода, [code] - для короткого

Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 3 2015, 12:09
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 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; - "эротично" sm.gif Байт у нас 16 или же 8 бит? Если "это наш крокодил - как хотим так имеряем", то - нет возражений. sm.gif

Не подходит для записи в GRAM: на одну запись адреса регистра две записи данных, а надо - три.

Сообщение отредактировал IgorKossak - Mar 3 2015, 15:43
Причина редактирования: бездумное цитирование


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Mar 3 2015, 12:58
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



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

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

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

Сообщение отредактировал Грендайзер - Mar 3 2015, 13:00
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 3 2015, 13:35
Сообщение #7


Знающий
****

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



Цитата(Грендайзер @ 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]; так что по-любому сдвигать.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Mar 3 2015, 14:46
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



Цитата
Вообще имелось в виду другое: на входе uint32_t, байт был объявлен как uint16_t - винегрет.

Действительно, как это я не заметил... спасибо.
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Mar 4 2015, 07:32
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 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);    
                
    }
}
Уже чего только не перепробывал...
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Mar 4 2015, 08:05
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 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 работает не так, а импульсом.
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 4 2015, 08:26
Сообщение #11


Знающий
****

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



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


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

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

Сообщение отредактировал IgorKossak - Mar 4 2015, 11:22
Причина редактирования: избыточное цитирование


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Mar 4 2015, 08:44
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



DmitryM, не сумел сам толком разобраться. Большое Вам спасибо, теперь заработало. NRESET переодически сбрасывается из 1 в 0.
Цитата
Я извиняюсь, в datasheet надо всёже заглядывать

Obam, да, Вы правы. Смотрел, читал... но чё то как то хреново смотрел. Большое спасибо, впредь буду внимательней! blush.gif

Сообщение отредактировал Грендайзер - Mar 4 2015, 08:56
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 4 2015, 08:51
Сообщение #13


Знающий
****

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



Не томите уже, заводите ЖКИ


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Mar 5 2015, 09:52
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



Всё, я пас. Сделал всё как вот здесь написано http://meandr.org/archives/3719 результат - 0!
Не пойму, в чём косяк...
Испоьзовал ф-ции для управления LCD те, что приводятся в примере к плате в AtmelStudio, но я так понял, что если я изменю тактовую частоту проекта, то ничего работать не будет?
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 5 2015, 11:07
Сообщение #15


Знающий
****

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



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


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

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

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

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

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


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 11:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016