По сути, 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")
Код: Выделить всё
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
Могу ли я получить представление?! < /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
Мобильная версия