Warning: touch() [function.touch]: Unable to create file /home/starterkit/starterkit.ru/html/error.log because Permission denied in /home/starterkit/starterkit.ru/html/errorhandler.php on line 51
SAM9G45 проблема с LCD - ARM - Форум - starterkit.ru
Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » ARM
SAM9G45 проблема с LCD
RattleSnake
Добавлено 28.04.2012 14:59
0
Сообщение: 1
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Есть у меня плата SK-9g45-oem и дисплей Nec NL10260BC19

Пишу программу на С (компилятор IAR).
Дошел до стадии инициализации дисплея.
Вроде бы запустил, однако есть маленькая проблема - дисплей сдвинут вправо на 8 пикселей. Не могу понять, куда копать.

Вот код инициализации:
Цитата

void configure_lcd(void)
{
// Enable peripheral clock
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_LCDC;

AT91C_BASE_LCDC->LCDC_LCDCON1 = 1 << 12; //LCDOTCLK is 50 MHz
AT91C_BASE_LCDC->LCDC_LCDCON2 = AT91C_LCDC_DISTYPE_TFT | AT91C_LCDC_SCANMOD_SINGLESCAN |
AT91C_LCDC_IFWIDTH_SIXTEENBITSWIDTH | AT91C_LCDC_PIXELSIZE_SIXTEENBITSPERPIXEL |
AT91C_LCDC_INVVD_NORMALPOL | AT91C_LCDC_INVFRAME_INVERTEDPOL |
AT91C_LCDC_INVLINE_INVERTEDPOL | AT91C_LCDC_INVCLK_NORMALPOL |
AT91C_LCDC_INVDVAL_NORMALPOL | AT91C_LCDC_CLKMOD_ALWAYSACTIVE |
AT91C_LCDC_MEMOR_LITTLEIND;

AT91C_BASE_LCDC->LCDC_TIM1 = (0 << 0) | (25 << 8) | (1 << 16) | (0 << 24) | (0<<31); // vfp,vbp,vpw,vhdly
AT91C_BASE_LCDC->LCDC_TIM2 = (0 << 0) | (0 << 8) | (215 << 21); // hbp,hpw,hfp
AT91C_BASE_LCDC->LCDC_LCDFRCFG = (599 << 0) | (1023 << 21); // 1024x600
AT91C_BASE_LCDC->LCDC_FIFO = 501;
AT91C_BASE_LCDC->LCDC_BA1 = (unsigned int)lcdbuffer; // Display buffer adress
AT91C_BASE_LCDC->LCDC_FRMCFG = (307200 << 0) | (3 << 24); // Size 307200 burst 4 words
AT91C_BASE_LCDC->LCDC_DMACON = AT91C_LCDC_DMAEN;
AT91C_BASE_LCDC->LCDC_PWRCON = AT91C_LCDC_PWR;
}


Хочу сразу сказать, что дисплей не реагирует на сигналы Hsync и Vsync, их там нет в принципе, он работает только лишь с DE сигналом.

Подскажите, в каком направлении мне дальше двигаться?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 28.04.2012 15:31 Сообщение: 2
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Код
AT91C_BASE_LCDC->LCDC_TIM2 = (0 << 0) | (0 << 8) | (215 << 21); // hbp,hpw,hfp

мне почему-то не нравятся нули вот тут, хоть у вас и de-only режим..
если у вас самописное и есть консольная отладка, то проще и быстрее найти правильные цифры - это в онлайне покрутить регистры LCDC и контролировать по изображению на экране..

и еще - по TIM1, в доке написано
• VHDLY: Vertical to horizontal delay
In TFT mode, this is the delay between LCDVSYNC rising or falling edge and LCDHSYNC rising edge. Delay is
(VHDLY+1) LCDDOTCK cycles. Bit 31 must be written to 1.

в моей трактовке, у вас пишется 0 (могу ошибаться)..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
RattleSnake
Добавлено 28.04.2012 16:15 Сообщение: 3
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Цитата

в моей трактовке, у вас пишется 0 (могу ошибаться)..


Спасибо, я что то по запарке и сам не заметил...
Однако 1 никаких изменений не дала
Попробую через консоль попробовать покрутить цифры
Спуститься к концу Подняться к началу
Персональная информация
RattleSnake
Добавлено 28.04.2012 16:25 Сообщение: 4
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Нашел в errata на SAM9261 - несколько причин:

1.
The LCD DMA burst size in 32-bit words is programmed by BRSTLN field in DMAFRMCFG
register.
The LCD DMA Base Address is programmed in DMABADDR1 register.
The LCD DMA Base Address must be programmed with a value aligned onto LCD DMA burst
size, e.g.:

BRSTLN = 15
For a 16-word burst, the LCD DMA Base Address must start on a 16-word offset: 0x0, 0x40,
0x80 or 0xc0.
BRSTLN = 3
For a 4-word burst, the LCD DMA Base Address offset must start on a 4-word offset: 0x0, 0x10,
..., 0xf0.

То есть как я понял, необходимо адрес выровнять по необходимому размеру DMA Burst.
Но он у меня вроде бы совпадает...

2. неправильный сброс буфера
When a FIFO underflow occurs, a reset of the LCD DMA and FIFO pointers is necessary.
If only LCD DMA pointers are reset (FIFO pointers not reset), the displayed image is shifted.
Problem Fix/Workaround
Apply the following sequence to correctly reset LCD DMA and FIFO pointers:
• LCD power off
• DMA disable
• Wait for DMABUSY
• DMA reset
• LCD power on
• DMA enable.
Powering LCD off, then powering LCD on, resets the FIFO pointers.
Disabling DMA, then enabling DMA, resets the DMA pointers.

Буду пробовать, отпишусь о результатах...
Спуститься к концу Подняться к началу
Персональная информация
RattleSnake
Добавлено 02.05.2012 09:49 Сообщение: 5
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Цитата
Нашел в errata на SAM9261 - несколько причин:

Буду пробовать, отпишусь о результатах...


Оказалось, что проблема именно в неправильном сбросе буфера. Странно, что в еррате на SAM9G45 об этом ничего не пишут...
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 02.05.2012 11:40 Редактировалось 02.05.2012 11:47 Сообщение: 6
sasamy
4.70

Пункты: 76182
Регистрация: 14.08.2009
Цитата

Оказалось, что проблема именно в неправильном сбросе буфера. Странно, что в еррате на SAM9G45 об этом ничего не пишут...


Интересно, почему вы считаете что в атмеловской эррате должно быть написано о том что вы неправильно инициализируете lcd и dma :) у атмела есть огромная библиотека с примерами для всей периферии - думаю есть смысл туда заглядывать, даташит все же не может содержать полную информацию.
Код

void InitializeLcd()
{
// Enable peripheral clock
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_LCDC;

#if defined(at91sam9g10)||defined(at91sam9261)
AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_HCK1;
#endif

// Disable the LCD and the DMA
LCD_DisableDma();
LCD_Disable(0);

// Configure the LCD controller
LCD_SetPixelClock(BOARD_MCK, BOARD_LCD_PIXELCLOCK);
.....
// Enable DMA and LCD
LCD_EnableDma();
LCD_Enable(0x0C);
}
Спуститься к концу Подняться к началу
Персональная информация
RattleSnake
Добавлено 03.05.2012 12:33 Сообщение: 7
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Цитата

Интересно, почему вы считаете что в атмеловской эррате должно быть написано о том что вы неправильно инициализируете lcd и dma :) у атмела есть огромная библиотека с примерами для всей периферии - думаю есть смысл туда заглядывать, даташит все же не может содержать полную информацию.


Ха, а кто же тогда должен содержать полную информацию, как не даташит? и почему на SAM9261 есть упоминание, а тут нет?:) Но это уже вопросы к АТМЕЛУ...

А атмеловской библиотекой я не воспользовался, потому как нашел там косяк с определением частоты LCDC контроллера, плюс еще покопал и решил писать сам.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » ARM