Jump to content
    

STM32F427VG FMC 16 bit LCD ST7796 проблемы с чтением

Всем здравствуйте! Проблема следующего характера, не могу причитать данные с дисплея. Запись данных в дисплей работает. На максимальных частотах и на самых быстрых таймингах все отрабатывает идеально. 
Логического анализатора нету, но осциллограффом 4 канала просматривал сигналы: CS , DCX , WRX, RDX все идеально.
Также смотрел что на DATA пинах происходит - там действительно ерунда либо 0x0000 либо 0x0FFFF все время. такое ощущение что дисплей на восходящий строб RDX совсем не реагирует.  Кто-нибудь сталкивался с таким явлением ?

Share this post


Link to post
Share on other sites

17 минут назад, Mysteo сказал:

Кто-нибудь сталкивался с таким явлением ?

Обычное дело. Ваш контроллер дисплея просто не поддерживает чтение.  :unknw:

Share this post


Link to post
Share on other sites

On 3/22/2023 at 10:54 PM, jcxz said:

Обычное дело. Ваш контроллер дисплея просто не поддерживает чтение.  :unknw:

Спасибо! Первый раз с дисплеями сталкиваюсь. Три дня ломал голову, в чем может быть проблема. А для чего тогда в даташите  на контроллер дисплея описывают эти функции ?

image.thumb.png.f5be22a2744f2f1ddb1810482c8e921c.png

Share this post


Link to post
Share on other sites

Надеюсь, ID получали 4-мя последовательными чтениями, а не одним единственным?

А если под отладчиком, да вручную (без FMC, ногодрыгом) сформировать всю сигналограмму? И не спеша посмотреть, что на шине происходит.

Share this post


Link to post
Share on other sites

On 3/23/2023 at 12:14 AM, Obam said:

Надеюсь, ID получали 4-мя последовательными чтениями, а не одним единственным?

Да , четырьмя последовательными и это касается не только ID. Пробовал и вручную ножками дергать - тоже самое, отвечает какой-то билибердой. В основном либо все биты данных в 1 выставляет либо в ноль. 

Все 10 дисплеев так себя ведут. 
Но запись работает нормально на любых таймингах.

 

 

Фиг с ним с этим чтением. Как использовать синхронизацию пока не очень понимаю. Ножка TE выкидывает прерывания с частотой 60 Гц. Получается что за время между прерываниями я должен обновить информацию на дисплее ?

Share this post


Link to post
Share on other sites

TE - Tearing Effect - специальный пин, который взводится в 1 в тот момент, когда контроллер дисплея обновляет на матрице определённую строку. Ищите по даташиту соответствующий регистр. Возможно по "Tearing line" или похожему сочетанию.

Используется для синхронизации вывода изображения из контроллера в память экрана для устранения эффекта полукадра.

Регистр 0x44 - STE (Set Tear ScanLine ) - устанавливает линию, на которой будет генерироваться прерывание.

Про эффект разрыва - смотрите пункт 10.8.3 Example 1: MPU Write is faster than panel read. В даташите, который имеется у меня, изображение-пример с данными кадра относится к 10.8.4 Example 2: MPU write is slower than panel read

 

14 часов назад, Mysteo сказал:

Проблема следующего характера, не могу причитать данные с дисплея. Запись данных в дисплей работает. На максимальных частотах и на самых быстрых таймингах все отрабатывает идеально.
Кто-нибудь сталкивался с таким явлением ?

Не с именно этим контроллером, но похожую ситуацию ловил на ILI9341 Лично мне пришлось немного ухудшать тайминги работы с дисплеем перед чтением.
Попробуйте вот такой код:
 

Спойлер
#define LCD_REG			*(volatile uint8_t *) (0x60000000)
#define LCD_DATA		*(volatile uint8_t *) (0x60040000)

<...>

// Чтение-запись. После подачи питания пытаюсь прочитать ID чипа по разным адресам:
	FSMC_Bank1->BTCR[1] =  (0x0  << 28) // Reserved [31:30] & ACCMOD [29:28] == 0000
                    | (0x0  << 24) // Latch (Don't Care)
                    | (0x0  << 20) // ClockDiv (Don't Care)
                    | (0x0  << 16) // BusTurn (0 - not required @200MHz).
                    | (0x15 << 8)  // DataPhase (5+ ticks @ 200MHz).
                    | (0x0  << 4)  // AddressHold (Don't Care)
                    | (0x2  << 0); // AddressSet (minimal: 2 @ 200MHz).

	// Sync
	for (i=0;i<4;i++) {
		LCD_REG = 0x00;
	};
	delay_us(2000);
	for (i=0;i<4;i++) {
		LCD_REG = 0x00;
	};
	delay_us(2000);
	
	v = LCD_DATA;
	v = v << 8;
	v |= LCD_DATA;
	v = v << 8;
	v |= LCD_DATA;
	v = v << 8;
	v |= LCD_DATA;
	console_timestamp();
	console_put("LCD_ID (INDX reg): ");
	console_put_hex_word(v);
	console_put("\r\n");

	LCD_REG = 0x04;
	v = LCD_DATA;
	v = v << 8;
	v |= LCD_DATA;
	v = v << 8;
	v |= LCD_DATA;
	v = v << 8;
	v |= LCD_DATA;
	console_timestamp();
	console_put("LCD_ID (ILIxxxx 04 like): ");
	console_put_hex_dword(v);
	console_put("\r\n");

	LCD_REG = 0xD3;
	v = LCD_DATA;
	v = v << 8;
	v |= LCD_DATA;
	v = v << 8;
	v |= LCD_DATA;
	v = v << 8;
	v |= LCD_DATA;
	console_timestamp();
	console_put("LCD_ID (ILIxxxx D3 like): ");
	console_put_hex_dword(v);
	console_put("\r\n");

<...>
  // После того, как контроллер определён - ужимаем такты шины. Чтение в процессе работы не будет использоваться:
  	FSMC_Bank1->BTCR[1] = 		  (0x0  << 28) // Reserved [31:30] & ACCMOD [29:28] == 0000
					| (0x0  << 24) // Latch (Don't Care)
					| (0x0  << 20) // ClockDiv (Don't Care)
					| (0x0  << 16) // BusTurn (0 - not required @200MHz).
					| (0x05 << 8)  // DataPhase (5+ ticks @ 200MHz).
					| (0x0  << 4)  // AddressHold (Don't Care)
					| (0x2  << 0); // AddressSet (minimal: 2 @ 200MHz).

<...>

 

Edited by AlanDrakes

Share this post


Link to post
Share on other sites

Спасибо! Не помогло изменение таймингов перед чтением. 

С синхронизацией разобрался.

Share this post


Link to post
Share on other sites

FMC имеет раздельные настройки для записи и чтения, а вот конкретно st7799 имеет время чтения 350nc - в 23 раза больше записи. И кажется не поддерживает автоадрес.

То-есть читать рам память - это к огромным тормозам. 

Share this post


Link to post
Share on other sites

Здравствуйте ! Чтобы не плодить новую тему , напишу здесь!

 

В чем может быть ошибка а данном случае?

Стартовый экран корректно выводится и даже нормально работает часть экрана , но при попытке скролла других элементов не понятные артефакты возникают.

Использую FMC 16 BIT TouchGFX и partial buffer 

 

Share this post


Link to post
Share on other sites

Кажется я догадываюсь , что проблема может быть в функции заполнения прямоугольной области экрана, если начальная точка равна 0 , 0 то проблем не возникнет , а если Х смещен , то вроде происходит кирдык, завтра на работе проверю

Share this post


Link to post
Share on other sites

Неверно заданы границы изображений, неверно задан формат пикселя. Достаточно ошибки размера на один пиксель, и всё уже пойдет наперекосяк.

Share this post


Link to post
Share on other sites

Разобрался, ошибка была именно в функции заполнения прямоугольной области

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...