Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Управление ЖКИ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Anatoly_P
привет всем! Люди добрые помогите кто чем может. Есть ЖКИ с контроллером SPDF5408. В даташите контроллера нашел таблицу кода инициализации, запрограммировал, В результате после инициализации на экране появляется шум. Вроде значить система работает ( были подозрения, что сжег). Но никак не могу точку или последовательность точек вывести. Загоняю данные в память ЖКИ через регистр R22h, а этот гребанный ЖКИ нифига не отображает. Уже третий день на месте стою, может кто подскажет куда копать.
ARM LPC2468. Плату под него сами разрабатывали.
Liderr
Цитата(Anatoly_P @ Jun 5 2008, 14:07) *
привет всем! Люди добрые помогите кто чем может. Есть ЖКИ с контроллером SPDF5408. В даташите контроллера нашел таблицу кода инициализации, запрограммировал, В результате после инициализации на экране появляется шум. Вроде значить система работает ( были подозрения, что сжег). Но никак не могу точку или последовательность точек вывести. Загоняю данные в память ЖКИ через регистр R22h, а этот гребанный ЖКИ нифига не отображает. Уже третий день на месте стою, может кто подскажет куда копать.
ARM LPC2468. Плату под него сами разрабатывали.


Приветствую, Коллега! wink.gif
Сейчас разбираюсь с дисплеем от сотового телефона NOKIA N95 с тач панелью, в котором также используется контроллер SPDF5408. Нашёл ли ты какую либо информацию, решил ли проблемы с инициальзацией и выводом информации, какие подводные камни? Заранее спасибо!
rezident
Liderr, обращаю ваше внимание, что Anatoly_P разместил свое сообщение больше года назад. Но за это время на него не было ни одного ответа. Так что с вашей стороны наивно надеяться, что он увидит свой пост годовой давности от что-то ответит вам здесь. Тем более, что, судя по информации в профиле, он не посещал форума уже четыре месяца. Надежнее было бы написать ему мылом.
at90
Liderr, а экран от оригинальной N95 или от китайской... откуда инфа что в экране именно SPDF5408
Anatrulij
Здраствуйте. Щас разбираюсь с понелью G057QN01 V0. инфы в инете - ноль. подключил его к LPC2478, а что с ним дальше делать не знаю. может кто работал. подскажите.
kovz
Цитата(Anatrulij @ Jan 28 2009, 10:49) *
Здраствуйте. Щас разбираюсь с понелью G057QN01 V0. инфы в инете - ноль. подключил его к LPC2478, а что с ним дальше делать не знаю. может кто работал. подскажите.

в инете инфа есть http://www.google.com/url?sa=t&source=...EOpfuGqyoIFeM8A
там и распиновка и временные диаграмы, если и это не поможет - тогда нужно начинать с другого.
Anatrulij
Цитата(kovz @ Jan 28 2009, 12:12) *
в инете инфа есть http://www.google.com/url?sa=t&source=...EOpfuGqyoIFeM8A
там и распиновка и временные диаграмы, если и это не поможет - тогда нужно начинать с другого.


Я читал этот документ - он очень бедный. Меня интересует как програмно с ним работать. Может примерчик есть?
kovz
Цитата(Anatrulij @ Jan 28 2009, 11:35) *
Я читал этот документ - он очень бедный. Меня интересует как програмно с ним работать. Может примерчик есть?

нет примерчика нет, но в чём проблема не пойму cranky.gif
Или вы спрашиваете как вывести картинку на данный дисплей?
Тогда курить как работает LCD коноллер в 2478. В двух словах пишете образ картинки в RAM и потом говорите контроллеру(LCD) где вы его записали, а он сам это всё отправит на экран
Anatrulij
Цитата(kovz @ Jan 28 2009, 12:41) *
нет примерчика нет, но в чём проблема не пойму cranky.gif
Или вы спрашиваете как вывести картинку на данный дисплей?
Тогда курить как работает LCD коноллер в 2478. В двух словах пишете образ картинки в RAM и потом говорите контроллеру(LCD) где вы его записали, а он сам это всё отправит на экран


Да, мне надо вывести что-то на экран. Если бы еще знать какой контроллер стоит в этом LCD(в документации ничего не сказано)
Ладненько, буду разбираться.
спасибки за ответ.
З.Ы. Если что нароете - обязательно скиньте laughing.gif
kovz
Цитата(Anatrulij @ Jan 28 2009, 11:58) *
Да, мне надо вывести что-то на экран. Если бы еще знать какой контроллер стоит в этом LCD(в документации ничего не сказано)
Ладненько, буду разбираться.
спасибки за ответ.
З.Ы. Если что нароете - обязательно скиньте laughing.gif

да в этом случае всёравно какой в LCD контроллер.
Я чуть позже объясню что к чему, сейчас немного занят.
Anatrulij
Цитата(kovz @ Jan 28 2009, 13:36) *
да в этом случае всёравно какой в LCD контроллер.
Я чуть позже объясню что к чему, сейчас немного занят.



Буду ждать
kovz
Цитата(Anatrulij @ Jan 28 2009, 13:16) *
Буду ждать

Давайте с начала. Я не знаю как у вас подключён экранчик, но правильно вот так :

LPC2478 G057QN01 назначение
LCDPWR | VDD(28,29)/NC | можно управлять транзистором для вкл/выкл экранчика
LCDDCLK | CLK(2) | тактование пикселей
LCDENA/LCDM | DE(27) | сигнал валидности данных
LCDFP | NC |
LCDLE | NC |
LCDLP | NC |
LCDVD[1:0] | NC |
LCDVD[2] | RED[0](6) | бит интенсивности общий для всех цветов бует одинаков
LCDVD[3:7] | RED[1:5](7-11) | данные красного
LCDVD[8:9] | NC |
LCDVD[10] | GREEN[0](13) | бит интенсивности общий для всех цветов бует одинаков
LCDVD[11:15] | GREEN[1:5](14-18) | данные зелёного
LCDVD[16:17] | NC |
LCDVD[18] | BLUE[0](20) | бит интенсивности общий для всех цветов бует одинаков
LCDVD[19:23] | BLUE[1:4](21-25) | данные синего
LCDCLKIN | NC | можно использовать для внешнего тактования контроллера LCD в LPC2478



далее смотрим на табличку и временные диаграммы на странице 14 документа, ссылка на который выше.
мы видим что частота тактования пикселей должна лежать в пределах 6,2 - 12,1 Мгц, рекомендуют 6,4 Мгц это значение получаем путём настройки делителя в регистрах LCD_CFG и LCD_POL, там же выбираем источник тактования, и полярности сигналов.
Далее ключевой момент, у нас экранчик отображает 320 точек на линию, но после этих 320 точек ему нужно ещё минимум 86 максимум 240 тактов, перед тем как можно будет подавать следующие 320пикселей следующей линии.
Эти настройки задаются в регистре LCD_TIMH, но контроллер LCD в LPC2478 имеет одну особенность, в нём можно настроить не только сколько "холостых"(назавём их так) пикселей нужноподать после отображаеммых пикселей, а и до них(мин значение 1).
Так как нам рекомендуют подать 88 таких холостых тактов, делаем хитрость делим их количество на 2 и подаём 44 до и 44 после.
Значение LCD_TIMH получится:
31:24 HBP = 0x2B (44-1) количество холостых пикселей до данных
23:16 HFP = 0x2B (44-1) количество холостых пикселей после данных
15:8 HSW = 0x56(88) количество пикселей горизонтальной синхронизации
7:2 PPL = 0x140(320) количество пикселей данных
1:0 reserved
тоже самое нужно проделать с регистром LCD_TIMV
только вместо 88 холостых клоков пикселей, необходимо от 14 до 120 холостых линий, рекомендуют 23. значения в этом регистре уже не в пикселях а в линиях!
остальные регистры не вижу смысла описывать, там всё понятно из документации.
Есть только одна особенность регистр LCD_UPBASE должен быть инициализирован до включения LCD контроллера в LPC2478!
Он содержит адрес первой ячейки памяти, где хранится образ изображения, который вы хотите вывести на экран!

Если будут ещё вопросы, задавайте.
P.S. Исходников нет, и думаю гораздо важнее понимание как оно работает, нежели готовые чужие сырцы.
Anatrulij
Цитата(kovz @ Jan 29 2009, 12:44) *
Если будут ещё вопросы, задавайте.


ОГОООООО!!! я даже и не надеялся на такой ответ. Большое спасибо за такое "разжовывание" постараюсь теперь это все проглотить.

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

ещё раз БОЛЬШОЕ СПАСИБО!!!
Anatrulij
Цитата(kovz @ Jan 29 2009, 12:44) *
Если будут ещё вопросы, задавайте.
P.S. Исходников нет, и думаю гораздо важнее понимание как оно работает, нежели готовые чужие сырцы.


Ну вот, я сделал инициализацию LCD:

#include "LPC23xx.h" /* LPC23xx definitions */
#include "type.h"


#define BUFFER_ADDR 0xA0000000
unsigned short * Ptr;

void IniLCD()
{
DWORD i;

PCONP |= (1<<20);
PINSEL11 = ((5<<1));

PINSEL4 &= ~(3<<4);
PINSEL4 &= ~(3<<6);
PINSEL4 &= ~(3<<8);
PINSEL4 &= ~(3<<10);
PINSEL4 |= ((3<<4) | (3<<6) | (3<<8) | (3<<10));

PINSEL3 &= ~(3<<8);
PINSEL3 &= ~(3<<10);
PINSEL3 &= ~(3<<12);
PINSEL3 &= ~(3<<14);
PINSEL3 &= ~(3<<16);
PINSEL3 &= ~(3<<18);
PINSEL3 &= ~(3<<20);
PINSEL3 &= ~(3<<22);
PINSEL3 &= ~(3<<24);
PINSEL3 &= ~(3<<26);
PINSEL3 |= ( (1<<8) | (1<<10) | (1<<12) | (1<<14) | (1<<16) | (1<<18) | (1<<20) | (1<<22) | (1<<24) | (1<<26) );

PINSEL4 &= ~(3<<12);
PINSEL4 &= ~(3<<14);
PINSEL4 &= ~(3<<16);
PINSEL4 &= ~(3<<18);
PINSEL4 &= ~(3<<24);
PINSEL4 &= ~(3<<26);
PINSEL4 |= ((3<<12) | (3<<14) | (3<<16) | (3<<18) | (1<<24) | (1<<26));

LCD_CFG = 1;
LCD_TIMH = ( (0x2B<<24) | (0x2B<<16) | (0x56<<8) | (0x140<<2));
LCD_TIMV = ( (12<<24) | (12<<16) | (24<<10) | (239<<0) );
LCD_POL = ( (1<<26) | (((320/1)-1)<<16) | (1<<12) | (0<<5));

LCD_CTRL = ((1<<5) | (6<<1));
LCD_CTRL |= (1<<8);

LCD_UPBASE = BUFFER_ADDR;
LCD_LPBASE = BUFFER_ADDR;
for(i=0;i<50000;i++);

LCD_CTRL |= 1;
for(i=0;i<50000;i++);
LCD_CTRL |= 1<<11;
}

int main()
{
IniLCD();
???????
}


что делать дальше? как вывести точьку, или что-нибудь еще?

СПАСИБО ЗА ОТВЕТЫ!!!
kovz
Извини было много работы, некогда было отписаться.
Есть несколько вопросов:
1. Где настройка PLL, скорости памяти и тд.?(Надеюсь вынесено в low_level_init)
2. #define BUFFER_ADDR 0xA0000000 это хорошо, но как ты собираешся формировать там изображение. Тебе нужно выделить массив размером 240*320*2 байт, а точнее два таких массива. Пока из одного будет выводится картинка, ты во второй пишеш новую, а потом меняеш указатель из какого масива выводить.
3. Для чего задержки for(i=0;i<50000;i++);

А по поводу вывода на экран нет ничего проще! Отведите 307200(0x4B000) байт видеопамяти начая с адреса 0xA0000000 и разбейте на две части размером 320*240*2 байт, тоесть столько сколько необходимо на один экран. Далее используя Next base address update interrupt(введи в поиске по usermanual на LPC2478), подсовываеш ему то 0xA0000000, то 0xA0025800 в регистр LCD_UPBASE. А сам в это время в другой части буфера формируй изображение.

Если совсем просто, выведи статическую картинку, выдели в рам массив unsigned short LCD_Frame[76800] забей его чем нибуть осмысленным, и передай на вывод LCD контроллеру в LPC : LCD_UPBASE = &LCD_Frame[0];

Далее микроконтроллер сам выплюнет всё в экран.
Anatrulij
Цитата(kovz @ Feb 3 2009, 12:03) *
Извини было много работы, некогда было отписаться.
Есть несколько вопросов:
1. Где настройка PLL, скорости памяти и тд.?(Надеюсь вынесено в low_level_init)
2. #define BUFFER_ADDR 0xA0000000 это хорошо, но как ты собираешся формировать там изображение. Тебе нужно выделить массив размером 240*320*2 байт, а точнее два таких массива. Пока из одного будет выводится картинка, ты во второй пишеш новую, а потом меняеш указатель из какого масива выводить.
3. Для чего задержки for(i=0;i<50000;i++);


Я уже заждался. biggrin.gif .

По поводу заданных вопросов:
1. PLL не использую, настройка памяти есть(запись, чтение проходит успешно)
2. Для видеобуфера использую SRAM, начиная с адреса 0х80000000.
3. Часть кода брал из другого источника, который сам уже и коректировал, там и была данная задержка. Если она не нужна, то я уберу?

Как выводить изображение вроде разобрался, но проблема в настройках развертки - выводит не то что хотелось бы.

Цитата(kovz @ Feb 3 2009, 12:03) *
7:2 PPL = 0x140(320) количество пикселей данных

В ДШ к контроллеру (как я понял) написано, что (320/16)-1 = 19

Так что я щас мучаюсь с настройкой LCD_TIMH, LCD_TIMV.
Если будут советы, то с удовольствием выслушаю biggrin.gif
kovz
Цитата(Anatrulij @ Feb 3 2009, 19:48) *
Как выводить изображение вроде разобрался, но проблема в настройках развертки - выводит не то что хотелось бы.


В ДШ к контроллеру (как я понял) написано, что (320/16)-1 = 19

Так что я щас мучаюсь с настройкой LCD_TIMH, LCD_TIMV.
Если будут советы, то с удовольствием выслушаю biggrin.gif

Опиши что выводит и что хочется. В чём именно проблема синхронизации? и по поводу установки количества точек в линии ты прав, я не досмотрел.
Anatrulij
Цитата(kovz @ Feb 4 2009, 17:00) *
Опиши что выводит и что хочется. В чём именно проблема синхронизации? и по поводу установки количества точек в линии ты прав, я не досмотрел.


Уже выводит куда я хочу. НО!!! Я вывожу белый квадратик на черном фоне в центре экрана, а выводит светло желтый квадратик на феолетовом.
в чем может быть причина такого безобразия. Люди говорят, что дело в настройках LCD_TIMH, LCD_TIMV. Значение данных регистров я изменяю, а реакции ноль.
kovz
Цитата(Anatrulij @ Feb 5 2009, 08:07) *
Уже выводит куда я хочу. НО!!! Я вывожу белый квадратик на черном фоне в центре экрана, а выводит светло желтый квадратик на феолетовом.
в чем может быть причина такого безобразия. Люди говорят, что дело в настройках LCD_TIMH, LCD_TIMV. Значение данных регистров я изменяю, а реакции ноль.

Тут не подскажу, но мне кажеться копать нужно в направлении представлений цветов
поиграйся в регистре LCD_CTRL с настройками битов LcdBpp(3:1).
LCD_CTRL = ((1<<5) | (6<<1)); в этой строке замени 6 на 4
Anatrulij
Цитата(kovz @ Feb 5 2009, 17:18) *
Тут не подскажу, но мне кажеться копать нужно в направлении представлений цветов
поиграйся в регистре LCD_CTRL с настройками битов LcdBpp(3:1).
LCD_CTRL = ((1<<5) | (6<<1)); в этой строке замени 6 на 4


Да, дело в настройках цвета. буду копать дальше.
СПАСИБО за ответы
Wano
Цитата(Anatrulij @ Feb 5 2009, 16:44) *
Да, дело в настройках цвета. буду копать дальше.
СПАСИБО за ответы

По поводу цвета нужно ещё смотреть какой режим включен 8 или 16 бит на цвет. Если 8 бит то нужно заполнять палитру в 256 цветов, порядковый номер из памяти будет переводиться в цвет автоматом согласно палитре.
Jurdens
Цитата(kovz @ Feb 3 2009, 12:03) *
Извини было много работы, некогда было отписаться.
Есть несколько вопросов:
1. Где настройка PLL, скорости памяти и тд.?(Надеюсь вынесено в low_level_init)
2. #define BUFFER_ADDR 0xA0000000 это хорошо, но как ты собираешся формировать там изображение. Тебе нужно выделить массив размером 240*320*2 байт, а точнее два таких массива. Пока из одного будет выводится картинка, ты во второй пишеш новую, а потом меняеш указатель из какого масива выводить.
3. Для чего задержки for(i=0;i<50000;i++);

А по поводу вывода на экран нет ничего проще! Отведите 307200(0x4B000) байт видеопамяти начая с адреса 0xA0000000 и разбейте на две части размером 320*240*2 байт, тоесть столько сколько необходимо на один экран. Далее используя Next base address update interrupt(введи в поиске по usermanual на LPC2478), подсовываеш ему то 0xA0000000, то 0xA0025800 в регистр LCD_UPBASE. А сам в это время в другой части буфера формируй изображение.

Если совсем просто, выведи статическую картинку, выдели в рам массив unsigned short LCD_Frame[76800] забей его чем нибуть осмысленным, и передай на вывод LCD контроллеру в LPC : LCD_UPBASE = &LCD_Frame[0];

Далее микроконтроллер сам выплюнет всё в экран.



А можно ли использовать LCD_LPBASE в режиме TFT ?Установив LCD_CTRL_bit.LcdDual=1;
для автоматического переключения страниц?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.