mirror of
https://github.com/espressif/esp-idf.git
synced 2026-05-19 23:45:28 +02:00
i2s: add basic examples for STD/TDM/PDM mode
This commit is contained in:
@@ -67,6 +67,8 @@ static esp_err_t i2s_pdm_tx_set_clock(i2s_chan_handle_t handle, const i2s_pdm_tx
|
||||
portENTER_CRITICAL(&g_i2s.spinlock);
|
||||
/* Set clock configurations in HAL*/
|
||||
i2s_hal_set_tx_clock(&handle->controller->hal, &clk_info, clk_cfg->clk_src);
|
||||
/* Work aroud for PDM TX clock, set the raw division directly to reduce the noise */
|
||||
i2s_ll_tx_set_raw_clk_div(handle->controller->hal.dev, 1, 1, 0, 0);
|
||||
portEXIT_CRITICAL(&g_i2s.spinlock);
|
||||
|
||||
/* Update the mode info: clock configuration */
|
||||
@@ -114,8 +116,14 @@ static esp_err_t i2s_pdm_tx_set_gpio(i2s_chan_handle_t handle, const i2s_pdm_tx_
|
||||
ESP_ERR_INVALID_ARG, TAG, "clk gpio is invalid");
|
||||
ESP_RETURN_ON_FALSE((gpio_cfg->dout == -1 || GPIO_IS_VALID_GPIO(gpio_cfg->dout)),
|
||||
ESP_ERR_INVALID_ARG, TAG, "dout gpio is invalid");
|
||||
i2s_pdm_tx_config_t *pdm_tx_cfg = (i2s_pdm_tx_config_t *)handle->mode_info;
|
||||
/* Set data output GPIO */
|
||||
i2s_gpio_check_and_set(gpio_cfg->dout, i2s_periph_signal[id].data_out_sig, false, false);
|
||||
#if SOC_I2S_HW_VERSION_2
|
||||
if (pdm_tx_cfg->slot_cfg.line_mode == I2S_PDM_TX_TWO_LINE_DAC) {
|
||||
i2s_gpio_check_and_set(gpio_cfg->dout2, i2s_periph_signal[id].data_out1_sig, false, false);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (handle->role == I2S_ROLE_SLAVE) {
|
||||
/* For "tx + slave" mode, select TX signal index for ws and bck */
|
||||
@@ -132,7 +140,6 @@ static esp_err_t i2s_pdm_tx_set_gpio(i2s_chan_handle_t handle, const i2s_pdm_tx_
|
||||
i2s_ll_mclk_bind_to_tx_clk(handle->controller->hal.dev);
|
||||
#endif
|
||||
/* Update the mode info: gpio configuration */
|
||||
i2s_pdm_tx_config_t *pdm_tx_cfg = (i2s_pdm_tx_config_t *)handle->mode_info;
|
||||
memcpy(&(pdm_tx_cfg->gpio_cfg), gpio_cfg, sizeof(i2s_pdm_tx_gpio_config_t));
|
||||
|
||||
return ESP_OK;
|
||||
@@ -189,6 +196,7 @@ esp_err_t i2s_channel_init_pdm_tx_mode(i2s_chan_handle_t handle, const i2s_pdm_t
|
||||
/* Initialization finished, mark state as ready */
|
||||
handle->state = I2S_CHAN_STATE_READY;
|
||||
xSemaphoreGive(handle->mutex);
|
||||
ESP_LOGD(TAG, "The tx channel on I2S0 has been initialized to PDM TX mode successfully");
|
||||
return ret;
|
||||
|
||||
err:
|
||||
@@ -460,6 +468,7 @@ esp_err_t i2s_channel_init_pdm_rx_mode(i2s_chan_handle_t handle, const i2s_pdm_r
|
||||
/* Initialization finished, mark state as ready */
|
||||
handle->state = I2S_CHAN_STATE_READY;
|
||||
xSemaphoreGive(handle->mutex);
|
||||
ESP_LOGD(TAG, "The rx channel on I2S0 has been initialized to PDM RX mode successfully");
|
||||
return ret;
|
||||
|
||||
err:
|
||||
|
||||
Reference in New Issue
Block a user