ESDp32 и SSD1963 - ускорение fillrate

progman
Offline
Зарегистрирован: 26.01.2019

Пишу драйвер для работы с SSD1963 в восьмибитном режиме

уткнулся в тупик как мне кажется.

Скорость обновления экрана 174мс в режиме 800х480

вот функция которая самая тормозная

#define GPIO_CLEAR    GPIO.out_w1tc
#define GPIO_SET      GPIO.out_w1ts

const uint32_t TFT_CS_BIT = 1 << TFT_CS;
const uint32_t TFT_RS_BIT = 1 << TFT_RS;
const uint32_t TFT_WR_BIT = 1 << TFT_WR;
const uint32_t TFT_CS_RS_BIT = TFT_CS_BIT | TFT_RS_BIT;
const uint32_t TFT_WR_CS_BIT = TFT_WR_BIT | TFT_CS_BIT;
void TFT1963::writeBlock( uint32_t color, uint32_t repeat )
{
	int8_t red = color & 0xFF;
	int8_t green = ( color >> 8 ) & 0xFF;
	int8_t blue = ( color >> 16 ) & 0xFF;

	uint32_t GPIO_CLEAR_R = TFT_WR_CS_BIT | ( ( ( ~red ) & 0xFF ) << TFT_D0 );
	uint32_t GPIO_CLEAR_G = TFT_WR_CS_BIT | ( ( ( ~green ) & 0xFF ) << TFT_D0 );
	uint32_t GPIO_CLEAR_B = TFT_WR_CS_BIT | ( ( ( ~blue ) & 0xFF ) << TFT_D0 );

	uint32_t GPIO_SET_R = TFT_RS_BIT | ( red << TFT_D0 );
	uint32_t GPIO_SET_G = TFT_RS_BIT | ( green << TFT_D0 );
	uint32_t GPIO_SET_B = TFT_RS_BIT | ( blue << TFT_D0 );

	Send_TFT_Command( write_memory_start );

	for( int i = 0; i < repeat; i++ )
	{
		GPIO_SET	= GPIO_SET_R;
		GPIO_CLEAR  = GPIO_CLEAR_R;
		GPIO_SET	= TFT_WR_CS_BIT;

		GPIO_SET	= GPIO_SET_G;
		GPIO_CLEAR  = GPIO_CLEAR_G;
		GPIO_SET	= TFT_WR_CS_BIT;

		GPIO_SET	= GPIO_SET_B;
		GPIO_CLEAR	= GPIO_CLEAR_B;
		GPIO_SET	= TFT_WR_CS_BIT;
	}
}

глаз замылился. не знаю что еще можно заооптимизировать чтобы ускорить.

16 битный режим работы не вариант - пинов нет уже свободных

progman
Offline
Зарегистрирован: 26.01.2019

Получается 0.174 секунды  на 1152000 ( 3 * 800 * 480 ) операций = 0.15 микросекунды на одну запись цвета.

GPIO_SET    = GPIO_SET_R;
GPIO_CLEAR  = GPIO_CLEAR_R;
GPIO_SET    = TFT_WR_CS_BIT;

это всего 6,6 мегагерц. При 240 мегагерцовом чипе внешняя перефирия так медленно работает?

astwo
Offline
Зарегистрирован: 10.07.2019

А все потому что она внешняя. Внешняя всегда будет работать медленно.

progman
Offline
Зарегистрирован: 26.01.2019

astwo пишет:
А все потому что она внешняя. Внешняя всегда будет работать медленно.

да но SPI протокол работает же на 80 мегагерцах в драйвере ILI9341.

Вот как так? Я весь код либы перерыл - не нашел ничего такого что у меня не проинициализировано.