I changed code which sends buffer to use interruptIt sends whole buffer to the screen at once. Audio module is still blocked. Maybe split buffer to parts will help.
Code:
void dma_buffer_irq_handler(){ dma_hw->ints1 = 1u << dma_channel; display_refresh(); _hardware->write(LCD_CS_PIN, 1);}void init_dma(){ dma_channel = dma_claim_unused_channel(true); dma_channel_config config = dma_channel_get_default_config(dma_channel); channel_config_set_transfer_data_size(&config, DMA_SIZE_8); channel_config_set_dreq(&config, spi_get_dreq(_hardware->get_spi_port(), true)); dma_channel_configure( dma_channel, &config, &spi_get_hw(_hardware->get_spi_port())->dr, buffer, BUFFER_SIZE, false ); dma_channel_set_irq1_enabled(dma_channel, true); irq_set_exclusive_handler(DMA_IRQ_1, dma_buffer_irq_handler); irq_set_enabled(DMA_IRQ_1, true); channel_config_set_read_increment(&config, true); channel_config_set_write_increment(&config, false);}void draw_buffer(){ _hardware->write(LCD_DC_PIN, 1); _hardware->write(LCD_CS_PIN, 0); dma_channel_transfer_from_buffer_now(dma_channel, buffer, BUFFER_SIZE); __wfi();}
Statistics: Posted by YamiFive — Tue Apr 29, 2025 4:47 am