NXP MCU 技术论坛
直播中

王静

8年用户 1612经验值
私信 关注
[问答]

为什么无法在启动I2S通道的情况下初始化USB堆栈?

在我的应用程序中,我想使用两个编解码器 ES8311,但我无法初始化两个 I2S 通道,只能初始化其中一个。而且我无法在启动 I2S 通道的情况下初始化 USB 堆栈。

I2S初始化代码:
代码:全选
#define TRANSCEIVER_I2S_NUM         (0)
#define HEADPHONES_I2S_NUM          (1)

...

static esp_err_t transceiver_i2s_driver_init(void)
{
    i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG((i2s_port_t)TRANSCEIVER_I2S_NUM, I2S_ROLE_MASTER);
    chan_cfg.auto_clear = true; // Auto clear the legacy data in the DMA buffer
    ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &transceiver_tx_handle, &transceiver_rx_handle));
    i2s_std_config_t std_cfg = {
        .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(EXAMPLE_SAMPLE_RATE),
        .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO),
        .gpio_cfg = {
            .mclk = (gpio_num_t)CONFIG_TRANSCEIVER_I2S_MCK,
            .bclk = (gpio_num_t)CONFIG_TRANSCEIVER_I2S_BCK,
            .ws = (gpio_num_t)CONFIG_TRANSCEIVER_I2S_WS,
            .dout = (gpio_num_t)CONFIG_TRANSCEIVER_I2S_DOUT,
            .din = (gpio_num_t)CONFIG_TRANSCEIVER_I2S_DIN,
            .invert_flags = {
                .mclk_inv = false,
                .bclk_inv = false,
                .ws_inv = false,
            },
        },
    };
    std_cfg.clk_cfg.mclk_multiple = (i2s_mclk_multiple_t)EXAMPLE_MCLK_MULTIPLE;

    ESP_ERROR_CHECK(i2s_channel_init_std_mode(transceiver_tx_handle, &std_cfg));
    ESP_ERROR_CHECK(i2s_channel_init_std_mode(transceiver_rx_handle, &std_cfg));
    ESP_ERROR_CHECK(i2s_channel_enable(transceiver_tx_handle));
    ESP_ERROR_CHECK(i2s_channel_enable(transceiver_rx_handle));
    return ESP_OK;
}

static esp_err_t headphones_i2s_driver_init(void)
{
    i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG((i2s_port_t)HEADPHONES_I2S_NUM, I2S_ROLE_MASTER);
    chan_cfg.auto_clear = true; // Auto clear the legacy data in the DMA buffer
    ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &headphones_tx_handle, &headphones_rx_handle));
    i2s_std_config_t std_cfg = {
        .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(EXAMPLE_SAMPLE_RATE),
        .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO),
        .gpio_cfg = {
            .mclk = (gpio_num_t)CONFIG_HEADPHONES_I2S_MCK,
            .bclk = (gpio_num_t)CONFIG_HEADPHONES_I2S_BCK,
            .ws = (gpio_num_t)CONFIG_HEADPHONES_I2S_WS,
            .dout = (gpio_num_t)CONFIG_HEADPHONES_I2S_DOUT,
            .din = (gpio_num_t)CONFIG_HEADPHONES_I2S_DIN,
            .invert_flags = {
                .mclk_inv = false,
                .bclk_inv = false,
                .ws_inv = false,
            },
        },
    };
    std_cfg.clk_cfg.mclk_multiple = (i2s_mclk_multiple_t)EXAMPLE_MCLK_MULTIPLE;

    ESP_ERROR_CHECK(i2s_channel_init_std_mode(headphones_tx_handle, &std_cfg));
    ESP_ERROR_CHECK(i2s_channel_init_std_mode(headphones_rx_handle, &std_cfg));
    ESP_ERROR_CHECK(i2s_channel_enable(headphones_tx_handle));
    ESP_ERROR_CHECK(i2s_channel_enable(headphones_rx_handle));
    return ESP_OK;
}



当我尝试初始化它们时输出:
代码:全选
E (1730) gdma: gdma_install_tx_interrupt(800): alloc interrupt failed
E (1730) gdma: gdma_register_tx_event_callbacks(399): install interrupt service failed
E (1730) gdma: gdma_install_rx_interrupt(773): alloc interrupt failed
E (1740) gdma: gdma_register_rx_event_callbacks(435): install interrupt service failed

我认为它与选择 DMA 通道有关...

你能帮我解决这个问题吗,尤其是 DMA 通道选择

更多回帖

发帖
×
20
完善资料,
赚取积分