I2S Rx in Slave mode
Posted: Wed Aug 12, 2020 3:10 pm
I've been trying to get I2S Rx working in Slave mode.
I feel that I must be missing something. I'm building for the devkit-v1 using espidf 4.0.1 under platformio.
There are no examples of I2S Rx, only I2S Tx Master mode.
I'm setting the config as follows :
I have the pins connected to an I2S source, running at 31250. I've tested this against an I2S DAC and it works fine. I've also looked at it using pulseview logic analyser and it can decode the I2S frames.
I then call i2s_driver_install(). Looking at the source this allocates some config memory for the device. It adds an interrupt handler. It then calls i2s_set_clk() which sets up a DMA Queue in turn calls i2s_start().
How can it is2_start() work when I haven't yet assigned the IO pins?
The i2s_set_pin() call copies data into the driver config allocated in i2s_driver_install(). It must be called after i2s_driver_install().
If I then try to read data, I get a timeout and zero data.
I can't help feeling that I'm missing a step. Can anyone please advise?
I feel that I must be missing something. I'm building for the devkit-v1 using espidf 4.0.1 under platformio.
There are no examples of I2S Rx, only I2S Tx Master mode.
I'm setting the config as follows :
- i2s_config_t i2s_config = {
- .mode = I2S_MODE_SLAVE | I2S_MODE_RX,
- .sample_rate = 31250,
- .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
- .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
- .communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB,
- .dma_buf_count = 6,
- .dma_buf_len = 256,
- .use_apll = false,
- .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 //Interrupt level 1
- };
- i2s_pin_config_t pin_config = {
- .bck_io_num = GPIO_NUM_21,
- .ws_io_num = GPIO_NUM_19,
- .data_out_num = -1, // Not used
- .data_in_num = GPIO_NUM_22
- };
I then call i2s_driver_install(). Looking at the source this allocates some config memory for the device. It adds an interrupt handler. It then calls i2s_set_clk() which sets up a DMA Queue in turn calls i2s_start().
How can it is2_start() work when I haven't yet assigned the IO pins?
- err = i2s_driver_install(I2S_NUM_0, & i2s_config, 0, 0);
- if (err != ESP_OK)
- {
- ESP_LOGI(TAG, "i2s_driver_install %d", err);
- }
- err= i2s_set_pin(I2S_NUM_0, & pin_config);
- if (err != ESP_OK)
- {
- ESP_LOGI(TAG, "i2s_set_pin %d", err);
- }
If I then try to read data, I get a timeout and zero data.
- esp_err_t err = i2s_read(I2S_NUM_0, buff, sizeof(buff), & read, 10);