Рябит вместе с курсором. Картинка изначально была сдвинута влево вверх, чтоб стала посредине, значительно увеличил Vertical front porch и horizontal front porch(от значений, рекоммендуемых ДШ на ТФТ).
При некоторых стечениях обстоятельств)) (положение курсора, данные тестовой картинки) ТФТ вообще отказывается что-либо показывать... (Белый фон, как до инициализации).
Смотрел сигналы осциллографом - форма верт. и гор синхронизаций нормальная, синхр. данных (DCLK) - почти синус. Это нормально?
Еще интересная особенность - значения LCD_POL(IPC Invert panel clock., IHS Invert horizontal synchronization., IVS Invert vertical synchronization.) в в нескольких комбинациях на картинку не влияют.
Подскажите плз в какую вообще сторону думать? )
На всякий случай код с парой тестов и картинку с ДШ ТФТ прилагаю.
Код
#define LCD_RES_H 320
#define LCD_RES_V 240
#define LCD_BUF_SIZE (LCD_RES_H*LCD_RES_V*2)
unsigned char VideoBuf[LCD_BUF_SIZE] __attribute__((at(NOR_FLASH_BASE))); //SDRAM
void InitLCD()
{
int i, testnum = 0;
int k=0;
unsigned short *Pall = (unsigned short *)&LCD_PAL;
unsigned short *Vbuf = (unsigned short *)&VideoBuf;
unsigned short *Curs = (unsigned short *)&CRSR_IMG;
PCONP|= (1<<20); //LCD
PINSEL11 = (6<<1)|(1<<0);// bit0=1 - LCD port is enabled. bit1...3 = 110 TFT 16-bit. (1:5:5:5 mode)
LCD_CFG = 10;//72 MHz div 11
//1
// LCD_TIMH = (((42-1)<<24) | ((67-1)<<16) | ((11-1)<<8) | (((LCD_RES_H/16)-1)<<2));
// LCD_TIMV = ((6<<24) | (16<<16) | ((3-1)<<10) | (LCD_RES_V-1));
//2
//LCD_TIMH = (((31-1)<<24) | ((67-1)<<16) | ((11-1)<<8) | (((LCD_RES_H/16)-1)<<2));
//LCD_TIMV = ((3<<24) | (16<<16) | ((3-1)<<10) | (LCD_RES_V-1));
//kartinka posredine
LCD_TIMH = (((61-1)<<24) | ((67-1)<<16) | ((11-1)<<8) | (((LCD_RES_H/16)-1)<<2));
LCD_TIMV = ((33<<24) | (16<<16) | ((3-1)<<10) | (LCD_RES_V-1));
LCD_POL = ((0<<27) | (1<<26) | (((LCD_RES_H/1)-1)<<16) | (0<<14)
| (1<<13)| (1<<12) | (1<<11)| (0<<6) | (0<<5) | (2<<0));
LCD_CTRL = ((0<<10) | (0<<9) | (0<<8) | (1<<5) | (4<<1)); // 100 = 16 bpp, 1:5:5:5 mode.
for(i=0; i<256; i++)
Curs[i] = 0xFFFF;
CRSR_CFG = 0;
CRSR_XY = (110<<16)|(160<<0);
CRSR_CTRL = 1;//Cursor on
LCD_UPBASE = (unsigned long)VideoBuf;
LCD_LPBASE = (unsigned long)VideoBuf;
for(i=0; i<256; i++)//test
{
Pall[i] = 0xFF00+i;
}
LCD_CTRL |= 1;//Enable
LCD_CTRL |= 1<<11;//PWR ON
testnum = 3;
while(1)
{
switch(testnum)
{
case 0://bleklie tsveta
for(i=0; i<(LCD_BUF_SIZE/2); i++)
if(i < (LCD_BUF_SIZE/4))
Vbuf[i]= (32<<10)|(0<<5)|(0<<0);
else
Vbuf[i]= (0<<10)|(0<<5)|(32<<0);
testnum = -1;
break;
case 1://ne vivodit - vse beloe
for(i=0; i<(LCD_BUF_SIZE/2); i++)
if(i < (LCD_BUF_SIZE/4))
Vbuf[i]= 0;
else
Vbuf[i]= 0xFFFF;
testnum = -1;
break;
case 2://sverhu beloe, vnizu-4ernoe
for(i=0; i<(LCD_BUF_SIZE/2); i++)
if(i < (LCD_BUF_SIZE/4))
Vbuf[i]= 0xFFFF;
else
Vbuf[i]= 0;
testnum = -1;
break;
case 3://poloski
for(i=0; i<(LCD_BUF_SIZE/2); i++)
{
if((i % (320*20)) == 0)
k = rand();
Vbuf[i]= k;
}
testnum = -1;
break;
case 4://random
for(i=0; i<(LCD_BUF_SIZE/2); i++)
Vbuf[i]= rand() & 0xFFFF;
testnum = -1;
break;
default:
break;
}
}
}
#define LCD_RES_V 240
#define LCD_BUF_SIZE (LCD_RES_H*LCD_RES_V*2)
unsigned char VideoBuf[LCD_BUF_SIZE] __attribute__((at(NOR_FLASH_BASE))); //SDRAM
void InitLCD()
{
int i, testnum = 0;
int k=0;
unsigned short *Pall = (unsigned short *)&LCD_PAL;
unsigned short *Vbuf = (unsigned short *)&VideoBuf;
unsigned short *Curs = (unsigned short *)&CRSR_IMG;
PCONP|= (1<<20); //LCD
PINSEL11 = (6<<1)|(1<<0);// bit0=1 - LCD port is enabled. bit1...3 = 110 TFT 16-bit. (1:5:5:5 mode)
LCD_CFG = 10;//72 MHz div 11
//1
// LCD_TIMH = (((42-1)<<24) | ((67-1)<<16) | ((11-1)<<8) | (((LCD_RES_H/16)-1)<<2));
// LCD_TIMV = ((6<<24) | (16<<16) | ((3-1)<<10) | (LCD_RES_V-1));
//2
//LCD_TIMH = (((31-1)<<24) | ((67-1)<<16) | ((11-1)<<8) | (((LCD_RES_H/16)-1)<<2));
//LCD_TIMV = ((3<<24) | (16<<16) | ((3-1)<<10) | (LCD_RES_V-1));
//kartinka posredine
LCD_TIMH = (((61-1)<<24) | ((67-1)<<16) | ((11-1)<<8) | (((LCD_RES_H/16)-1)<<2));
LCD_TIMV = ((33<<24) | (16<<16) | ((3-1)<<10) | (LCD_RES_V-1));
LCD_POL = ((0<<27) | (1<<26) | (((LCD_RES_H/1)-1)<<16) | (0<<14)
| (1<<13)| (1<<12) | (1<<11)| (0<<6) | (0<<5) | (2<<0));
LCD_CTRL = ((0<<10) | (0<<9) | (0<<8) | (1<<5) | (4<<1)); // 100 = 16 bpp, 1:5:5:5 mode.
for(i=0; i<256; i++)
Curs[i] = 0xFFFF;
CRSR_CFG = 0;
CRSR_XY = (110<<16)|(160<<0);
CRSR_CTRL = 1;//Cursor on
LCD_UPBASE = (unsigned long)VideoBuf;
LCD_LPBASE = (unsigned long)VideoBuf;
for(i=0; i<256; i++)//test
{
Pall[i] = 0xFF00+i;
}
LCD_CTRL |= 1;//Enable
LCD_CTRL |= 1<<11;//PWR ON
testnum = 3;
while(1)
{
switch(testnum)
{
case 0://bleklie tsveta
for(i=0; i<(LCD_BUF_SIZE/2); i++)
if(i < (LCD_BUF_SIZE/4))
Vbuf[i]= (32<<10)|(0<<5)|(0<<0);
else
Vbuf[i]= (0<<10)|(0<<5)|(32<<0);
testnum = -1;
break;
case 1://ne vivodit - vse beloe
for(i=0; i<(LCD_BUF_SIZE/2); i++)
if(i < (LCD_BUF_SIZE/4))
Vbuf[i]= 0;
else
Vbuf[i]= 0xFFFF;
testnum = -1;
break;
case 2://sverhu beloe, vnizu-4ernoe
for(i=0; i<(LCD_BUF_SIZE/2); i++)
if(i < (LCD_BUF_SIZE/4))
Vbuf[i]= 0xFFFF;
else
Vbuf[i]= 0;
testnum = -1;
break;
case 3://poloski
for(i=0; i<(LCD_BUF_SIZE/2); i++)
{
if((i % (320*20)) == 0)
k = rand();
Vbuf[i]= k;
}
testnum = -1;
break;
case 4://random
for(i=0; i<(LCD_BUF_SIZE/2); i++)
Vbuf[i]= rand() & 0xFFFF;
testnum = -1;
break;
default:
break;
}
}
}
Нажмите для просмотра прикрепленного файла