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

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

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

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


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

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

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

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

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


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

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

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

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

image.thumb.png.f5be22a2744f2f1ddb1810482c8e921c.png

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


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

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

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

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


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

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

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

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

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

 

 

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

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


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

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).

<...>

 

Изменено пользователем AlanDrakes

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


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

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

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

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


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

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

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

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


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

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

 

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

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

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

 

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


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

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

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


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

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

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


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

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...