Замена порядка байтов RGB565 дисплеев ILI9341 и ST7735

Для дисплеев ILI9341 и ST7735 при передачи цвета в формате RGB565 нормальным при отображении (корректные цвета) считается передача сначала старшего байта, потом младшего.
При использовании SPI с шириной передачи данных 16 бит или 32 бита, сначала отправляется младший байт, потом старший.
На STM32H743 не нашел как байты местами менять, только порядок бит MSB/LSB.
Исходные данные c камеры аналогично не меняется порядок.

Вопрос: Есть ли у дисплеев регистр, отвечающий за хамену байт меставми в памяти?
ДШ на дисплеи как смог прочитал - не нашел :frowning:

Воткнул костыль с ручной заменой байт:

void h743refreshILI9341byDMA(void) {
	if (spWork) {
		if ((SPI2->SR & SPI_SR_TXC) && (DMA1->LISR & DMA_LISR_TCIF2)) { // проверка занятости потока DMA и интерфейса SPI
			h743stopSPI2DMA();
			unsigned long countWords = w_size*h_size*2/4;
			unsigned char * srcByte = h747hetPointerFrameCAMCDMI();
			unsigned char * dstByte = &iliDataBuf[0];
			while(countWords--){
				*(dstByte++) = *(srcByte+1);
				*(dstByte++) = *(srcByte);
				*(dstByte++) = *(srcByte+3);
				*(dstByte++) = *(srcByte+2);
				srcByte += 4;
			}
			h743sendILI9341ByDMA();
		}
	}
}

может быть его как то можно убыстрить?

Можно, наверно, уже при создании картинки в буфере программы складывать байты в нужном порядке

2 лайка

Картинка идёт с DCMI камеры ov7725, соответственно я её не создаю, она уже готовая.
А преобразование, код которого выше, не даёт быстрой частоты отображения, при быстром движении в кадре - появляются артефакты на дисплее.

Поясни, пожалуйста. Там байты нужно менять местами или же биты?
Особо не вникал (пятница :slight_smile: )

Байты менять местами.
Rgb565 один пиксель занимает два байта.
И хочется чтоб дисплей ili9341 понимал эту замену, что бы не тратить время процессора на преобразование.
В ДШ дисплея не нашёл команды установки последовательности хранения байт изображения в памяти.

Там даже в названии написано, “565”, 5 бит - R, 6 бит - G, 5 бит - B. Што непонятно?

А что быстрее - сдвиг битов или как изначально цикл?
То есть - три переменные по байту, или даже может две хватит.
В каждую сдвигом нужное и объединить.

Не?

Не знаю, о каком контроллере речь. Если он поддерживает ДМА то можно передавать один буфер по дма и в это время перекодировать другой, это ускорит процесс примерно вдвое

2 лайка

Ну ты даёшь… )))

может все проще?

1 лайк

Нет, не проще, это не работает.
Замена цветов в rgb565 это не то же самое что замена байтов в двухбайтовом слове.
ЗЫ. И конечно я интернет перерыл прежде чем постить тут, на буржуйском форуме были аналогичные вопросы, вот только решения не нашлось. Поэтому и надеюсь найдётся спец по ili9341.

Мысль была брать половину кадра, повесить прерывание, обработать, попробую…

а третий бит в этом регистре?

Э…а как сдвинуть весь экран кучу байт?
В любом случае цикл по пикселям.
Или я что то не знаю/не умею :thinking:

Пробовал третий бит - это последовательность битов от старшего к младшему или наоборот - цвета совсем ломаются.

Я не имел ввиду весь экран сдвигать. Так же в цикле, но сдвигать.
Что там изначально GBR? А нужно RGB?
Запоминаешь по маске R, двигаешь GB и в начало по маске «вставляешь» R. Или там как-то иначе?

половину кадра не очень выгодно, да и по памяти затратно. Пока вы первую половину обрабатываете, экран будет простаивать.
Лучше взять буфер поменьше, скажем 1/32 экрана. Быстро обработали, скормили буфер ДМА и переходите к следующему кусочку. В общем, размер надо подобрать по принципу минимального простоя как экрана, так и контроллера

Ну нет, почитайте уже rgb565 как биты расположены.

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

я так понимаю сенсор выплевывает пиксел в rgb565 например 0xDDCC
что бы его правильно отобразил экран ему ТАК И надо передать 0xDD 0xCC
но SPI передает сначала младший потом старший 0xCC и 0xDD
отсюда весь гемор, @andycat я правильно мысль понял?