0x9300 ID si hangi TFT sürücüye ait ?

Başlatan AsHeS, 26 Mayıs 2014, 22:50:16

AsHeS

Aşağıda ki kodlar ile STM32F107 ile TFT sürmeye çalışıyorum fakat ID olarak 0x9300 dönüyor. ILI9320 ve ILI9325 in ID si bunlara uymuyor. Dolayısı ile LCD'yi init edemiyorum. Kullandığım Init kodları ve test kodu aşağıda

Init Kodları
void ll_tft_setup(){
/* Configure the LCD pins config --------------------------------------------*/
	    hw_tft_gpio_config();

	    delay_ms(50); /* Delay 50 ms */
	    ll_tft_write_register(0x0000,0x0001);          //start internal osc
	    delay_ms(50); /* Delay 50 ms */
	    tft_device_id_code = ll_tft_read_register(0x0000);//İlk okumada 0 veya 3 gibi saçma bir değer döndürüyor
	    tft_device_id_code = ll_tft_read_register(0x0000);

	    delay_ms(50); /* Delay 50 ms */            //start internal osc

            if(tft_device_id_code==0x9320||tft_device_id_code==0x9300)
	    {
	        //LCD_DEBUG_PRINTF("\n\r This LCD is ili%x.", tft_device_id_code);
	      //  ll_tft_write_register(0x00e7,0x0010);
		ll_tft_write_register(0x00,0x0001);
	        ll_tft_write_register(0x01,0x0100);      //Driver Output Contral. 0x0100
	        ll_tft_read_register(0);
	        ll_tft_read_register(0);
	        ll_tft_write_register(0x02,0x0700);      //LCD Driver Waveform Contral.
	        ll_tft_write_register(0x03,0x1018);      //Entry Mode Set. 0x1018 0x1030

	        ll_tft_write_register(0x04,0x0000);      //Scalling Contral.
	        ll_tft_write_register(0x08,0x0202);      //Display Contral 2.(0x0207)
	        ll_tft_write_register(0x09,0x0000);      //Display Contral 3.(0x0000)
	        ll_tft_write_register(0x0a,0x0000);      //Frame Cycle Contal.(0x0000)
	        ll_tft_write_register(0x0c,(1<<0));      //Extern Display Interface Contral 1.(0x0000)
	        ll_tft_write_register(0x0d,0x0000);      //Frame Maker Position.
	        ll_tft_write_register(0x0f,0x0000);      //Extern Display Interface Contral 2.

	        delay_ms(250);
	        ll_tft_write_register(0x07,0x0101);      //Display Contral.
	        delay_ms(250);

	        ll_tft_write_register(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4));     //Power Control 1.(0x16b0)
	        ll_tft_write_register(0x11,0x0007);                                  //Power Control 2.(0x0001)
	        ll_tft_write_register(0x12,(1<<8)|(1<<4)|(0<<0));                    //Power Control 3.(0x0138)
	        ll_tft_write_register(0x13,0x0b00);                                  //Power Control 4.
	        ll_tft_write_register(0x29,0x0000);                                  //Power Control 7.
	        ll_tft_write_register(0x2b,(1<<14)|(1<<4));

	        ll_tft_write_register(0x50,0);           //Set X Start.
	        ll_tft_write_register(0x51,239);         //Set X End.
	        ll_tft_write_register(0x52,0);           //Set Y Start.
	        ll_tft_write_register(0x53,319);         //Set Y End.

	        ll_tft_write_register(0x60,0x2700);      //Driver Output Control.
	        ll_tft_write_register(0x61,0x0001);      //Driver Output Control.
	        ll_tft_write_register(0x6a,0x0000);      //Vertical Srcoll Control.

	        ll_tft_write_register(0x80,0x0000);      //Display Position? Partial Display 1.
	        ll_tft_write_register(0x81,0x0000);      //RAM Address Start? Partial Display 1.
	        ll_tft_write_register(0x82,0x0000);      //RAM Address End-Partial Display 1.
	        ll_tft_write_register(0x83,0x0000);      //Displsy Position? Partial Display 2.
	        ll_tft_write_register(0x84,0x0000);      //RAM Address Start? Partial Display 2.
	        ll_tft_write_register(0x85,0x0000);      //RAM Address End? Partial Display 2.

	        ll_tft_write_register(0x90,(0<<7)|(16<<0));    //Frame Cycle Contral.(0x0013)
	        ll_tft_write_register(0x92,0x0000);      //Panel Interface Contral 2.(0x0000)
	        ll_tft_write_register(0x93,0x0001);      //Panel Interface Contral 3.
	        ll_tft_write_register(0x95,0x0110);      //Frame Cycle Contral.(0x0110)
	        ll_tft_write_register(0x97,(0<<8));      //
	        ll_tft_write_register(0x98,0x0000);      //Frame Cycle Contral.
	        delay_ms(250);
	        ll_tft_write_register(0x07,0x0173);      //(0x0173)
	        delay_ms(250);
     }
LCD_Clear(LCD_COLOR_GREEN);


}


Kullandığım Fonksiyonların İçeriği
void ll_tft_write_register(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
	ll_tft_restore_pins();
	    /*Write Register Address*/
	    ClrCs
	    ClrRs
	    LCD_Write(LCD_Reg);
	    ClrWr
	    SetWr
	    SetRs
	    /**/
	    /*Write data to register*/
	    LCD_Write(LCD_RegValue);
	    ClrWr
	    SetWr
	    SetCs
};

uint16_t ll_tft_read_register(uint8_t LCD_Reg)
{
    uint16_t data;

    /*Make initial*/
    ll_tft_restore_pins();
    /*Write Register Address*/
    ClrCs
    ClrRs
    LCD_Write(LCD_Reg);
    ClrWr
    SetWr
    SetRs
    /**/
    hw_set_state_lcd_data_pins(TFT_PINS_STATE_INPUT);
    /*Read Register Data*/

    ClrRd
    SetRd
    data = LCD_Read();
    SetCs

    return data;

}

void LCD_Clear(uint16_t Color)
{
    uint32_t index = 0;

    LCD_SetCursor(0,0); 
    ll_tft_write_ram_prepare();


    ClrCs
    SetRs
    LCD_Write(Color);
    for(index=0; index<(LCD_PIXEL_WIDTH * LCD_PIXEL_HEIGHT); index++)
    {
	LCD_Write(Color);
	ClrWr
        SetWr
    }
    LCD_SetCursor(0,0);
    SetCs
}

void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
    if(tft_device_id_code==0x8989)
    {
        ll_tft_write_register(0x004e,Xpos);      //ĞĞ
        ll_tft_write_register(0x004f,Ypos);      //ÁĞ
    }
    else if((tft_device_id_code==0x9320))
    {
        ll_tft_write_register(0x0020,Xpos);      // ĞĞ
        ll_tft_write_register(0x0021,0x13f-Ypos);// ÁĞ
    }
    else if((tft_device_id_code==0x9919))
    {
        ll_tft_write_register(0x004e,Xpos);      // ĞĞ
        ll_tft_write_register(0x004f,Ypos);      // ÁĞ
    }
    else
    {
        ll_tft_write_register(0x0020,Xpos);      // ÁĞ
        ll_tft_write_register(0x0021,0x13f-Ypos);// ĞĞ
    }
}

void ll_tft_write_ram_prepare(void)
{
	ll_tft_restore_pins();
    /* Write 16-bit Index, then Write Reg */
    ClrCs
    ClrRs
    LCD_Write(LCD_REG_34);
    ClrWr
    SetWr
    SetRs
}



fgokcegoz

ILI9320 olması lazım.

if(tft_device_id_code==0x9320||tft_device_id_code==0x9300)


kontrolü yapıldığında 0x9300 sağlamış olması gerekiyor ve init edebilmen gerekiyor...
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

AsHeS

Alıntı yapılan: fgokcegoz - 26 Mayıs 2014, 23:33:43
ILI9320 olması lazım.

if(tft_device_id_code==0x9320||tft_device_id_code==0x9300)


kontrolü yapıldığında 0x9300 sağlamış olması gerekiyor ve init edebilmen gerekiyor...
Hocam kontrol de sıkıntı yok fakat ne ILI9320 nin ne de ILI9325'in datasheetinde böyle bir ID yok. Init kodları çalışıyor fakat LCD'de tık yok.

fgokcegoz

Belki problem init kodlarındadır. Farklı örnek kodlar deneme imkanın varsa deneyebilirsin... ST nin ILI9320 li geliştirme kitlerinin örnek kodlarına bakabilirsin mesela.
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

Burak B

"0x9300" ILI9320 klonu kontrolcülerde bulunabiliyor. Bu nedenle kullanılıyor.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

AsHeS

Alıntı yapılan: ByteMaster - 27 Mayıs 2014, 09:28:51
"0x9300" ILI9320 klonu kontrolcülerde bulunabiliyor. Bu nedenle kullanılıyor.
Hocam şöyle ilginç bir durum var mesela bir write işleminden sonra ID yi tekrar okumaya çalıştığımda ilki 0 dönüyor 2.si ID yi dönüyor
Şöyle ki
        ll_tft_write_register(0x0000,0x0001);          //start internal osc
        delay_ms(50); /* Delay 50 ms */
        tft_device_id_code = ll_tft_read_register(0x0000);//İlk okumada 0 veya 3 gibi saçma bir değer döndürüyor
        tft_device_id_code = ll_tft_read_register(0x0000);
       ll_tft_write_register(0x00,0x0001);
            ll_tft_write_register(0x01,0x0100);      //Driver Output Contral. 0x0100
            ll_tft_read_register(0);// Yine  0 dönüyor
            ll_tft_read_register(0);//0x9300 dönüyor.

Alt seviyede kullandığım fonksiyonları yukarıda verdim acaba onlarda mı hata var hocam  ?

AsHeS

Bu TFT'ye herhangi bir register ı ya da farklı bir yerine data yazıp onu okumak mümkün mü ?

Burak B

Alıntı yapılan: AsHeS - 27 Mayıs 2014, 21:07:02
Hocam şöyle ilginç bir durum var mesela bir write işleminden sonra ID yi tekrar okumaya çalıştığımda ilki 0 dönüyor 2.si ID yi dönüyor
Şöyle ki
        ll_tft_write_register(0x0000,0x0001);          //start internal osc
        delay_ms(50); /* Delay 50 ms */
        tft_device_id_code = ll_tft_read_register(0x0000);//İlk okumada 0 veya 3 gibi saçma bir değer döndürüyor
        tft_device_id_code = ll_tft_read_register(0x0000);
       ll_tft_write_register(0x00,0x0001);
            ll_tft_write_register(0x01,0x0100);      //Driver Output Contral. 0x0100
            ll_tft_read_register(0);// Yine  0 dönüyor
            ll_tft_read_register(0);//0x9300 dönüyor.

Alt seviyede kullandığım fonksiyonları yukarıda verdim acaba onlarda mı hata var hocam  ?

ILI9320 belgelerine iyi bakacak olursan veri okumada bir -dummy- yani anlamsız okuma gerektiğini görürsün. Bu tip kontrolcülerin çoğunda böyle bir durum söz konusudur. Bunun dışında bazı kontrolcüler özellikle yeni nesil kontrolcüler ID registerlarından fazladan bilgi verebiliyor. Ama senin durumunda buradaki sorun dummy okuma gibi görüyorum.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

AsHeS

Alıntı yapılan: ByteMaster - 28 Mayıs 2014, 09:58:11
ILI9320 belgelerine iyi bakacak olursan veri okumada bir -dummy- yani anlamsız okuma gerektiğini görürsün. Bu tip kontrolcülerin çoğunda böyle bir durum söz konusudur. Bunun dışında bazı kontrolcüler özellikle yeni nesil kontrolcüler ID registerlarından fazladan bilgi verebiliyor. Ama senin durumunda buradaki sorun dummy okuma gibi görüyorum.

Hocam registera okuma yazma yapabildiğimi teyit için önce CS-RS-RD-RW pinlerini lojik analizör ve debugger yardımıyla kontrol ettim pinlerin on-off  sıralamaları doğru, aşağıda ki fonksiyonla RAM'e yazmayı yazdığım veriyi okumayı denedim. Fakat 0x9303, 0x2703, 0x2503 gibi değerler alıyorum.

Debug için kullandığım fonksiyon ise şöyle
void ll_tft_debug_function()
{
	uint32_t i = 0,b;
	ll_tft_write_register(0x20, 0x0000);
	ll_tft_write_register(0x21, 0x0000);

	ClrCs
	ClrRs
	SetRd
	LCD_Write(0x0022);
	ClrWr
	SetWr
	SetRs

	for(;i<20000;i++)
	{
		LCD_Write(0x0100);//LCD_PORT_DAT -> ODR
		ClrWr
		SetWr
	};
	ll_tft_restore_pins();

	ll_tft_write_register(0x20, 0x0000);
	ll_tft_write_register(0x21, 0x0000);

	ll_tft_read_register(0x0000);

	ClrCs
	ClrRs
	SetRd

	LCD_Write(0x0022);
	ClrWr
	SetWr

	hw_set_state_lcd_data_pins(TFT_PINS_STATE_INPUT);

	SetRs
	ClrRd
	SetRd

	for(i=0;i<20000;i++)
	{
		ClrRd
		SetRd
	 	b = LCD_Read();//LCD_PORT_DAT -> IDR
	};


};