2440(920T)를 사용해 삼성3.5" TFT-LCD(LMS350DF01)를 Display 하려는데 변화가 없어 문의 드립니다.
일단 BackLight는 항상 On을 유지합니다.(On/Off제어를 안합니다. 항상 켜있어야 해서요..)
전원만 올리게 되면 LCD의 상태는 LCD뒷쪽에 BackLight가 들어오고 LCD전면 액정부분은 검게 표시됩니다.
표시 된다라기 보다는 꺼져있는것 처럼 보입니다.
DataSheet에 나온대로 SPI로 레지스터를 셋팅해도 아무런 변화가 없습니다. 너무 답답하기에 여쭐곳도 없어
도움 요청 드립니다. 아래는 제가 작성한 코드입니다.
틀린 부분이 있거나 놓치고 있는 부분이 있다면 꼭~~ 조언부탁드리겠습니다.
void Init_Lcd( void )
{
CLcd_InitLcd();
CLcd_Init2440();
delay_ms(100);
LCD_PowerOn();
}
void CLcd_InitLcd( void )
{
delay_ms(10);
//LCD Reset(On)
ResetLCD(ENABLE); //Reset On
delay_ms(100);
ResetLCD(DISABLE); //Reset Off
}
/* Samsung 3.5" TFT-LCD Mode: LMS350DF01 */
/* Number of Pixel : 320(H) x 480(V) */
/* Interface: 24Bit RGB + SPI */
void CLcd_Init2440(void)
{
unsigned long clkval, dotclk, hfreq, vfreq;
//dotclk = vclk = 9797760Hz about 9.8Mhz
dotclk = f_freq * (LCD_HEIGHT+ VBPD + VFPD) * (LCD_WIDTH+ HBPD + HFPD);
clkval = (((HCLK / dotclk) / 2) - 1) & 0x3ff;
hfreq = dotclk / (LCD_WIDTH + HBPD + HFPD); //29.16Khz
vfreq = hfreq / (LCD_HEIGHT + VBPD + VFPD); //60hz
rLCDCON1 = (clkval << 8) |LC1_VM_MODE | LC1_TFT_LCD | LC1_BPP_TFT_24 | LC1_ENVID;
rLCDCON2 = LC2_VBPD | LC2_LINEVAL | LC2_VFPD | LC2_VSPW;
rLCDCON3 = LC3_HBPD | LC3_HOZVAL | LC3_HFPD;
rLCDCON4 = LC4_MVAL | LC4_HSPW;
rLCDCON5 = LC5_BPP24BL_LSB | LC5_INVVCLK | LC5_INVVLINE | LC5_INVVFRAME | LC5_INVVD | LC5_PWREN | LC5_BSWP | LC5_HWSWP;
rLCDSADDR1 = (((U32)LCDFRAMEBUFFER >> 22) << 21) | M21D((U32)LCDFRAMEBUFFER >> 1);
rLCDSADDR2 = (M21D(LCDFRAMEBUFFER >> 1)) + (PAGE_WIDTH + OFFSET) * (LCD_LINEVAL + 1);
rLCDSADDR3 = (OFFSET << 11) | (PAGE_WIDTH);
rLCDINTMSK |= (3); //Mask LCD Sub Interrupt
rTCONSEL &= (~7); //Disable LPC3600
rTPAL = 0; //Disable Temp Palette
rLCDCON1 |= 1; //ENVID ON(Enable LCD Out)
}
#define FRAME_CYCLE_TIME 25
void LCD_PowerOn(void)
{
delay_ms(5);
//Power on Sequence
spi_write(0x07, 0x0000); //RESET
delay_ms(12);
spi_write(0x11, 0x333f);
spi_write(0x12, 0x0f00);
spi_write(0x13, 0x7fe2);
spi_write(0x10, 0x460c);
delay_ms(FRAME_CYCLE_TIME*6);
spi_write(0x12, 0x1663);
delay_ms(FRAME_CYCLE_TIME*5);
spi_write(0x01, 0x0b3b);
spi_write(0x02, 0x0300);
spi_write(0x03, 0xc040);
spi_write(0x08, 0x0004);
spi_write(0x09, 0x0008);
spi_write(0x76, 0x2213);
spi_write(0x0b, 0x33e0);
spi_write(0x0c, 0x0020);
spi_write(0x76, 0x0000);
spi_write(0x0d, 0x0007);
spi_write(0x0e, 0x0500);
spi_write(0x14, 0x0000);
spi_write(0x15, 0x0803);
spi_write(0x16, 0x0000);
spi_write(0x30, 0x0005);
spi_write(0x31, 0x0300);
spi_write(0x32, 0x0300);
spi_write(0x33, 0x0003);
spi_write(0x34, 0x090c);
spi_write(0x35, 0x0505);
spi_write(0x36, 0x0001);
spi_write(0x37, 0x0303);
spi_write(0x38, 0x0f09);
spi_write(0x39, 0x0101);
delay_ms(1);
//Display On Sequence
spi_write(0x07, 0x0001);
delay_ms(FRAME_CYCLE_TIME*2);
spi_write(0x07, 0x0101);
delay_ms(FRAME_CYCLE_TIME*3);
spi_write(0x76, 0x2213);
spi_write(0x1c, 0x7770);
spi_write(0x0b, 0x33e1);
spi_write(0x76, 0x0000);
spi_write(0x07, 0x0103);
}
#define Index 0x74
#define Instruction 0x76
void spi_write(U8 address, U16 data)
{
U8 msb_data, lsb_data;
U8 msb_add, lsb_add;
msb_data = (U8)(data >> 8);
lsb_data = (U8)(data & 0xff);
msb_add = 0x00;
lsb_add = address;
rSPPRE1=0x5; // PCLK=31.5Mhz, SPICLK=2.625Mhz
rSPPIN1=(0<<2)|(1<<1)|(0<<0); //Dis-ENMUL,SBO,Release
rSPCON1=(0<<5)|(1<<4)|(1<<3)|(0<<2)|(0<<1)|(0<<0); //Polling,En-SCK,Master,High,A,Normal
/* Index Data RS='0' */
ControlLCD(ENABLE);
while(!(rSPSTA1 & 0x1)); //Check TX Ready State
rSPTDAT1 = Index;
while(!(rSPSTA1 & 0x1)); //Check Tx Ready State
rSPTDAT1 = msb_add;
while(!(rSPSTA1 & 0x1)); //Check Tx Ready State
rSPTDAT1 = lsb_add;
while(!(rSPSTA1 & 0x01)); //Check Tx Ready State
ControlLCD(DISABLE);
/* Instruction Data RS='1' */
ControlLCD(ENABLE);
while(!(rSPSTA1 & 0x1)); //Check Tx Ready State
rSPTDAT1 = Instruction;
while(!(rSPSTA1 & 0x1)); //Check Tx Ready State
rSPTDAT1 = msb_data;
while(!(rSPSTA1 & 0x1)); //Check Tx Ready State
rSPTDAT1 = lsb_data;
while(!(rSPSTA1 & 0x01)); //Check Tx Ready State
ControlLCD(DISABLE);
rSPCON1&=~(1<<4); //disable SCK
}