I have a question about using the DAC and ADC. What I am trying to do is shown in the attached image: I want to generate a waveform using the DAC, send this waveform through some external hardware and then read out the resulting waveform with the ADC
Due to the way we want to use this resulting waveform it is important that the sample rate is constant. That is why I want to use the I2S DMA to copy the bytes from memory to the DAC and from the ADC to memory. I've already been able to use the DMA for copying bytes to the DAC, but so far no luck with the ADC. According to the documentation this should be possible, but I don't find how the ESP32 should be configured to allow this.
The code that I currently use can be found in https://github.com/stevenvdr/esp-adc-bug. This uses the I2S DMA to copy bytes to the DAC and uses a loop to read out the ADC.
Probably the configuration will need to be changed to something like:
Code: Select all
static const i2s_config_t i2s_config = {
.mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX | I2S_MODE_DAC_BUILT_IN,
.sample_rate = 44100,
.bits_per_sample = 8, /* must be 8 for built-in DAC */
.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT,
.communication_format = I2S_COMM_FORMAT_I2S_MSB ,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, // high interrupt priority
.dma_buf_count = 2,
.dma_buf_len = 128
};
Code: Select all
// Setup ADC
adc1_config_channel_atten(ADC1_CHANNEL_5, ADC_ATTEN_11db);
adc1_config_width(ADC_WIDTH_12Bit);
REG_SET_BIT(SYSCON_SARADC_CTRL_REG, SYSCON_SARADC_DATA_TO_I2S);
i2s_read_bytes(I2S_NUM, (char*) &samples, 256, portMAX_DELAY);
Kind regards,
Steven