Jump to content

    

Вопрос по настройке ILI9341

Очень распространенный контроллер ili9341...

Пытаюсь запустить на дисплее MIO283QT-13 (320x240) в режиме 6-bit RGB (когда цвета передаются по параллельной шине последовательно R-G-B). Показывает черно-белые строчки.

 

В 18/16 битном RGB - все ок. В SPI - тоже. В чем тонкость - не понимаю...

 

Может кто подскажет сколько клоков надо выставить в Thsync (период и время действия в "0"), Tvsync (период и время действия в "0")?

Может в контроллере нужны какие-то специфические настройки?

 

Я выставляю Thsync (760 clk, 10clk), Tvsync (324*760 clk, 1520 clk) - не работает.

 

Что-то в ступор уже впал. может кто подскажет чего?

Share this post


Link to post
Share on other sites

 

Что, никто не запускал какой-нибудь дисплей с ILI9341 в режим 6-bit RGB mode?

Share this post


Link to post
Share on other sites

Решил аццкую хрень эту.

Может кому пригодится...

 

Этот контроллер (ILI9341) имеет стандартную частоту обновления в 70 Гц при DOTCLK = 6,4 МГц. Максимальная частота DOTCLK, которую воспринимает контроллер - это 10 МГц.

Если работаем в режиме 16/18-бит RGB - все ок.

 

Если переключаемся в 6-бит, то нам нужно 3 передачи на 1 пиксель => частоту DOTCLK при том же Refresh Rate нужно бы увеличить в 3 раза (по крайней мере - до 19 МГц), но у нас потолок - 10 МГц => максимально возможная частота обновления экрана выходит в районе 40 Гц - что хрень. Тогда создатели ILI9341, чтобы обойти это решают, что в этом режиме, можно писать во внутреннюю GRAM контроллера а не как положено - сразу на дисплей, а внутреннюю память типа будут обновлять с частотой внутреннего генератора самого ILI9341, который в этом режиме не зависит от DOTCLK.

 

Этот аццкий бит - ByPass_MODE в регистре 0xB0h. Если используется режим 6-бит RGB, то его нужно установить в "1". Сделать какую-то сноску на счет этого бита или вообще объяснить эту тонкость в даташите - посчитали лишним.

 

Как-то так...

Share this post


Link to post
Share on other sites

Медленно дурею от модуля с этим контроллером. Или с другим?

Купили в Чип-Дипе два модуля: MIKROE-1439 и MIKROE-495.

http://www.chipdip.ru/product/mikrotft/

http://www.chipdip.ru/product/me-tft-proto-board/

Если верить Чип-Дипу, то там контроллер HX8347. На сайте производителя сообщают, что контроллер 9341. Пробовал и так, и этак. Добиться чего-либо от них не получилось ни по послед., н по параллельным портам. Самое интересное - взвожу RST, WR, опускаю RD - порты модуля как выходы не конфигурируются. В SPI режиме тоже самое - когда модулю положено отвечать, SDA в z-состоянии. Едва ли оба модуля мертворожденные. Питаю от 3.3 В, щупаю атмегой 128 с тем же питанием.

Share this post


Link to post
Share on other sites
Добиться чего-либо от них не получилось ни по послед., н по параллельным портам. Самое интересное - взвожу RST, WR, опускаю RD - порты модуля как выходы не конфигурируются. В SPI режиме тоже самое - когда модулю положено отвечать, SDA в z-состоянии.

А Вы не читайте, а пишите в него. У меня тож ILI9340 (а может 9341), не удалось ничего считать (SPI). Но функции вывода работают нормально, проверял до SCLK = 20MHz - всё ок.

Тут кто-то писал, что вых. драйверы у этого контроллера вроде слабые, не продавливают нужный уровень. Хотел проверить на низких частотах SCLK, да всё забываю.

Share this post


Link to post
Share on other sites
Тут кто-то писал, что вых. драйверы у этого контроллера вроде слабые, не продавливают нужный уровень. Хотел проверить на низких частотах SCLK, да всё забываю.

Какие уж тут частоты, в статике порты не фиксируются. Я и так уж сейчас до 100 кГц тактовую опустил, и ниже пробовал. Кроме белого экрана ничего нет.

Инициализацию нарыл в инете, пишут, рабочая.

l
//#########################################################################
void pause_us (U8 i8)
{
U8 j8;
for (;i8;i8--){
		 for (j8=3;j8;j8--){NOP();}
		 }

}
//#########################################################################
void write_byte(uint8_t c) {
uint8_t i;
for(i=0;i<8;i++) {
	if (c & 0x80) {MOSI1;}
	else {MOSI0;}
pause_us(3);
	SCK1;
	c = c<<1;
pause_us(3);
	SCK0;
}
}
//#########################################################################
void  write_command(uint8_t c)
{
DC0;
pause_us(3);
CS0;
pause_us(3);
write_byte©;
pause_us(3);
CS1;
pause_us(3);
}
//#########################################################################
void  write_data(uint8_t c)
{
DC1;
pause_us(3);
CS0;
pause_us(3);
write_byte©;
pause_us(3);
CS1;
pause_us(3);
}

#define LCD_SendCMD  write_command
#define LCD_Data8  write_data

#define	DC0     PORTD&=~BIT(6)
#define	DC1     PORTD|=BIT(6)

#define	CS0     PORTB&=~BIT(0)
#define	CS1     PORTB|=BIT(0)

#define	RST0     PORTD&=~BIT(5)
#define	RST1     PORTD|=BIT(5)

   #define     LCD_MEMORY_CONFIG   0xe8        // 270 degrees


void new_init (void)
{
U16 i,j;

   RST1; //set1( LCD_RESET );
   CS1;  //set1( LCD_CS );
   DC1;  //set1( LCD_DC );
   delay( 20 );
   RST0;  //set0( LCD_RESET);
   delay( 20 );
   RST1;  //set1( LCD_RESET );
   delay( 200 );
   LCD_SendCMD( 0x01 );            // reset
   delay(20);
   LCD_SendCMD( 0x28 );            // display off

   LCD_SendCMD( 0xcf );
   LCD_Data8( 0x00 );
  LCD_Data8( 0x83 );
   LCD_Data8( 0x30 );
    LCD_SendCMD( 0xed );
   LCD_Data8( 0x64 );
   LCD_Data8( 0x03 );
   LCD_Data8( 0x12 );
   LCD_Data8( 0x81 );
   LCD_SendCMD( 0xe8 );
   LCD_Data8( 0x85 );
   LCD_Data8( 0x01 );
   LCD_Data8( 0x79 );
   LCD_SendCMD( 0xcb );
   LCD_Data8( 0x39 );
   LCD_Data8( 0x2c );
   LCD_Data8( 0x00 );
   LCD_Data8( 0x34 );
   LCD_Data8( 0x02 );
   LCD_SendCMD( 0xf7 );
   LCD_Data8( 0x20 );
   LCD_SendCMD( 0xea );
   LCD_Data8( 0x00 );
   LCD_Data8( 0x00 );
   LCD_SendCMD( 0xc0 );        //power control
   LCD_Data8( 0x26 );
   LCD_SendCMD( 0xc1 );        //power control
   LCD_Data8( 0x11 );
   LCD_SendCMD( 0xc5 );        //vcom control
   LCD_Data8( 0x35 );          //35
   LCD_Data8( 0x3e );          //3E
   LCD_SendCMD( 0xc7 );        //vcom control
   LCD_Data8( 0xbe );          // 0x94
   LCD_SendCMD( 0x36 );        // memory access control
//    LCD_Data8( 0x48 );          // 0 grad orientation
   LCD_Data8( LCD_MEMORY_CONFIG );
   LCD_SendCMD( 0x3a );        // pixel format set
   LCD_Data8( 0x55 );          //16bit /pixel
   LCD_SendCMD( 0xb1 );        // frame rate
   LCD_Data8( 0x00 );
//  LCD_Dat h'1B'               ;  70 Hz
   LCD_Data8( 0x13 );          // 100 Hz
   LCD_SendCMD( 0x2a );        // column set
   LCD_Data8( 0x00 );
   LCD_Data8( 0x00 );
   LCD_Data8( 0x00 );
   LCD_Data8( 0xEF );
   LCD_SendCMD( 0x2b );        // row set
   LCD_Data8( 0x00 );
   LCD_Data8( 0x00 );
   LCD_Data8( 0x01 );
   LCD_Data8( 0x3F );
   LCD_SendCMD( 0x34 );        // tearing effect off
   LCD_SendCMD( 0xb7 );        // entry mode
   LCD_Data8( 0x07 );          //
   LCD_SendCMD( 0xb6 );        // display function ctrl
   LCD_Data8( 0x0a );
   LCD_Data8( 0x82 );
   LCD_Data8( 0x27 );
   LCD_Data8( 0x00 );
   LCD_SendCMD( 0x11 );        // sleep out
   delay(120);
   LCD_SendCMD( 0x29 );        // display ON
   delay(120);

addset(0,0);
for (i=0;i<320;i++)
   for (j=0;j<240;j++) {
      write_data(0x00);
      write_data(0xff);
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this