/** ****************************************************************************** * File Name : SAI.c * Description : This file provides code for the configuration * of the SAI instances. ****************************************************************************** * @attention * *

© Copyright (c) 2021 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "sai.h" #include "gpio.h" /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ SAI_HandleTypeDef hsai_BlockA2; SAI_HandleTypeDef hsai_BlockB2; /* SAI2 init function */ void MX_SAI2_Init(void) { /* USER CODE BEGIN SAI2_Init 0 */ /* USER CODE END SAI2_Init 0 */ /* USER CODE BEGIN SAI2_Init 1 */ /* USER CODE END SAI2_Init 1 */ /* USER CODE BEGIN SAI2_Init 1 */ /* USER CODE END SAI2_Init 1 */ hsai_BlockA2.Instance = SAI2_Block_A; hsai_BlockA2.Init.Protocol = SAI_SPDIF_PROTOCOL; hsai_BlockA2.Init.AudioMode = SAI_MODEMASTER_TX; hsai_BlockA2.Init.Synchro = SAI_ASYNCHRONOUS; hsai_BlockA2.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE; hsai_BlockA2.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY; hsai_BlockA2.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_48K; hsai_BlockA2.Init.SynchroExt = SAI_SYNCEXT_DISABLE; hsai_BlockA2.Init.MonoStereoMode = SAI_STEREOMODE; hsai_BlockA2.Init.CompandingMode = SAI_NOCOMPANDING; hsai_BlockA2.Init.PdmInit.Activation = DISABLE; hsai_BlockA2.Init.PdmInit.MicPairsNbr = 1; hsai_BlockA2.Init.PdmInit.ClockEnable = SAI_PDM_CLOCK1_ENABLE; if (HAL_SAI_Init(&hsai_BlockA2) != HAL_OK) { Error_Handler(); } hsai_BlockB2.Instance = SAI2_Block_B; hsai_BlockB2.Init.Protocol = SAI_FREE_PROTOCOL; hsai_BlockB2.Init.AudioMode = SAI_MODEMASTER_TX; hsai_BlockB2.Init.DataSize = SAI_DATASIZE_8; hsai_BlockB2.Init.FirstBit = SAI_FIRSTBIT_MSB; hsai_BlockB2.Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE; hsai_BlockB2.Init.Synchro = SAI_ASYNCHRONOUS; hsai_BlockB2.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE; hsai_BlockB2.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE; hsai_BlockB2.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY; hsai_BlockB2.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_192K; hsai_BlockB2.Init.SynchroExt = SAI_SYNCEXT_DISABLE; hsai_BlockB2.Init.MonoStereoMode = SAI_STEREOMODE; hsai_BlockB2.Init.CompandingMode = SAI_NOCOMPANDING; hsai_BlockB2.Init.TriState = SAI_OUTPUT_NOTRELEASED; hsai_BlockB2.Init.PdmInit.Activation = DISABLE; hsai_BlockB2.Init.PdmInit.MicPairsNbr = 1; hsai_BlockB2.Init.PdmInit.ClockEnable = SAI_PDM_CLOCK1_ENABLE; hsai_BlockB2.FrameInit.FrameLength = 8; hsai_BlockB2.FrameInit.ActiveFrameLength = 1; hsai_BlockB2.FrameInit.FSDefinition = SAI_FS_STARTFRAME; hsai_BlockB2.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW; hsai_BlockB2.FrameInit.FSOffset = SAI_FS_FIRSTBIT; hsai_BlockB2.SlotInit.FirstBitOffset = 0; hsai_BlockB2.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE; hsai_BlockB2.SlotInit.SlotNumber = 1; hsai_BlockB2.SlotInit.SlotActive = 0x00000000; if (HAL_SAI_Init(&hsai_BlockB2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN SAI2_Init 2 */ /* USER CODE END SAI2_Init 2 */ } static uint32_t SAI2_client =0; void HAL_SAI_MspInit(SAI_HandleTypeDef* hsai) { GPIO_InitTypeDef GPIO_InitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /* SAI2 */ if(hsai->Instance==SAI2_Block_A) { /* SAI2 clock enable */ /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SAI2; PeriphClkInitStruct.Sai23ClockSelection = RCC_SAI23CLKSOURCE_PLL; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } if (SAI2_client == 0) { __HAL_RCC_SAI2_CLK_ENABLE(); } SAI2_client ++; /**SAI2_A_Block_A GPIO Configuration PD11 ------> SAI2_SD_A */ GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF10_SAI2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); } if(hsai->Instance==SAI2_Block_B) { /* SAI2 clock enable */ /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SAI2; PeriphClkInitStruct.Sai23ClockSelection = RCC_SAI23CLKSOURCE_PLL; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } if (SAI2_client == 0) { __HAL_RCC_SAI2_CLK_ENABLE(); } SAI2_client ++; /**SAI2_B_Block_B GPIO Configuration PC0 ------> SAI2_FS_B PH2 ------> SAI2_SCK_B PA0 ------> SAI2_SD_B PH3 ------> SAI2_MCLK_B */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF8_SAI2; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF10_SAI2; HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF10_SAI2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } } void HAL_SAI_MspDeInit(SAI_HandleTypeDef* hsai) { /* SAI2 */ if(hsai->Instance==SAI2_Block_A) { SAI2_client --; if (SAI2_client == 0) { /* Peripheral clock disable */ __HAL_RCC_SAI2_CLK_DISABLE(); } /**SAI2_A_Block_A GPIO Configuration PD11 ------> SAI2_SD_A */ HAL_GPIO_DeInit(GPIOD, GPIO_PIN_11); } if(hsai->Instance==SAI2_Block_B) { SAI2_client --; if (SAI2_client == 0) { /* Peripheral clock disable */ __HAL_RCC_SAI2_CLK_DISABLE(); } /**SAI2_B_Block_B GPIO Configuration PC0 ------> SAI2_FS_B PH2 ------> SAI2_SCK_B PA0 ------> SAI2_SD_B PH3 ------> SAI2_MCLK_B */ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0); HAL_GPIO_DeInit(GPIOH, GPIO_PIN_2|GPIO_PIN_3); HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0); } } /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/