239 lines
6.9 KiB
C
239 lines
6.9 KiB
C
/**
|
|
******************************************************************************
|
|
* File Name : SAI.c
|
|
* Description : This file provides code for the configuration
|
|
* of the SAI instances.
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
|
|
* All rights reserved.</center></h2>
|
|
*
|
|
* 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****/
|