Page 1 of 2

DMA and DAC

Posted: Thu Oct 18, 2018 3:47 pm
by fly135
I am seeing a need to send audio data out the ESP32 DAC. I searched this forum for the DMA and DAC but didn't get any relevant hits. Anyone have any input on this task?

The docs say this....
The DAC channels can also be driven with DMA-style written sample data, via the I2S driver when using the “built-in DAC mode”.
And this...
I2S output can also be routed directly to the Digital/Analog Converter output channels (GPIO 25 & GPIO 26) to produce analog output directly, rather than via an external I2S codec.
So is this as simple as setting up I2S to send to the DAC pin and let her rip?

John A

Re: DMA and DAC

Posted: Thu Oct 18, 2018 9:00 pm
by fly135
Short example configuring I2S to use internal DAC for analog output:
So the internal DAC that they are referring to is the one on GPIO25 or 26?
i2s_set_pin(i2s_num, NULL); //for internal DAC, this will enable both of the internal channels
Should I change the NULL to the pin I want? Does NULL send the signal out both 25 and 26. That seems to be what it's saying.

John A

Re: DMA and DAC

Posted: Fri Oct 19, 2018 2:53 am
by chegewara
Internal DAC output is using both pins 25 and 26.

Re: DMA and DAC

Posted: Fri Oct 19, 2018 2:54 am
by ESP_Sprite
Yes, the DAC is the one on pin 25/26. If you want an example on how to use it, feel free to refer to esp-idf/examples/peripherals/i2s_adc_dac/ .

Re: DMA and DAC

Posted: Fri Oct 19, 2018 3:23 pm
by fly135
So using I2S to write to the DAC uses up both DACs and outputs the same (or R/L) data to both GPIOs? That means if I use GPIO26 that GPIO25 is no longer available? Or are we assuming stereo audio?

This is going to be mono audio. I was hoping that calling "i2s_set_pin(i2s_num, GPIO_NUM_26)" would allow use of only one GPIO with mono audio.

John A

Re: DMA and DAC

Posted: Fri Oct 19, 2018 8:13 pm
by chegewara
https://docs.espressif.com/projects/esp ... l#overview
ESP32 has two 8-bit DAC (digital to analog converter) channels, connected to GPIO25 (Channel 1) and GPIO26 (Channel 2).
https://docs.espressif.com/projects/esp ... on-example

Re: DMA and DAC

Posted: Sat Oct 20, 2018 7:24 am
by ESP_Sprite
You should be able to re-purpose one of the DAC GPIOs for something else. For instance, this only uses DAC2:

Code: Select all

        i2s_config_t cfg={
                .mode=I2S_MODE_DAC_BUILT_IN|I2S_MODE_TX|I2S_MODE_MASTER,
                .sample_rate=rate,
                .bits_per_sample=16,
                .channel_format=I2S_CHANNEL_FMT_RIGHT_LEFT,
                .communication_format=I2S_COMM_FORMAT_I2S_MSB,
                .intr_alloc_flags=0,
                .dma_buf_count=4,
                .dma_buf_len=buffsize/4
        };
        i2s_driver_install(0, &cfg, 4, &soundQueue);
        i2s_set_pin(0, NULL);
        i2s_set_dac_mode(I2S_DAC_CHANNEL_LEFT_EN);
        i2s_set_sample_rates(0, cfg.sample_rate);
        //I2S enables *both* DAC channels; we only need DAC2. DAC1 is connected to the select button.
        CLEAR_PERI_REG_MASK(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_DAC_XPD_FORCE_M);
        CLEAR_PERI_REG_MASK(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_XPD_DAC_M);
Not sure if the last two lines are still needed, the I2S driver may have taken care of that by itself now.

Re: DMA and DAC

Posted: Mon Oct 22, 2018 3:09 pm
by fly135
Thanks for the help guys! :)

Re: DMA and DAC

Posted: Fri Oct 26, 2018 9:18 pm
by fly135
Seems like I'm running out of options on this. We can only use PDM mics on I2S 0, but we can only use I2S 0 to write to the DAC. I doubt this is possible but can you DMA read PDM on I2S 0 and DMA write to the DAC on I2S 0 at the same time? My default answer on this is no, but I figured I'd ask just to be sure.

John

Re: DMA and DAC

Posted: Sun Oct 28, 2018 2:17 am
by ESP_Sprite
I'd think the hardware is capable of doing this, but I'm not sure if the driver allows for initializing it in such a way.