-
GD32H757XXX 的USB Audio通过I2S传输音频问题
当选择的是"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); }
1354浏览量 1回复量 关注量 -
极海32F030芯片读写保护时,没找到xx32F0xx Flash_OPT.FLM文件 sos
#define OB_BASE ((uint32_t)0x1FFFF800) /*!< FLASH Option Bytes base address */#define OB ((OB_TypeDef *) OB_BASE) FLASH_Status FLASH_OB_Erase(void) { uint16_t rdptmp = OB_RDP_Level_0; FLASH_Status status = FLASH_COMPLETE; /* Get the actual read protection Option Byte value */ if(FLASH_OB_GetRDP() != RESET) { rdptmp = 0x00; } /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); if(status == FLASH_COMPLETE) { /* If the previous operation is completed, proceed to erase the option bytes */ FLASH->CR |= FLASH_CR_OPTER; FLASH->CR |= FLASH_CR_STRT; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); if(status == FLASH_COMPLETE) { /* If the erase operation is completed, disable the OPTER Bit */ FLASH->CR &= ~FLASH_CR_OPTER; /* Enable the Option Bytes Programming operation */ FLASH->CR |= FLASH_CR_OPTPG; /* Restore the last read protection Option Byte value */ OB->RDP = (uint16_t)rdptmp; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); if(status != FLASH_TIMEOUT) { /* if the program operation is completed, disable the OPTPG Bit */ FLASH->CR &= ~FLASH_CR_OPTPG; } } else { if (status != FLASH_TIMEOUT) { /* Disable the OPTPG Bit */ FLASH->CR &= ~FLASH_CR_OPTPG; } } } /* Return the erase status */ return status; } 请问有用过极海的读保护的吗,这个OPT.FLM文件去哪找
3115浏览量 0回复量 关注量 -
请教器件手册里常有 Sourced from process XX 是啥意思?
Sourced from process XX , XX 是个数字,在好多器件手册里看到,XX 也因器件不同而不同,请教这是啥意思?
1164浏览量 1回复量 关注量 -
如何将已定义的常数数组的地址重新定义为原地址减32?
51单片机,keil V4 编译器:已定义:code unsigned char C_LED7_CODE_ADDR[]={xxxxxxx}; 我现在需要重新定义一个常数数组C_LED7_CODE[],其起始地址为上述数组地址减32、不影响数组内容和其它程序,可以做到吗?
1267浏览量 1回复量 关注量