打印
[研电赛技术支持]

GD32A490 I2S音频传输

[复制链接]
15|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Puchou|  楼主 | 2025-2-11 18:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
项目场景:
`GD32A490 I2S音频传输

例如:项目场景:使用CJC8988 CODEC芯片实现两路对功能

问题描述
`I2S DMA配置完接收不到数据



代码和文档说法不匹配
代码和文档说法不匹配,ADD_I2S只能是slave;其次,ADD_I2S配TX在内部会自动反向为RX;RX同理也是

    /* configure I2S1 and I2S1_ADD */
    i2s_init(SPI1, I2S_MODE_MASTERTX, I2S_STD_PHILLIPS, I2S_CKPL_LOW);       
    i2s_psc_config(SPI1, I2S_AUDIOSAMPLE_44K, I2S_FRAMEFORMAT_DT24B_CH32B, I2S_MCKOUT_ENABLE);
    i2s_full_duplex_mode_config(I2S1_ADD, I2S_MODE_SLAVETX, I2S_STD_PHILLIPS, I2S_CKPL_LOW, I2S_FRAMEFORMAT_DT24B_CH32B);


I2S DMA中断 上电后进一次发送 接收中断 然后也不再进中断了
需修改为循环模式
    dma_init_struct.circular_mode       = DMA_CIRCULAR_MODE_ENABLE;


解决方案:
I2S DMA完整配置代码
/--------------注意!! 发声噪音很饿大后修改:I2S_STD_PHILLIPS改为I2S_STD_MSB-----------------/

/*!
    \brief      enable the peripheral clock
    \param[in]  none
    \param[out] none
    \retval     none
*/
void I2S_rcu_config(void)
{
    /* enable GPIOB clock */
    rcu_periph_clock_enable(RCU_GPIOB);
    /* enable GPIOB clock */
//    rcu_periph_clock_enable(RCU_GPIOC);       
    /* enable I2C0 clock */
    rcu_periph_clock_enable(RCU_SPI1);
    /* enable DMA0 clock */
    rcu_periph_clock_enable(RCU_DMA0);       
}

/*!
    \brief      configure the SPI peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void I2S_gpio_config(void)
{
    gpio_af_set(I2S1_WS_PORT, GPIO_AF_5, I2S1_WS_PIN);
    gpio_af_set(I2S1_CK_PORT, GPIO_AF_5, I2S1_CK_PIN);
    gpio_af_set(I2S1_ADD_SD_PORT, GPIO_AF_6, I2S1_ADD_SD_PIN);
    gpio_af_set(I2S1_SD_PORT, GPIO_AF_5, I2S1_SD_PIN);
//    gpio_af_set(I2S1_MCLK_PORT, GPIO_AF_5, I2S1_MCLK_PIN);       
       
    /* configure I2S1 and I2S1_ADD pins: I2S1_WS(PB12), I2S1_CK(PB13), I2S1_SD(PB15), I2S1_ADD_SD(PI2) */
    gpio_mode_set(I2S1_WS_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, I2S1_WS_PIN | I2S1_CK_PIN | I2S1_ADD_SD_PIN | I2S1_SD_PIN);
    gpio_output_options_set(I2S1_WS_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, I2S1_WS_PIN | I2S1_CK_PIN | I2S1_ADD_SD_PIN | I2S1_SD_PIN);
       
//    gpio_mode_set(I2S1_MCLK_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, I2S1_MCLK_PIN);
//    gpio_output_options_set(I2S1_MCLK_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, I2S1_MCLK_PIN);
       


}

void I2S_dma_config(void)
{
    spi_i2s_deinit(SPI1);

    /* configure I2S1 and I2S1_ADD */
    i2s_init(SPI1, I2S_MODE_MASTERTX, I2S_STD_MSB, I2S_CKPL_LOW);       
    i2s_psc_config(SPI1, I2S_AUDIOSAMPLE_44K, I2S_FRAMEFORMAT_DT16B_CH16B, I2S_MCKOUT_ENABLE);
    i2s_full_duplex_mode_config(I2S1_ADD, I2S_MODE_SLAVETX, I2S_STD_MSB, I2S_CKPL_LOW, I2S_FRAMEFORMAT_DT16B_CH16B);

//    /* enable the I2S1 peripheral */
//    i2s_enable(SPI1);       
    dma_single_data_parameter_struct dma_init_struct;

    dma_single_data_para_struct_init(&dma_init_struct);

    /* configure SPI1 transmit dma */
    dma_deinit(DMA0, DMA_CH4);
    dma_init_struct.periph_addr         = (uint32_t)&SPI_DATA(SPI1);
    dma_init_struct.memory0_addr        = (uint32_t)i2s1_txbuffer;
    dma_init_struct.direction           = DMA_MEMORY_TO_PERIPH;
    dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
    dma_init_struct.priority            = DMA_PRIORITY_LOW;
    dma_init_struct.number              = ARRAYSIZE;
    dma_init_struct.periph_inc          = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.memory_inc          = DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.circular_mode       = DMA_CIRCULAR_MODE_ENABLE;
    dma_single_data_mode_init(DMA0, DMA_CH4, &dma_init_struct);
    dma_channel_subperipheral_select(DMA0, DMA_CH4, DMA_SUBPERI0);

               
    /* configure I2S1_ADD receive dma */
    dma_deinit(DMA0, DMA_CH3);
    dma_init_struct.periph_addr  = (uint32_t)&SPI_DATA(I2S1_ADD);
    dma_init_struct.memory0_addr = (uint32_t)i2s1_rxbuffer;
    dma_init_struct.direction    = DMA_PERIPH_TO_MEMORY;
    dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
    dma_init_struct.number              = ARRAYSIZE;
    dma_init_struct.periph_inc          = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.memory_inc          = DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.circular_mode       = DMA_CIRCULAR_MODE_ENABLE;               
    dma_init_struct.priority     = DMA_PRIORITY_HIGH;
    dma_single_data_mode_init(DMA0, DMA_CH3, &dma_init_struct);

    dma_channel_subperipheral_select(DMA0, DMA_CH3, DMA_SUBPERI3);
          dma_interrupt_enable(DMA0, DMA_CH4,DMA_CHXCTL_FTFIE);
        dma_interrupt_enable(DMA0, DMA_CH3,DMA_CHXCTL_FTFIE);       
    nvic_priority_group_set(NVIC_PRIGROUP_PRE0_SUB4);
    nvic_irq_enable(DMA0_Channel3_IRQn, 0, 1);
    /* enable SPI DMA */
    spi_dma_enable(I2S1_ADD, SPI_DMA_RECEIVE);       
    nvic_irq_enable(DMA0_Channel4_IRQn, 0, 1);       
    spi_dma_enable(SPI1, SPI_DMA_TRANSMIT);       

  /* enbale I2S and I2S_ADD*/

    i2s_enable(I2S1_ADD);
    i2s_enable(SPI1);
       
    dma_channel_enable(DMA0, DMA_CH4);
    dma_channel_enable(DMA0, DMA_CH3);  
               
}
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_46029027/article/details/145517392

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

37

帖子

0

粉丝