24-битный ЖК-драйвер RGB Bitbang для RP2040C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 24-битный ЖК-драйвер RGB Bitbang для RP2040

Сообщение Anonymous »

Я пытаюсь написать 24-разрядный RGB-драйвер RGB Bitbang для отображения 240x320 с RGB, 3 цветными каналами. Я решил использовать чип 74HC595BZX для генерации 24-битных сигналов RGB. < /P>
По сути, RP2040 работает в режиме 125 МГц. Поэтому я написал макрос задержки между GPIOS для генерации задержки 48NS (ЖК -дисплей может принять задержку или более). < /p>

Код: Выделить всё

    /* 125MHz: 8 * 3 * 2 ns. */
#define ltdc_delay_ns()     \
asm volatile("nop \n nop \n nop"); \
asm volatile("nop \n nop \n nop")
и я написал ltdc_vsync_pulse и ltdc_hsync_pulse Функция для генерации vsync и hsync сигнал:

Код: Выделить всё

inline void ltdc_vsync_pulse() {
// -->  VSYNC: low, CLK: low.
ltdc_sig(PIN_LCD_VSYNC, LOW);
ltdc_sig(PIN_LCD_CLK, LOW);
ltdc_exec();

// --> VSYNC: low, CLK: high, rising edge trigger.
ltdc_delay_ns();
ltdc_sig(PIN_LCD_CLK, HIGH);
ltdc_exec();

// --> VSYNC: high, CLK: low.
ltdc_delay_ns();
ltdc_sig(PIN_LCD_VSYNC, HIGH);
ltdc_sig(PIN_LCD_CLK, LOW);

ltdc_delay_ns();
}

inline void ltdc_hsync_pulse() {
// -->  VSYNC: low, CLK: low.
ltdc_sig(PIN_LCD_HSYNC, LOW);
ltdc_sig(PIN_LCD_CLK, LOW);
ltdc_exec();

// --> VSYNC: low, CLK: high, rising edge trigger.
ltdc_delay_ns();
ltdc_sig(PIN_LCD_CLK, HIGH);
ltdc_exec();

// --> VSYNC: high, CLK: low.
ltdc_delay_ns();
ltdc_sig(PIN_LCD_HSYNC, HIGH);
ltdc_sig(PIN_LCD_CLK, LOW);

ltdc_delay_ns();
}
< /code>
Тогда я написал генератор тактового импульса: < /p>
    inline void ltdc_clock_cycle(uint16_t cycle = 1) {
if (cycle 
и, наконец, я написал функцию рендеринга буфера пикселя: < /p>

ret_t lcd_ltdc_task() {
if (!g_ltdc_init) {
return RET_NOT_READY;
}

uint8_t den = 0;
uint32_t ts = board_millis();

// --> generate temporary random frame.
for (size_t i = 0; i < sizeof(g_ltdc_buf); ++i) {
g_ltdc_buf[i] = 0xff;// ts & 0xff;
//ts = ts * 1103515245 + 12345;
}

// --> disable data bus.
ltdc_sig(PIN_LCD_DEN, LOW);

// --> generate vsync pulse once.
ltdc_vsync_pulse();

// --> virtical back-forch: 5 clocks.
ltdc_clock_cycle(5);

// --
for (size_t y = 0; y < LTDC_MAX_HEIGHT; ++y) {
const uint8_t* v_pixels = &g_ltdc_buf[y * LTDC_VPITCH];

// --> generaate hsync pulse once.
ltdc_hsync_pulse();

// --> hsync back porch.
ltdc_clock_cycle(5);

// --> enable data bus.
ltdc_sig(PIN_LCD_DEN, HIGH);
ltdc_exec();
ltdc_delay_ns();

for (size_t x = 0; x < LTDC_MAX_WIDTH; ++x) {
const uint16_t offset = x * LTDC_COLOR_CHANNELS;

// --> push pixels to hc595.
g_ltdc_pixels.push(v_pixels + offset, LTDC_COLOR_CHANNELS);

// --> then, generate clock pulse.
ltdc_clock_cycle();

}

// --> disable data bus.
ltdc_sig(PIN_LCD_DEN, LOW);
ltdc_exec();
ltdc_delay_ns();

// --> hsync front porch.
ltdc_clock_cycle(5);
}

// --> virtical front-forch: 5 clocks.
ltdc_clock_cycle(5);

return RET_OKAY;
}
< /code>
Мой ЖК -дисплей: < /p>
Data enable: active high
Hsync polarity: negative
Vsync polarity: negative
Clock trigger: rising edge
И я проверил частоту 74HC595Bzx . Он должен поддерживать 12 МГц через связь SPI, и он должен быть оптимизируется DMA. Но LCD ничего не показывает.
Могу ли я получить представление?! < /p>
p.s. Код инициализации для чипа ILI8961 (мой ЖК -дисплей) проверяется с использованием RPI Zero 2W с моей пользовательской малиной Pi Hat. В настоящее время я пытаюсь сделать что -то на RP2040, а не RPI Zero 2w.
изображения формы сигнала
pin_lcd_clk

pin_lcd_hsync


Подробнее здесь: https://stackoverflow.com/questions/795 ... for-rp2040
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»