Page 1 of 2

I2S to Internal DAC is Broken

Posted: Tue Feb 18, 2020 7:31 am
by cooperbaker
Esp-idf internal dac audio examples produce no audio.

The output signal is "silence" hovering at about +80mV

Another user reports the same behavior in this post.

Included below is a separate bare-bones example that should produce audio clicks.

Please prove me wrong.

Code: Select all

#include "driver/i2s.h"
#include "esp_err.h"

void app_main( void )
{
    // configure i2s for internal dac
    static const i2s_config_t i2s_config =
    {
        .mode                   = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN,
        .sample_rate            = 48000,
        .bits_per_sample        = 16,
        .channel_format         = I2S_CHANNEL_FMT_RIGHT_LEFT,
        .communication_format   = I2S_COMM_FORMAT_I2S_MSB,
        .intr_alloc_flags       = ESP_INTR_FLAG_LEVEL1,
        .dma_buf_count          = 8,
        .dma_buf_len            = 64,
        .use_apll               = true
    };

    // install i2s driver
    ESP_ERROR_CHECK( i2s_driver_install( I2S_NUM_0, &i2s_config, 0, NULL ) );

    // set pins for internal dac - enable both channels
    ESP_ERROR_CHECK( i2s_set_pin( I2S_NUM_0, NULL ) );

    // enable dac outputs
    ESP_ERROR_CHECK( i2s_set_dac_mode( I2S_DAC_CHANNEL_BOTH_EN ) );

    // I2S log results:
    //-----------------
    // I (325) I2S: DMA Malloc info, datalen=blocksize=256, dma_buf_count=8
    // I (345) I2S: APLL: Req RATE: 48000, real rate: 23999.980, BITS: 16, CLKM: 1, BCK_M: 8, MCLK: 6143995.000, SCLK: 767999.375000, diva: 1, divb: 0

    // memory for i2s write:
    //----------------------
    // 64 samples = 128 bytes at 16bit
    // 8 buffers  = 1024 bytes (  128 x 8 )
    // 2 channels = 2048 bytes ( 1024 x 2 )
    int outBytes  = 2048;

    // allocate output buffer memory
    uint8_t* outBuf = ( uint8_t* )calloc( outBytes, sizeof( uint8_t ) );

    // make spikes
    outBuf[ 0 ] = 255;
    outBuf[ 1 ] = 255;
    outBuf[ 2 ] = 255;
    outBuf[ 3 ] = 255;

    // i2c bytes-written variable
    size_t bytesOut;

    // output the buffer
    while( true )
    {
        ESP_ERROR_CHECK( i2s_write( I2S_NUM_0, outBuf, outBytes, &bytesOut, portMAX_DELAY ) );

        // this results in silence; nothing on either pin 25 or 26; nothing on the scope.
        // ESP_ERROR_CHECK reports nothing
    }
}

Re: I2S to Internal DAC is Broken

Posted: Wed Feb 19, 2020 1:51 am
by ericwhite
Yep, I'm having the same issue.

Thanks for creating this complete example to reproduce the problem.

One thing I noticed in your code is that use_apll is set true. However, I keep reading that it won't take effect unless one also sets fixed_mclk. I don't believe it's the source of the problem, but maybe looking into it helps with something.

Re: I2S to Internal DAC is Broken

Posted: Fri Feb 21, 2020 9:03 pm
by cooperbaker
One thing I noticed in your code is that use_apll is set true.

Yes, good eye. Unfortunately it changes nothing. I tried all permutations of apll/mclk true/false and never saw a signal from the dac.

Re: I2S to Internal DAC is Broken

Posted: Sat Feb 22, 2020 4:06 am
by dlizotte
Thanks for posting this; I am having the exact same problem. Suggest opening an issue on github?

Re: I2S to Internal DAC is Broken

Posted: Sun Feb 23, 2020 12:06 pm
by ESP_houwenxiang
Hi,
The I2S DAC in the master branch is currently not working. We have refactored the driver and have not merged into the master branch (will be OK soon). It can work on release 3.3.

thanks !!

Re: I2S to Internal DAC is Broken

Posted: Sun Mar 01, 2020 1:46 am
by cooperbaker
ESP_houwenxiang wrote:
Sun Feb 23, 2020 12:06 pm
Hi,
The I2S DAC in the master branch is currently not working. We have refactored the driver and have not merged into the master branch (will be OK soon). It can work on release 3.3.

thanks !!

Ok, thanks. Glad I'm not going crazy...

Any idea how soon it will be working again?

Re: I2S to Internal DAC is Broken

Posted: Sun Mar 01, 2020 12:54 pm
by ericwhite
Thanks @ESP_houwenxiang. Just knowing that helps a lot with my planning.

And to help everyone else, I can confirm that I did indeed get DMA to DAC working with version 3.3.1 IDF. Actually the example i2s_adc_dac completely works with 3.3.1.

Re: I2S to Internal DAC is Broken

Posted: Wed Mar 04, 2020 5:06 pm
by heinzv
will the 3.3.x API also been available for Arduino Studio and when can we expect it?
I also have this issue and I'm working with Arduino Studio.

Re: I2S to Internal DAC is Broken

Posted: Fri May 22, 2020 5:06 pm
by boborjan
Could you tell then which git tag or commit we shall use? Or is it already solved since?

Thx,
Viktor

Re: I2S to Internal DAC is Broken

Posted: Mon Nov 23, 2020 6:57 pm
by kbreining
Hi,
I used the released 4.1 and it still didn't work.
Then I downloaded the master - now it works!

However: as the DAC can only output positive values, the negative values are mirrored around the 3.3V/2.
I tried to set the register SENS.sar_dac_ctrl2.dac_invX to 2 (invert MSB) to move the signal by VDD/2, but this didn't work.
I tried to set the register SENS.sar_dac_ctrl2.dac_dcX to 0x7f to achieve the same, but this also didn't work.

So I added in the A2DP-SINK demo code in write_ringbuf() the lines
for (int i = 0; i < size; i++)
((uint8_t *)data) += 0x7f;

Now it works. This solution is a botch, but it's what I got to run. Seems there has to be done more investigation in the ESP_IDF framework...
Regards
Klaus