mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-01 18:50:34 +03:00
feat(i2s): support to lazy constitute full-duplex mode
This commit is contained in:
@@ -835,7 +835,9 @@ STD RX 模式
|
||||
|
||||
请注意,一个句柄只能代表一个通道,因此仍然需要对 TX 和 RX 通道逐个进行声道和时钟配置。
|
||||
|
||||
以下示例展示了如何分配两个全双工通道:
|
||||
驱动支持两种分配全双工通道的方法:
|
||||
|
||||
1. 在调用 :cpp:func:`i2s_new_channel` 函数时,同时分配 TX 和 RX 通道两个通道。
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
@@ -875,6 +877,47 @@ STD RX 模式
|
||||
|
||||
...
|
||||
|
||||
2. 调用两次 :cpp:func:`i2s_new_channel` 函数分别分配 TX 和 RX 通道,但使用相同配置初始化 TX 和 RX 通道。
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#include "driver/i2s_std.h"
|
||||
#include "driver/gpio.h"
|
||||
|
||||
i2s_chan_handle_t tx_handle;
|
||||
i2s_chan_handle_t rx_handle;
|
||||
|
||||
/* 分配两个 I2S 通道 */
|
||||
i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER);
|
||||
/* 分别分配给 TX 和 RX 通道 */
|
||||
ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &tx_handle, NULL));
|
||||
|
||||
/* 为两个通道设置完全相同的配置,TX 和 RX 将自动组成全双工模式 */
|
||||
i2s_std_config_t std_cfg = {
|
||||
.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(32000),
|
||||
.slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO),
|
||||
.gpio_cfg = {
|
||||
.mclk = I2S_GPIO_UNUSED,
|
||||
.bclk = GPIO_NUM_4,
|
||||
.ws = GPIO_NUM_5,
|
||||
.dout = GPIO_NUM_18,
|
||||
.din = GPIO_NUM_19,
|
||||
.invert_flags = {
|
||||
.mclk_inv = false,
|
||||
.bclk_inv = false,
|
||||
.ws_inv = false,
|
||||
},
|
||||
},
|
||||
};
|
||||
ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle, &std_cfg));
|
||||
ESP_ERROR_CHECK(i2s_channel_enable(tx_handle));
|
||||
// ...
|
||||
ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, NULL, &rx_handle));
|
||||
ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_handle, &std_cfg));
|
||||
ESP_ERROR_CHECK(i2s_channel_enable(rx_handle));
|
||||
|
||||
...
|
||||
|
||||
.. only:: SOC_I2S_HW_VERSION_1
|
||||
|
||||
单工模式
|
||||
@@ -891,7 +934,7 @@ STD RX 模式
|
||||
i2s_chan_handle_t rx_handle;
|
||||
|
||||
i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_AUTO, I2S_ROLE_MASTER);
|
||||
i2s_new_channel(&chan_cfg, &tx_handle, NULL);
|
||||
ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &tx_handle, NULL));
|
||||
i2s_std_config_t std_tx_cfg = {
|
||||
.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(48000),
|
||||
.slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO),
|
||||
@@ -909,12 +952,12 @@ STD RX 模式
|
||||
},
|
||||
};
|
||||
/* 初始化通道 */
|
||||
i2s_channel_init_std_mode(tx_handle, &std_tx_cfg);
|
||||
i2s_channel_enable(tx_handle);
|
||||
ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle, &std_tx_cfg));
|
||||
ESP_ERROR_CHECK(i2s_channel_enable(tx_handle));
|
||||
|
||||
/* 如果没有找到其他可用的 I2S 设备,RX 通道将被注册在另一个 I2S 上
|
||||
* 并返回 ESP_ERR_NOT_FOUND */
|
||||
i2s_new_channel(&chan_cfg, NULL, &rx_handle);
|
||||
ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, NULL, &rx_handle));
|
||||
i2s_std_config_t std_rx_cfg = {
|
||||
.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(16000),
|
||||
.slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_STEREO),
|
||||
@@ -931,8 +974,8 @@ STD RX 模式
|
||||
},
|
||||
},
|
||||
};
|
||||
i2s_channel_init_std_mode(rx_handle, &std_rx_cfg);
|
||||
i2s_channel_enable(rx_handle);
|
||||
ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_handle, &std_rx_cfg));
|
||||
ESP_ERROR_CHECK(i2s_channel_enable(rx_handle));
|
||||
|
||||
.. only:: SOC_I2S_HW_VERSION_2
|
||||
|
||||
@@ -951,7 +994,7 @@ STD RX 模式
|
||||
i2s_chan_handle_t tx_handle;
|
||||
i2s_chan_handle_t rx_handle;
|
||||
i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER);
|
||||
i2s_new_channel(&chan_cfg, &tx_handle, NULL);
|
||||
ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &tx_handle, NULL));
|
||||
i2s_std_config_t std_tx_cfg = {
|
||||
.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(48000),
|
||||
.slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO),
|
||||
@@ -969,12 +1012,12 @@ STD RX 模式
|
||||
},
|
||||
};
|
||||
/* 初始化通道 */
|
||||
i2s_channel_init_std_mode(tx_handle, &std_tx_cfg);
|
||||
i2s_channel_enable(tx_handle);
|
||||
ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle, &std_tx_cfg));
|
||||
ESP_ERROR_CHECK(i2s_channel_enable(tx_handle));
|
||||
|
||||
/* 如果没有找到其他可用的 I2S 设备,RX 通道将被注册在另一个 I2S 上
|
||||
* 并返回 ESP_ERR_NOT_FOUND */
|
||||
i2s_new_channel(&chan_cfg, NULL, &rx_handle); // RX 和 TX 通道都将注册在 I2S0 上,但配置可以不同
|
||||
ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, NULL, &rx_handle)); // RX 和 TX 通道都将注册在 I2S0 上,但配置可以不同
|
||||
i2s_std_config_t std_rx_cfg = {
|
||||
.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(16000),
|
||||
.slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_STEREO),
|
||||
@@ -991,8 +1034,8 @@ STD RX 模式
|
||||
},
|
||||
},
|
||||
};
|
||||
i2s_channel_init_std_mode(rx_handle, &std_rx_cfg);
|
||||
i2s_channel_enable(rx_handle);
|
||||
ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_handle, &std_rx_cfg));
|
||||
ESP_ERROR_CHECK(i2s_channel_enable(rx_handle));
|
||||
|
||||
.. only:: SOC_I2S_SUPPORTS_ETM
|
||||
|
||||
|
||||
Reference in New Issue
Block a user