espvban/ESPIDFNEW/main/i2s/i2s.c
2024-08-29 21:38:48 +02:00

45 lines
1.9 KiB
C

#include <driver/i2s.h>
i2s_port_t i2s_num = I2S_NUM_0; // i2s port number (Built-in DAC functions are only supported on I2S0 for current ESP32 chip, purportedly)
i2s_config_t i2s_config;
unsigned char i2s_running = 0;
static unsigned char audioBufferFilled=0;
void configure_i2s(int newSampleRate, uint16_t newDmaBufLen)
{
ESP_LOGE(TAG, "Setup I2S hardware");
ESP_LOGE(TAG, "Sample rate: %d", newSampleRate);
ESP_LOGE(TAG, "noSamples per packet %d", newDmaBufLen);
static const i2s_pin_config_t pin_config = {
.bck_io_num = 15,
.ws_io_num = 13,
.data_out_num = 2,
.mck_io_num = I2S_PIN_NO_CHANGE,
.data_in_num = I2S_PIN_NO_CHANGE};
i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX);
i2s_config.sample_rate = newSampleRate; // This must match VBAN Outgoing Stream SampleRate parameter
i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT; // apparently built-in DAC only enabled on I2S0 which only allows 16bit?
i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT;
i2s_config.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_STAND_MSB);
i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1; // default interrupt priority
i2s_config.dma_buf_count = DMA_BUFF_COUNT;
i2s_config.dma_buf_len = newDmaBufLen;
i2s_config.use_apll = false;
// i2s_config.tx_desc_auto_clear = true;
if (i2s_running == 255)
{
ESP_ERROR_CHECK(i2s_stop(i2s_num));
ESP_ERROR_CHECK(i2s_driver_uninstall(i2s_num));
}
ESP_ERROR_CHECK(i2s_driver_install(i2s_num, &i2s_config, 0, NULL)); // install and start i2s driver
ESP_ERROR_CHECK(i2s_set_pin(i2s_num, &pin_config));
// ESP_ERROR_CHECK( i2s_set_dac_mode(I2S_DAC_CHANNEL_LEFT_EN) ); // RIGHT=GPIO25, LEFT=GPIO26
ESP_ERROR_CHECK(i2s_zero_dma_buffer(i2s_num));
i2s_set_clk(i2s_num, newSampleRate, 32, I2S_CHANNEL_STEREO);
i2s_running = 255;
audioBufferFilled = 0;
}