2

I need to read high freq. analog signal data from one ADC1 channel and read low freq. data from other ADC1 pins.
I use I2S for the high freq. data read, which runs perfectly, but as soon as I2S is configured all other ADC1 pins read 4095 only.
What is the correct handling for my demands?
Can't use ADC2 because of wifi.

Code excerpt:

  void readerTask(void *param) {

    size_t bytesRead = 0;
    while(true) {
      // Get ADC data from DMA buffer
      i2s_read(I2S_NUM_0, buf, sizeof(buf), &bytesRead, portMAX_DELAY);

      // prevent the data getting corrupted
      i2s_adc_disable(I2S_NUM_0);
    
      /* data processing */

      delay(30);
      i2s_adc_enable(I2S_NUM_0);
    }
  }

  void setup() {
    i2s_config_t i2s_config = {
        .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN),
        .sample_rate = 8000,
        .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
        .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
        .communication_format = I2S_COMM_FORMAT_I2S_LSB,
        .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
        .dma_buf_count = 2,
        .dma_buf_len = 1024,
        .use_apll = false,
        .tx_desc_auto_clear = false,
        .fixed_mclk = 0};
    
    //install and start i2s driver
    i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
    
    //init ADC pad
    i2s_set_adc_mode(ADC_UNIT_1, ADC1_CHANNEL_0);
    
    // enable the ADC
    i2s_adc_enable(I2S_NUM_0);
    
    // start a task to read samples from I2S
    xTaskCreatePinnedToCore(readerTask, "Reader Task", 2048, NULL, 1, NULL, 0);
  }

  void loop()
  {
    EVERY_N_MILLISECONDS( 100 ) { 
      // read low freq. data
      int test = analogRead(34);   // will always read 4095
    }
  }
Chris
  • 31
  • 4

1 Answers1

0

you need:

  i2s_adc_disable(I2S_NUM_0);
  i2s_driver_uninstall(I2S_NUM_0);
  analogRead(34);
  i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
  i2s_set_adc_mode(ADC_UNIT_1, ADC1_CHANNEL_0);
  i2s_adc_enable(I2S_NUM_0);
Юрий
  • 3
  • 2
  • Would disabling / uninstalling i2s not conflict with the i2s reader task? These are 2 parallel threads, so I'm afraid of the i2s reader task getting harmed when disabling / uninstalling i2s in a parallel running thread. – Chris Feb 12 '22 at 11:54
  • Do disabling / uninstalling i2s in all tasks. – Юрий Feb 16 '22 at 09:03