问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - I2S
  • GD32H757XXX 的USB Audio通过I2S传输音频问题 sos

    当选择的是"I2S1"后播放音频,对应管脚示波器测量波形正常,但配置为其他几个I2S(I2S0, I2S2, I2S5) 后每个管脚的波形都出不来, 时钟和对应的管脚选择上都核对没问题, 找不到什么原因。 void codec_audio_interface_init(uint32_t audio_freq){ i2s_audiofreq = audio_freq; /* enable the AD_I2S peripheral clock */ rcu_periph_clock_enable(AD_I2S_CLK); rcu_spi_clock_config(IDX_SPI1, RCU_SPISRC_PLL0Q); /* AD_I2S peripheral configuration */ spi_i2s_deinit(AD_I2S); /* initialize the I2S peripheral with the structure above */ i2s_psc_config(AD_I2S, audio_freq, I2S_FRAMEFORMAT_DT16B_CH16B, #ifdef IIS_MCLK_ENABLED I2S_MCKOUT_ENABLE #elif defined(IIS_MCLK_DISABLED) I2S_MCKOUT_DISABLE #endif /* IIS_MCLK_ENABLED */ ); i2s_init(AD_I2S, I2S_MODE_MASTERTX, I2S_STD_MSB, I2S_CKPL_HIGH); /* enable the I2S DMA TX request */ spi_dma_enable(AD_I2S, SPI_DMA_TRANSMIT); } void codec_gpio_init(void) { /* enable GPIO clock */ rcu_periph_clock_enable(AD_I2S_WS_CLK); rcu_periph_clock_enable(AD_I2S_SCK_CLK); rcu_periph_clock_enable(AD_I2S_SD_CLK); rcu_periph_clock_enable(RCU_SYSCFG); /* AD_I2S pins configuration: WS, SCK and SD pins */ gpio_mode_set(AD_I2S_WS_GPIO, GPIO_MODE_AF, GPIO_PUPD_NONE, AD_I2S_WS_PIN); gpio_output_options_set(AD_I2S_WS_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_85MHZ, AD_I2S_WS_PIN); gpio_af_set(AD_I2S_WS_GPIO, GPIO_AF_5, AD_I2S_WS_PIN); gpio_mode_set(AD_I2S_SCK_GPIO, GPIO_MODE_AF, GPIO_PUPD_NONE, AD_I2S_SCK_PIN); gpio_output_options_set(AD_I2S_SCK_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_85MHZ, AD_I2S_SCK_PIN); gpio_af_set(AD_I2S_SCK_GPIO, GPIO_AF_5, AD_I2S_SCK_PIN); gpio_mode_set(AD_I2S_SD_GPIO, GPIO_MODE_AF, GPIO_PUPD_NONE, AD_I2S_SD_PIN); gpio_output_options_set(AD_I2S_SD_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_85MHZ, AD_I2S_SD_PIN); gpio_af_set(AD_I2S_SD_GPIO, GPIO_AF_5, AD_I2S_SD_PIN); #ifdef IIS_MCLK_ENABLED /* enable GPIO clock */ rcu_periph_clock_enable(AD_I2S_MCK_CLK); /* codec_i2s pins configuration: MCK pin */ gpio_mode_set(AD_I2S_MCK_GPIO, GPIO_MODE_AF, GPIO_PUPD_NONE, AD_I2S_MCK_PIN); gpio_output_options_set(AD_I2S_MCK_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_85MHZ, AD_I2S_MCK_PIN); gpio_af_set(AD_I2S_MCK_GPIO, GPIO_AF_5, AD_I2S_MCK_PIN); #endif /* IIS_MCLK_ENABLED */ } void codec_dma_init(void) { /* enable the DMA clock */ rcu_periph_clock_enable(AD_DMA_CLOCK); rcu_periph_clock_enable(RCU_DMAMUX); /* configure the DMA Stream */ dma_channel_enable(AD_DMA, AD_DMA_CHANNEL); dma_deinit(AD_DMA, AD_DMA_CHANNEL); dma_single_data_para_struct_init(&dma_initstructure); /* set the parameters to be configured */ dma_initstructure.request = DMA_REQUEST_SPI1_TX; dma_initstructure.periph_addr = AD_I2S_ADDRESS; dma_initstructure.memory0_addr = (uint32_t)0; /* this field will be configured in play function */ dma_initstructure.direction = DMA_MEMORY_TO_PERIPH; dma_initstructure.number = (uint32_t)0xFFFE; /* this field will be configured in play function */ dma_initstructure.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_initstructure.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_initstructure.periph_memory_width = AD_DMA_PERIPH_DATA_SIZE; dma_initstructure.circular_mode = DMA_CIRCULAR_MODE_DISABLE; dma_initstructure.priority = DMA_PRIORITY_ULTRA_HIGH; dma_single_data_mode_init(AD_DMA, AD_DMA_CHANNEL, &dma_initstructure); /* clear the DMA flags */ dma_flag_clear(AD_DMA, AD_DMA_CHANNEL, DMA_FLAG_FEE); dma_flag_clear(AD_DMA, AD_DMA_CHANNEL, DMA_FLAG_SDE); dma_flag_clear(AD_DMA, AD_DMA_CHANNEL, DMA_FLAG_TAE); dma_flag_clear(AD_DMA, AD_DMA_CHANNEL, DMA_FLAG_HTF); dma_flag_clear(AD_DMA, AD_DMA_CHANNEL, DMA_FLAG_FTF); /* enable the selected DMA interrupts */ dma_interrupt_enable(AD_DMA, AD_DMA_CHANNEL, DMA_CHXCTL_FTFIE); /* enable the I2S DMA request */ spi_dma_enable(AD_I2S, SPI_DMA_TRANSMIT); /* I2S DMA IRQ channel configuration */ nvic_irq_enable(AD_DMA_IRQ, AD_IRQ_PREPRIO, AD_IRQ_SUBRIO); } void audio_play(uint32_t addr, uint32_t size) { /* disable the I2S DMA Stream*/ dma_channel_disable(AD_DMA, AD_DMA_CHANNEL); /* clear the DMA flags */ dma_flag_clear(AD_DMA, AD_DMA_CHANNEL, DMA_FLAG_FEE); dma_flag_clear(AD_DMA, AD_DMA_CHANNEL, DMA_FLAG_SDE); dma_flag_clear(AD_DMA, AD_DMA_CHANNEL, DMA_FLAG_TAE); dma_flag_clear(AD_DMA, AD_DMA_CHANNEL, DMA_FLAG_HTF); dma_flag_clear(AD_DMA, AD_DMA_CHANNEL, DMA_FLAG_FTF); /* configure the buffer address and size */ dma_initstructure.memory0_addr = (uint32_t)addr; dma_initstructure.number = (uint32_t)(size); /* configure the DMA Stream with the new parameters */ dma_single_data_mode_init(AD_DMA, AD_DMA_CHANNEL, &dma_initstructure); /* enable the I2S DMA Stream*/ dma_channel_enable(AD_DMA, AD_DMA_CHANNEL); /* if the i2s peripheral is still not enabled, enable it */ if(0U == (SPI_I2SCTL(AD_I2S) & I2S_ENABLE_MASK)) { i2s_enable(AD_I2S); } /* SPI master start transfer */ spi_master_transfer_start(AD_I2S, SPI_TRANS_START); }

    GD32 单片机 USB Audio xx I2S 音频

    665浏览量 0回复量 关注量
  • 模数转换芯片ADC_CJC5340 24位精度只有20位有变化 sos

    在使用I2S协议读取CJC5340的值时,发现只有前20位数字有变动,剩下4位一直为零,比如最大只能到7FFFF000,不能7FFFFF00,示波器查看确实是应该为0,为什么最低四位无变动,查看波型的变化正常的10到20hz全部测试过了。

    ADC I2S 模数转换芯片 精度 hz

    2046浏览量 0回复量 关注量
  • GD32F4xx ,I2S 全双工 , I2S_ADD 支持中断吗?

    [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px]1、GD32F407,I2S 配置为全双工模式,其中 I2S_ADD 支持中断操作吗??[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px]2、如果能,I2S_ADD的中断函数入口是,SPI1_IRQHandler()吗??[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px]3、如果是,进入中断后,获取中断标志 & 获取数据的方式,如下对吗?![/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] void SPI1_IRQHandler(void)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] {[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] if(RESET != spi_i2s_interrupt_flag_get(I2S1_ADD, SPI_I2S_INT_RBNE))[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] {[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] rt_uint16_t data;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] // read spi_data[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] data = = spi_i2s_data_receive(I2S1_ADD);[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] // new block send a event ?[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] }[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(242, 249, 253)][font=Tahoma, "][size=16px] }[/size][/font][/backcolor][/color]

    MCU gd32f4xx AD 全双工 I2S

    3047浏览量 1回复量 关注量
  • GD32F407 I2S 全双工,I2S_ADD 支持中断操作吗?

    [i=s] 本帖最后由 onlysd 于 2024-8-30 16:12 编辑 [/i] 1、GD32F407,I2S 配置为全双工模式,其中 I2S_ADD 支持中断操作吗?? 2、如果能,I2S_ADD的中断函数入口是,SPI1_IRQHandler()吗?? 3、如果是,进入中断后,获取中断标志 & 获取数据的方式,如下对吗?! void SPI1_IRQHandler(void) { if(RESET != spi_i2s_interrupt_flag_get(I2S1_ADD, SPI_I2S_INT_RBNE)) { rt_uint16_t data; // read spi_data data = = spi_i2s_data_receive(I2S1_ADD); // new block send a event ? } }

    GigaDevice MCU GD32F407 AD I2S

    1920浏览量 2回复量 关注量
  • F460的I2S的问题?连接ES8388.

    学习了例程i2s_record_and_play。有几个地方没看懂。 void BSP_WM8731_TransCompleteCallBack(void) { if (0U != u8TransCompleteFlag) { BSP_WM8731_Play(&u32TransBuf[1][0], BSP_WM8731_DMA_BLK_LEN); u8TransCompleteFlag = 0U; } else { BSP_WM8731_Play(&u32TransBuf[0][0], BSP_WM8731_DMA_BLK_LEN); u8TransCompleteFlag = 1U; } DMA_ClearTransCompleteStatus(BSP_WM8731_DMA_SDIN_UNIT, BSP_WM8731_DMA_SD_INT_CH); } 发送完成的DMA中断为什么要清楚接收DMA的传送完成标志。 同样接收完成的DMA中断中也清除了发送DMA的传送完成标志。 我的程序是这样的。 /* INT_SRC_DMA1_TC0 Callback.send to I2S */ static void INT_SRC_DMA1_TC0_IrqCallback(void) { //add your codes here if (0U != u8TransCompleteFlag) { BSP_ES8388_Play(&u32TransBuf[0][0], DMACount); u8TransCompleteFlag = 0U; } else { BSP_ES8388_Play(&u32TransBuf[1][0], DMACount); u8TransCompleteFlag = 1U; } // DMA_ClearTransCompleteStatus(CM_DMA1, DMA_INT_TC_CH0); } /* INT_SRC_DMA2_TC0 Callback. */ static void INT_SRC_DMA2_TC0_IrqCallback(void) { //add your codes here if (0U != u8ReceiveCompleteFlag) { BSP_ES8388_Record(&u32ReceiveBuf[0][0], DMACount); // (void)memcpy((uint8_t *)&u32TransBuf[1][0], (uint8_t *)&u32ReceiveBuf[1][0], (BSP_WM8731_DMA_BLK_LEN * 4U)); u8ReceiveCompleteFlag = 0U; } else { BSP_ES8388_Record(&u32ReceiveBuf[1][0], DMACount); // (void)memcpy((uint8_t *)&u32TransBuf[0][0], (uint8_t *)&u32ReceiveBuf[0][0], (BSP_WM8731_DMA_BLK_LEN * 4U)); u8ReceiveCompleteFlag = 1U; } // DMA_ClearTransCompleteStatus(CM_DMA2, DMA_INT_TC_CH0); } DMACount设成了1024,倒是可以采样上了数据。给左右通道输入了正弦波,可以正常采集。但是有一些问题。今天断开了left通道,只给right通道正弦波,发现了一个奇怪的现象,left和right通道采集的数据交替出现正弦波,是哪里发生错位了呢?

    F460 I2S 左右错位

    3330浏览量 8回复量 关注量
  • 国民技术MCU-N32G45x系列I2S的引脚配置问题

    国民技术MCU:N32G452CBL7,在配置I2S的引脚时发现,规格书提供的只有3个引脚,分别是I2S_SD、I2S_WS、I2S_CK,至于MCLK,规格书中描述的是:“主时钟(独立映射,可选),输出 256 × F S 的时钟频率。”,只有这样一句话,不太理解这个引脚是怎么选的。。

    国民技术 MCU N32G45 I2S

    1623浏览量 1回复量 关注量
  • 用HC32F460的I2S连接WM8978音频IC

    I2S为主模式,MCK允许,EXCK禁止,配置了I2S,允许TXEN,配置DMA,触发为TX输出中断,中断配置了回调函数,当允许DMA通道后,没有进入发送中断。不知错在那,搜索 [align=left]复制[/align] 另外问一上,I2S在不接外部的WM8978模块时,是不是也有数据输出。

    hc32f460 I2S WM8978 音频

    1914浏览量 1回复量 关注量