ADC+I2S(DMA) conficts with "dac_output_enable": ADC reads 0x00 Values
Posted: Fri Mar 13, 2020 8:19 am
Using ADC+I2S alone works:
- Test: Simply Connect the ADC-Input to 3V3, and we got 0X0FFF in the Buffer as expected --> OK
BUG:
Simply adding the Line
"dac_output_enable(DAC_CHANNEL_1)"
somewere! in the Project - even after the test1,
then the test reads only 0X0000 from the ADC-via spi
seems to be a conflict in the Startup of the library
or some missing initialisation?
- Test: Simply Connect the ADC-Input to 3V3, and we got 0X0FFF in the Buffer as expected --> OK
BUG:
Simply adding the Line
"dac_output_enable(DAC_CHANNEL_1)"
somewere! in the Project - even after the test1,
then the test reads only 0X0000 from the ADC-via spi
seems to be a conflict in the Startup of the library
or some missing initialisation?
- #include <stdint.h>
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "esp_log.h"
- // DAC-Cosinus
- #include "soc/rtc_io_reg.h" //Used by DAC-Sin
- #include "soc/rtc_cntl_reg.h"
- #include "soc/rtc.h"
- #include "driver/i2s.h"
- #include "driver/adc.h"
- #include "driver/dac.h"
- #include "esp_adc_cal.h"
- #include <soc/syscon_reg.h>
- #define TAG "MyTag"
- #define EXAMPLE_I2S_ADC_CHANNEL ADC1_CHANNEL_0 /*!< ADC1 channel 0 is GPIO36 (ESP32), GPIO1 (ESP32-S2) */
- //Externaly Connect GPIO36 to 3v3
- void MyTask(void* arg)
- {
- i2s_config_t i2s_config = {
- // .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN,
- .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN,
- .sample_rate = 16000,
- .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
- .communication_format = I2S_COMM_FORMAT_I2S,
- .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
- .intr_alloc_flags = 1,
- .dma_buf_count = 2,
- .dma_buf_len = 1024,
- .use_apll = 0,
- };
- adc1_config_channel_atten(EXAMPLE_I2S_ADC_CHANNEL, ADC_ATTEN_11db);
- adc1_config_width(ADC_WIDTH_BIT_12);
- i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
- i2s_set_adc_mode(ADC_UNIT_1, EXAMPLE_I2S_ADC_CHANNEL);
- i2s_adc_enable(I2S_NUM_0);
- const static size_t i2s_read_len = 1024;
- size_t bytes_read;
- char* i2s_read_buff = (char*) calloc(i2s_read_len, sizeof(char));
- ESP_LOGI(TAG, "Test1: expect dump of 0X0FFF");
- i2s_read(EXAMPLE_I2S_NUM, (void*) i2s_read_buff, i2s_read_len, &bytes_read, portMAX_DELAY);
- if(bytes_read>0){
- ESP_LOG_BUFFER_HEXDUMP(TAG, i2s_read_buff, bytes_read, ESP_LOG_INFO );
- }
- vTaskDelay(2/portTICK_PERIOD_MS);
- dac_cosine_enable(DAC_CHANNEL_1);
- //********************* BUG BUG BUG BUG BUG ******************************************
- // Simply enabeling "dac_output_enable" in Project --> BOTH!!! Test1 and Test2 will Fail( read only 0X0000)
- #if 1
- ESP_LOGI(TAG, "dac_output_enable");
- dac_output_enable(DAC_CHANNEL_1);// GPIO25
- #endif
- ESP_LOGI(TAG, "\nTest2:");
- i2s_read(EXAMPLE_I2S_NUM, (void*) i2s_read_buff, i2s_read_len, &bytes_read, portMAX_DELAY);
- if(bytes_read>0){
- ESP_LOG_BUFFER_HEXDUMP(TAG, i2s_read_buff, bytes_read, ESP_LOG_INFO );
- }
- while(1){
- vTaskDelay(2000/portTICK_PERIOD_MS);
- }//while
- }
- void ADC_SPI_DAC_Init(){
- xTaskCreate(MyTask, "MyTask", 1024*3, NULL, 10, NULL);
- }