完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
在CUBEMX生成的STM32F407VET6的I2S主机接收模式与I2S主机发送模式 如何进行动态调整 或者如何实现主机全双工?
初始化如下: I2S_HandleTypeDef hi2s2; DMA_HandleTypeDef hdma_spi2_tx; /[i] I2S2 init function / void MX_I2S2_Init(void) { /[i] USER CODE BEGIN I2S2_Init 0 / /[i] USER CODE END I2S2_Init 0 / /[i] USER CODE BEGIN I2S2_Init 1 / /[i] USER CODE END I2S2_Init 1 / hi2s2.Instance = SPI2; hi2s2.Init.Mode = I2S_MODE_MASTER_TX; hi2s2.Init.Standard = I2S_STANDARD_PHILIPS; hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B; hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE; hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_48K; hi2s2.Init.CPOL = I2S_CPOL_LOW; hi2s2.Init.ClockSource = I2S_CLOCK_PLL; hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE; if (HAL_I2S_Init(&hi2s2) != HAL_OK) { Error_Handler();} /[i] USER CODE BEGIN I2S2_Init 2 / /[i] USER CODE END I2S2_Init 2 / } void HAL_I2S_MspInit(I2S_HandleTypeDef* i2sHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; if(i2sHandle->Instance==SPI2) { /[i] USER CODE BEGIN SPI2_MspInit 0 / /[i] USER CODE END SPI2_MspInit 0 / /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S; PeriphClkInitStruct.PLLI2S.PLLI2SN = 72; PeriphClkInitStruct.PLLI2S.PLLI2SR = 3; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } /[i] I2S2 clock enable / __HAL_RCC_SPI2_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /**I2S2 GPIO Configuration PC3 ------> I2S2_SD PB12 ------> I2S2_WS PB13 ------> I2S2_CK PC6 ------> I2S2_MCK */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /[i] I2S2 DMA Init / /[i] SPI2_TX Init / hdma_spi2_tx.Instance = DMA1_Stream4; hdma_spi2_tx.Init.Channel = DMA_CHANNEL_0; hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi2_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_spi2_tx.Init.Mode = DMA_CIRCULAR; hdma_spi2_tx.Init.Priority = DMA_PRIORITY_LOW; hdma_spi2_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; hdma_spi2_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma_spi2_tx.Init.MemBurst = DMA_MBURST_SINGLE; hdma_spi2_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; if (HAL_DMA_Init(&hdma_spi2_tx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(i2sHandle,hdmatx,hdma_spi2_tx);/[i] USER CODE BEGIN SPI2_MspInit 1 / // hdma_spi2_rx.Instance->CR |= (DMA_IT_HT | DMA_IT_TC); // 或通过HAL_DMA_Init() // __HAL_DMA_ENABLE_IT(&hdma_spi2_rx,DMA_IT_TC|DMA_IT_HT); /[i] USER CODE END SPI2_MspInit 1 / } } void HAL_I2S_MspDeInit(I2S_HandleTypeDef* i2sHandle) { if(i2sHandle->Instance==SPI2) { /[i] USER CODE BEGIN SPI2_MspDeInit 0 / /[i] USER CODE END SPI2_MspDeInit 0 / /[i] Peripheral clock disable / __HAL_RCC_SPI2_CLK_DISABLE(); /**I2S2 GPIO Configuration PC3 ------> I2S2_SD PB12 ------> I2S2_WS PB13 ------> I2S2_CK PC6 ------> I2S2_MCK */ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3|GPIO_PIN_6); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12|GPIO_PIN_13); /[i] I2S2 DMA DeInit / HAL_DMA_DeInit(i2sHandle->hdmatx);/[i] USER CODE BEGIN SPI2_MspDeInit 1 / /[i] USER CODE END SPI2_MspDeInit 1 / } } 接收配置 I2S_HandleTypeDef hi2s2; DMA_HandleTypeDef hdma_spi2_rx; /[i] I2S2 init function / void MX_I2S2_Init(void) { /[i] USER CODE BEGIN I2S2_Init 0 / /[i] USER CODE END I2S2_Init 0 / /[i] USER CODE BEGIN I2S2_Init 1 / /[i] USER CODE END I2S2_Init 1 / hi2s2.Instance = SPI2; hi2s2.Init.Mode = I2S_MODE_MASTER_RX; hi2s2.Init.Standard = I2S_STANDARD_PHILIPS; hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B; hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE; hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_48K; hi2s2.Init.CPOL = I2S_CPOL_LOW; hi2s2.Init.ClockSource = I2S_CLOCK_PLL; hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE; if (HAL_I2S_Init(&hi2s2) != HAL_OK) { Error_Handler();} /[i] USER CODE BEGIN I2S2_Init 2 / /[i] USER CODE END I2S2_Init 2 / } void HAL_I2S_MspInit(I2S_HandleTypeDef* i2sHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; if(i2sHandle->Instance==SPI2) { /[i] USER CODE BEGIN SPI2_MspInit 0 / /[i] USER CODE END SPI2_MspInit 0 / /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S; PeriphClkInitStruct.PLLI2S.PLLI2SN = 72; PeriphClkInitStruct.PLLI2S.PLLI2SR = 3; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } /[i] I2S2 clock enable / __HAL_RCC_SPI2_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /**I2S2 GPIO Configuration PC3 ------> I2S2_SD PB12 ------> I2S2_WS PB13 ------> I2S2_CK PC6 ------> I2S2_MCK */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /[i] I2S2 DMA Init / /[i] SPI2_RX Init / hdma_spi2_rx.Instance = DMA1_Stream3; hdma_spi2_rx.Init.Channel = DMA_CHANNEL_0; hdma_spi2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_spi2_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi2_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_spi2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_spi2_rx.Init.Mode = DMA_CIRCULAR; hdma_spi2_rx.Init.Priority = DMA_PRIORITY_MEDIUM; hdma_spi2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_spi2_rx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(i2sHandle,hdmarx,hdma_spi2_rx);/[i] USER CODE BEGIN SPI2_MspInit 1 / // hdma_spi2_rx.Instance->CR |= (DMA_IT_HT | DMA_IT_TC); // 或通过HAL_DMA_Init() // __HAL_DMA_ENABLE_IT(&hdma_spi2_rx,DMA_IT_TC|DMA_IT_HT); /[i] USER CODE END SPI2_MspInit 1 / } } void HAL_I2S_MspDeInit(I2S_HandleTypeDef* i2sHandle) { if(i2sHandle->Instance==SPI2) { /[i] USER CODE BEGIN SPI2_MspDeInit 0 / /[i] USER CODE END SPI2_MspDeInit 0 / /[i] Peripheral clock disable / __HAL_RCC_SPI2_CLK_DISABLE(); /**I2S2 GPIO Configuration PC3 ------> I2S2_SD PB12 ------> I2S2_WS PB13 ------> I2S2_CK PC6 ------> I2S2_MCK */ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3|GPIO_PIN_6); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12|GPIO_PIN_13); /[i] I2S2 DMA DeInit / HAL_DMA_DeInit(i2sHandle->hdmarx);/[i] USER CODE BEGIN SPI2_MspDeInit 1 / /[i] USER CODE END SPI2_MspDeInit 1 / } } |
|
相关推荐
1个回答
|
|
|
在STM32F407上实现I2S全双工通信(同时发送和接收)需要以下配置和步骤: 1. CubeMX配置关键点2. DMA配置(必须启用TX和RX双通道)3. 关键初始化步骤在 4. 启动全双工传输5. 动态调整实现方法5.1 实时调整采样率5.2 动态切换数据格式(16/32位)6. 全双工实现原理图关键注意事项:
调试建议:
|
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4200 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3261 浏览 1 评论
2791 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2224 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
15129 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3164浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1939浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2106浏览 3评论
2019浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2216浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 20:23 , Processed in 0.626175 second(s), Total 45, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
664