Перейти к содержанию

    

Вопрос по настройке 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) - не работает.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Этот контроллер (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". Сделать какую-то сноску на счет этого бита или вообще объяснить эту тонкость в даташите - посчитали лишним.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Купили в Чип-Дипе два модуля: 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 с тем же питанием.

Поделиться сообщением


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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Тут кто-то писал, что вых. драйверы у этого контроллера вроде слабые, не продавливают нужный уровень. Хотел проверить на низких частотах 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);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация