Перейти к содержанию
    

Здравствуйте, всем доброго времени суток. Относительно недавно начал разбираться с 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 пока ответа не даёт. Заранее спасибо за помощь.

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

однако у меня на плате, нога nRESET соединена с ногой nRESET контроллера... Данная микросхема может управлять своей ножкой nRESET или как тогда дисплей инициализировать?

 

nRESET bi-directional.

RSTC->RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Это есть?

 

Вообще-то в 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 мешанина из разноцветных пикселей.

Это есть?

Мешанины к сожалению нет :( Зато появляется некая "тельняшка". На экране проявляется полоска белых пикселей, затем чёрная, затем опять белая и т.д.

На фотографиях до и после (извините за качество, телефон старый, с кнопками)

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

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

post-64451-1425379071_thumb.jpg

post-64451-1425379192_thumb.jpg

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фигня это. Дисплей не проинициализирован.

Кстати, 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
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

byteL = reg_data;

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

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

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

Ясно! Воощем план действий такой:

1) Научиться дрыгать ногой nRESET для нормальной инициализации дисплея;

2) Написать ф-цию, которая записывала бы данные о цвете пикселей "тройками" в регистр 0x22.

Ну что ж попробуем!

Изменено пользователем Грендайзер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это моё изобретение, я им горжусь B) Но вообще не представляю, как записать сначала 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);    
                
    }
}
Уже чего только не перепробывал...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Снова здравствуйте. Никак не пойму, что там этому кортексу надо. Уже всё перепробывал, но нога ресет никак в 0 не сбрасывается. Написал вот такую программку:

 

Этого достаточно:

RSTC -> RSTC_CR = (RSTC_CR_KEY_PASSWD | RSTC_CR_EXTRST);

 

После записи в RSTC_CR, вывод nRST будет выставлен в 0 длительностью 2^(ERSTL+1) Slow Clock cycles, потом вернется в 1. Если Вы ожидаете постоянный 0, то RSTC работает не так, а импульсом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Снова здравствуйте. Никак не пойму, что там этому кортексу надо. Уже всё перепробывал, но нога ресет никак в 0 не сбрасывается. Написал вот такую программку:...

 

Вот не поверите, но кортекс совершенно не при делах :)

 

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

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

и на чтение).

Изменено пользователем IgorKossak
избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Я извиняюсь, в datasheet надо всёже заглядывать

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

Изменено пользователем Грендайзер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё, я пас. Сделал всё как вот здесь написано http://meandr.org/archives/3719 результат - 0!

Не пойму, в чём косяк...

Испоьзовал ф-ции для управления LCD те, что приводятся в примере к плате в AtmelStudio, но я так понял, что если я изменю тактовую частоту проекта, то ничего работать не будет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё, я пас. Сделал всё как вот здесь написано http://meandr.org/archives/3719 результат - 0!

Не пойму, в чём косяк...

Испоьзовал ф-ции для управления LCD те, что приводятся в примере к плате в AtmelStudio, но я так понял, что если я изменю тактовую частоту проекта, то ничего работать не будет?

 

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

 

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

Вы обратили внимание сколько разных вариантов шлейфов и цоколёвок существует?

 

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

Дисплей исправен?

 

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

 

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...