Library to control Silicon Labs SI570 10 MHZ TO 1.4 GHZ I2C PROGRAMMABLE XO/VCXO.

Dependencies:   mbed

Fork of SI570 by Gerrit Polder

Committer:
DL3LD
Date:
Sun Mar 27 06:55:59 2016 +0000
Revision:
1:1556bcaaf759
STM32F746NG SI570 VFO Test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DL3LD 1:1556bcaaf759 1 /**
DL3LD 1:1556bcaaf759 2 ******************************************************************************
DL3LD 1:1556bcaaf759 3 * @file stm32746g_discovery_audio.c
DL3LD 1:1556bcaaf759 4 * @author MCD Application Team
DL3LD 1:1556bcaaf759 5 * @version V1.0.0
DL3LD 1:1556bcaaf759 6 * @date 25-June-2015
DL3LD 1:1556bcaaf759 7 * @brief This file provides the Audio driver for the STM32746G-Discovery board.
DL3LD 1:1556bcaaf759 8 @verbatim
DL3LD 1:1556bcaaf759 9 How To use this driver:
DL3LD 1:1556bcaaf759 10 -----------------------
DL3LD 1:1556bcaaf759 11 + This driver supports STM32F7xx devices on STM32746G-Discovery (MB1191) board.
DL3LD 1:1556bcaaf759 12 + Call the function BSP_AUDIO_OUT_Init(
DL3LD 1:1556bcaaf759 13 OutputDevice: physical output mode (OUTPUT_DEVICE_SPEAKER,
DL3LD 1:1556bcaaf759 14 OUTPUT_DEVICE_HEADPHONE or OUTPUT_DEVICE_BOTH)
DL3LD 1:1556bcaaf759 15 Volume : Initial volume to be set (0 is min (mute), 100 is max (100%)
DL3LD 1:1556bcaaf759 16 AudioFreq : Audio frequency in Hz (8000, 16000, 22500, 32000...)
DL3LD 1:1556bcaaf759 17 this parameter is relative to the audio file/stream type.
DL3LD 1:1556bcaaf759 18 )
DL3LD 1:1556bcaaf759 19 This function configures all the hardware required for the audio application (codec, I2C, SAI,
DL3LD 1:1556bcaaf759 20 GPIOs, DMA and interrupt if needed). This function returns AUDIO_OK if configuration is OK.
DL3LD 1:1556bcaaf759 21 If the returned value is different from AUDIO_OK or the function is stuck then the communication with
DL3LD 1:1556bcaaf759 22 the codec or the MFX has failed (try to un-plug the power or reset device in this case).
DL3LD 1:1556bcaaf759 23 - OUTPUT_DEVICE_SPEAKER : only speaker will be set as output for the audio stream.
DL3LD 1:1556bcaaf759 24 - OUTPUT_DEVICE_HEADPHONE: only headphones will be set as output for the audio stream.
DL3LD 1:1556bcaaf759 25 - OUTPUT_DEVICE_BOTH : both Speaker and Headphone are used as outputs for the audio stream
DL3LD 1:1556bcaaf759 26 at the same time.
DL3LD 1:1556bcaaf759 27 Note. On STM32746G-Discovery SAI_DMA is configured in CIRCULAR mode. Due to this the application
DL3LD 1:1556bcaaf759 28 does NOT need to call BSP_AUDIO_OUT_ChangeBuffer() to assure streaming.
DL3LD 1:1556bcaaf759 29 + Call the function BSP_DISCOVERY_AUDIO_OUT_Play(
DL3LD 1:1556bcaaf759 30 pBuffer: pointer to the audio data file address
DL3LD 1:1556bcaaf759 31 Size : size of the buffer to be sent in Bytes
DL3LD 1:1556bcaaf759 32 )
DL3LD 1:1556bcaaf759 33 to start playing (for the first time) from the audio file/stream.
DL3LD 1:1556bcaaf759 34 + Call the function BSP_AUDIO_OUT_Pause() to pause playing
DL3LD 1:1556bcaaf759 35 + Call the function BSP_AUDIO_OUT_Resume() to resume playing.
DL3LD 1:1556bcaaf759 36 Note. After calling BSP_AUDIO_OUT_Pause() function for pause, only BSP_AUDIO_OUT_Resume() should be called
DL3LD 1:1556bcaaf759 37 for resume (it is not allowed to call BSP_AUDIO_OUT_Play() in this case).
DL3LD 1:1556bcaaf759 38 Note. This function should be called only when the audio file is played or paused (not stopped).
DL3LD 1:1556bcaaf759 39 + For each mode, you may need to implement the relative callback functions into your code.
DL3LD 1:1556bcaaf759 40 The Callback functions are named AUDIO_OUT_XXX_CallBack() and only their prototypes are declared in
DL3LD 1:1556bcaaf759 41 the stm32746g_discovery_audio.h file. (refer to the example for more details on the callbacks implementations)
DL3LD 1:1556bcaaf759 42 + To Stop playing, to modify the volume level, the frequency, the audio frame slot,
DL3LD 1:1556bcaaf759 43 the device output mode the mute or the stop, use the functions: BSP_AUDIO_OUT_SetVolume(),
DL3LD 1:1556bcaaf759 44 AUDIO_OUT_SetFrequency(), BSP_AUDIO_OUT_SetAudioFrameSlot(), BSP_AUDIO_OUT_SetOutputMode(),
DL3LD 1:1556bcaaf759 45 BSP_AUDIO_OUT_SetMute() and BSP_AUDIO_OUT_Stop().
DL3LD 1:1556bcaaf759 46 + The driver API and the callback functions are at the end of the stm32746g_discovery_audio.h file.
DL3LD 1:1556bcaaf759 47
DL3LD 1:1556bcaaf759 48 Driver architecture:
DL3LD 1:1556bcaaf759 49 --------------------
DL3LD 1:1556bcaaf759 50 + This driver provides the High Audio Layer: consists of the function API exported in the stm32746g_discovery_audio.h file
DL3LD 1:1556bcaaf759 51 (BSP_AUDIO_OUT_Init(), BSP_AUDIO_OUT_Play() ...)
DL3LD 1:1556bcaaf759 52 + This driver provide also the Media Access Layer (MAL): which consists of functions allowing to access the media containing/
DL3LD 1:1556bcaaf759 53 providing the audio file/stream. These functions are also included as local functions into
DL3LD 1:1556bcaaf759 54 the stm32746g_discovery_audio_codec.c file (SAIx_Out_Init() and SAIx_Out_DeInit(), SAIx_In_Init() and SAIx_In_DeInit())
DL3LD 1:1556bcaaf759 55
DL3LD 1:1556bcaaf759 56 Known Limitations:
DL3LD 1:1556bcaaf759 57 ------------------
DL3LD 1:1556bcaaf759 58 1- If the TDM Format used to play in parallel 2 audio Stream (the first Stream is configured in codec SLOT0 and second
DL3LD 1:1556bcaaf759 59 Stream in SLOT1) the Pause/Resume, volume and mute feature will control the both streams.
DL3LD 1:1556bcaaf759 60 2- Parsing of audio file is not implemented (in order to determine audio file properties: Mono/Stereo, Data size,
DL3LD 1:1556bcaaf759 61 File size, Audio Frequency, Audio Data header size ...). The configuration is fixed for the given audio file.
DL3LD 1:1556bcaaf759 62 3- Supports only Stereo audio streaming.
DL3LD 1:1556bcaaf759 63 4- Supports only 16-bits audio data size.
DL3LD 1:1556bcaaf759 64 @endverbatim
DL3LD 1:1556bcaaf759 65 ******************************************************************************
DL3LD 1:1556bcaaf759 66 * @attention
DL3LD 1:1556bcaaf759 67 *
DL3LD 1:1556bcaaf759 68 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
DL3LD 1:1556bcaaf759 69 *
DL3LD 1:1556bcaaf759 70 * Redistribution and use in source and binary forms, with or without modification,
DL3LD 1:1556bcaaf759 71 * are permitted provided that the following conditions are met:
DL3LD 1:1556bcaaf759 72 * 1. Redistributions of source code must retain the above copyright notice,
DL3LD 1:1556bcaaf759 73 * this list of conditions and the following disclaimer.
DL3LD 1:1556bcaaf759 74 * 2. Redistributions in binary form must reproduce the above copyright notice,
DL3LD 1:1556bcaaf759 75 * this list of conditions and the following disclaimer in the documentation
DL3LD 1:1556bcaaf759 76 * and/or other materials provided with the distribution.
DL3LD 1:1556bcaaf759 77 * 3. Neither the name of STMicroelectronics nor the names of its contributors
DL3LD 1:1556bcaaf759 78 * may be used to endorse or promote products derived from this software
DL3LD 1:1556bcaaf759 79 * without specific prior written permission.
DL3LD 1:1556bcaaf759 80 *
DL3LD 1:1556bcaaf759 81 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
DL3LD 1:1556bcaaf759 82 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
DL3LD 1:1556bcaaf759 83 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DL3LD 1:1556bcaaf759 84 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
DL3LD 1:1556bcaaf759 85 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DL3LD 1:1556bcaaf759 86 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
DL3LD 1:1556bcaaf759 87 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
DL3LD 1:1556bcaaf759 88 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
DL3LD 1:1556bcaaf759 89 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
DL3LD 1:1556bcaaf759 90 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
DL3LD 1:1556bcaaf759 91 *
DL3LD 1:1556bcaaf759 92 ******************************************************************************
DL3LD 1:1556bcaaf759 93 */
DL3LD 1:1556bcaaf759 94
DL3LD 1:1556bcaaf759 95 /* Includes ------------------------------------------------------------------*/
DL3LD 1:1556bcaaf759 96 #include "stm32746g_discovery_audio.h"
DL3LD 1:1556bcaaf759 97
DL3LD 1:1556bcaaf759 98 /** @addtogroup BSP
DL3LD 1:1556bcaaf759 99 * @{
DL3LD 1:1556bcaaf759 100 */
DL3LD 1:1556bcaaf759 101
DL3LD 1:1556bcaaf759 102 /** @addtogroup STM32746G_DISCOVERY
DL3LD 1:1556bcaaf759 103 * @{
DL3LD 1:1556bcaaf759 104 */
DL3LD 1:1556bcaaf759 105
DL3LD 1:1556bcaaf759 106 /** @defgroup STM32746G_DISCOVERY_AUDIO STM32746G_DISCOVERY AUDIO
DL3LD 1:1556bcaaf759 107 * @brief This file includes the low layer driver for wm8994 Audio Codec
DL3LD 1:1556bcaaf759 108 * available on STM32746G-Discovery board(MB1191).
DL3LD 1:1556bcaaf759 109 * @{
DL3LD 1:1556bcaaf759 110 */
DL3LD 1:1556bcaaf759 111
DL3LD 1:1556bcaaf759 112 /** @defgroup STM32746G_DISCOVERY_AUDIO_Private_Types STM32746G_DISCOVERY AUDIO Private Types
DL3LD 1:1556bcaaf759 113 * @{
DL3LD 1:1556bcaaf759 114 */
DL3LD 1:1556bcaaf759 115 /**
DL3LD 1:1556bcaaf759 116 * @}
DL3LD 1:1556bcaaf759 117 */
DL3LD 1:1556bcaaf759 118
DL3LD 1:1556bcaaf759 119 /** @defgroup STM32746G_DISCOVERY_AUDIO_Private_Defines STM32746G_DISCOVERY AUDIO Private Defines
DL3LD 1:1556bcaaf759 120 * @{
DL3LD 1:1556bcaaf759 121 */
DL3LD 1:1556bcaaf759 122 /**
DL3LD 1:1556bcaaf759 123 * @}
DL3LD 1:1556bcaaf759 124 */
DL3LD 1:1556bcaaf759 125
DL3LD 1:1556bcaaf759 126 /** @defgroup STM32746G_DISCOVERY_AUDIO_Private_Macros STM32746G_DISCOVERY AUDIO Private Macros
DL3LD 1:1556bcaaf759 127 * @{
DL3LD 1:1556bcaaf759 128 */
DL3LD 1:1556bcaaf759 129 /**
DL3LD 1:1556bcaaf759 130 * @}
DL3LD 1:1556bcaaf759 131 */
DL3LD 1:1556bcaaf759 132
DL3LD 1:1556bcaaf759 133 /** @defgroup STM32746G_DISCOVERY_AUDIO_Private_Variables STM32746G_DISCOVERY AUDIO Private Variables
DL3LD 1:1556bcaaf759 134 * @{
DL3LD 1:1556bcaaf759 135 */
DL3LD 1:1556bcaaf759 136 AUDIO_DrvTypeDef *audio_drv;
DL3LD 1:1556bcaaf759 137 SAI_HandleTypeDef haudio_out_sai={0};
DL3LD 1:1556bcaaf759 138 SAI_HandleTypeDef haudio_in_sai={0};
DL3LD 1:1556bcaaf759 139 TIM_HandleTypeDef haudio_tim;
DL3LD 1:1556bcaaf759 140
DL3LD 1:1556bcaaf759 141 uint16_t __IO AudioInVolume = DEFAULT_AUDIO_IN_VOLUME;
DL3LD 1:1556bcaaf759 142
DL3LD 1:1556bcaaf759 143 /**
DL3LD 1:1556bcaaf759 144 * @}
DL3LD 1:1556bcaaf759 145 */
DL3LD 1:1556bcaaf759 146
DL3LD 1:1556bcaaf759 147 /** @defgroup STM32746G_DISCOVERY_AUDIO_Private_Function_Prototypes STM32746G_DISCOVERY AUDIO Private Function Prototypes
DL3LD 1:1556bcaaf759 148 * @{
DL3LD 1:1556bcaaf759 149 */
DL3LD 1:1556bcaaf759 150 static void AUDIO_IN_INT_IRQHandler(void);
DL3LD 1:1556bcaaf759 151 static void AUDIO_IN_SAIx_DMAx_IRQHandler(void);
DL3LD 1:1556bcaaf759 152 static void AUDIO_OUT_SAIx_DMAx_IRQHandler(void);
DL3LD 1:1556bcaaf759 153 static void SAIx_Out_Init(uint32_t AudioFreq);
DL3LD 1:1556bcaaf759 154 static void SAIx_Out_DeInit(void);
DL3LD 1:1556bcaaf759 155 static void SAIx_In_Init(uint32_t SaiOutMode, uint32_t SlotActive, uint32_t AudioFreq);
DL3LD 1:1556bcaaf759 156 static void SAIx_In_DeInit(void);
DL3LD 1:1556bcaaf759 157 /**
DL3LD 1:1556bcaaf759 158 * @}
DL3LD 1:1556bcaaf759 159 */
DL3LD 1:1556bcaaf759 160
DL3LD 1:1556bcaaf759 161 /** @defgroup STM32746G_DISCOVERY_AUDIO_OUT_Exported_Functions STM32746G_DISCOVERY AUDIO Out Exported Functions
DL3LD 1:1556bcaaf759 162 * @{
DL3LD 1:1556bcaaf759 163 */
DL3LD 1:1556bcaaf759 164
DL3LD 1:1556bcaaf759 165 /**
DL3LD 1:1556bcaaf759 166 * @brief Configures the audio peripherals.
DL3LD 1:1556bcaaf759 167 * @param OutputDevice: OUTPUT_DEVICE_SPEAKER, OUTPUT_DEVICE_HEADPHONE,
DL3LD 1:1556bcaaf759 168 * or OUTPUT_DEVICE_BOTH.
DL3LD 1:1556bcaaf759 169 * @param Volume: Initial volume level (from 0 (Mute) to 100 (Max))
DL3LD 1:1556bcaaf759 170 * @param AudioFreq: Audio frequency used to play the audio stream.
DL3LD 1:1556bcaaf759 171 * @note The I2S PLL input clock must be done in the user application.
DL3LD 1:1556bcaaf759 172 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 173 */
DL3LD 1:1556bcaaf759 174 uint8_t BSP_AUDIO_OUT_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq)
DL3LD 1:1556bcaaf759 175 {
DL3LD 1:1556bcaaf759 176 uint8_t ret = AUDIO_ERROR;
DL3LD 1:1556bcaaf759 177 uint32_t deviceid = 0x00;
DL3LD 1:1556bcaaf759 178
DL3LD 1:1556bcaaf759 179 /* Disable SAI */
DL3LD 1:1556bcaaf759 180 SAIx_Out_DeInit();
DL3LD 1:1556bcaaf759 181
DL3LD 1:1556bcaaf759 182 /* PLL clock is set depending on the AudioFreq (44.1khz vs 48khz groups) */
DL3LD 1:1556bcaaf759 183 BSP_AUDIO_OUT_ClockConfig(&haudio_out_sai, AudioFreq, NULL);
DL3LD 1:1556bcaaf759 184
DL3LD 1:1556bcaaf759 185 /* SAI data transfer preparation:
DL3LD 1:1556bcaaf759 186 Prepare the Media to be used for the audio transfer from memory to SAI peripheral */
DL3LD 1:1556bcaaf759 187 haudio_out_sai.Instance = AUDIO_OUT_SAIx;
DL3LD 1:1556bcaaf759 188 if(HAL_SAI_GetState(&haudio_out_sai) == HAL_SAI_STATE_RESET)
DL3LD 1:1556bcaaf759 189 {
DL3LD 1:1556bcaaf759 190 /* Init the SAI MSP: this __weak function can be redefined by the application*/
DL3LD 1:1556bcaaf759 191 BSP_AUDIO_OUT_MspInit(&haudio_out_sai, NULL);
DL3LD 1:1556bcaaf759 192 }
DL3LD 1:1556bcaaf759 193 SAIx_Out_Init(AudioFreq);
DL3LD 1:1556bcaaf759 194
DL3LD 1:1556bcaaf759 195 /* wm8994 codec initialization */
DL3LD 1:1556bcaaf759 196 deviceid = wm8994_drv.ReadID(AUDIO_I2C_ADDRESS);
DL3LD 1:1556bcaaf759 197
DL3LD 1:1556bcaaf759 198 if((deviceid) == WM8994_ID)
DL3LD 1:1556bcaaf759 199 {
DL3LD 1:1556bcaaf759 200 /* Reset the Codec Registers */
DL3LD 1:1556bcaaf759 201 wm8994_drv.Reset(AUDIO_I2C_ADDRESS);
DL3LD 1:1556bcaaf759 202 /* Initialize the audio driver structure */
DL3LD 1:1556bcaaf759 203 audio_drv = &wm8994_drv;
DL3LD 1:1556bcaaf759 204 ret = AUDIO_OK;
DL3LD 1:1556bcaaf759 205 }
DL3LD 1:1556bcaaf759 206 else
DL3LD 1:1556bcaaf759 207 {
DL3LD 1:1556bcaaf759 208 ret = AUDIO_ERROR;
DL3LD 1:1556bcaaf759 209 }
DL3LD 1:1556bcaaf759 210
DL3LD 1:1556bcaaf759 211 if(ret == AUDIO_OK)
DL3LD 1:1556bcaaf759 212 {
DL3LD 1:1556bcaaf759 213 /* Initialize the codec internal registers */
DL3LD 1:1556bcaaf759 214 audio_drv->Init(AUDIO_I2C_ADDRESS, OutputDevice, Volume, AudioFreq);
DL3LD 1:1556bcaaf759 215 }
DL3LD 1:1556bcaaf759 216
DL3LD 1:1556bcaaf759 217 return ret;
DL3LD 1:1556bcaaf759 218 }
DL3LD 1:1556bcaaf759 219
DL3LD 1:1556bcaaf759 220 /**
DL3LD 1:1556bcaaf759 221 * @brief Starts playing audio stream from a data buffer for a determined size.
DL3LD 1:1556bcaaf759 222 * @param pBuffer: Pointer to the buffer
DL3LD 1:1556bcaaf759 223 * @param Size: Number of audio data in BYTES unit.
DL3LD 1:1556bcaaf759 224 * In memory, first element is for left channel, second element is for right channel
DL3LD 1:1556bcaaf759 225 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 226 */
DL3LD 1:1556bcaaf759 227 uint8_t BSP_AUDIO_OUT_Play(uint16_t* pBuffer, uint32_t Size)
DL3LD 1:1556bcaaf759 228 {
DL3LD 1:1556bcaaf759 229 /* Call the audio Codec Play function */
DL3LD 1:1556bcaaf759 230 if(audio_drv->Play(AUDIO_I2C_ADDRESS, pBuffer, Size) != 0)
DL3LD 1:1556bcaaf759 231 {
DL3LD 1:1556bcaaf759 232 return AUDIO_ERROR;
DL3LD 1:1556bcaaf759 233 }
DL3LD 1:1556bcaaf759 234 else
DL3LD 1:1556bcaaf759 235 {
DL3LD 1:1556bcaaf759 236 /* Update the Media layer and enable it for play */
DL3LD 1:1556bcaaf759 237 HAL_SAI_Transmit_DMA(&haudio_out_sai, (uint8_t*) pBuffer, DMA_MAX(Size / AUDIODATA_SIZE));
DL3LD 1:1556bcaaf759 238
DL3LD 1:1556bcaaf759 239 return AUDIO_OK;
DL3LD 1:1556bcaaf759 240 }
DL3LD 1:1556bcaaf759 241 }
DL3LD 1:1556bcaaf759 242
DL3LD 1:1556bcaaf759 243 /**
DL3LD 1:1556bcaaf759 244 * @brief Sends n-Bytes on the SAI interface.
DL3LD 1:1556bcaaf759 245 * @param pData: pointer on data address
DL3LD 1:1556bcaaf759 246 * @param Size: number of data to be written
DL3LD 1:1556bcaaf759 247 * @retval None
DL3LD 1:1556bcaaf759 248 */
DL3LD 1:1556bcaaf759 249 void BSP_AUDIO_OUT_ChangeBuffer(uint16_t *pData, uint16_t Size)
DL3LD 1:1556bcaaf759 250 {
DL3LD 1:1556bcaaf759 251 HAL_SAI_Transmit_DMA(&haudio_out_sai, (uint8_t*) pData, Size);
DL3LD 1:1556bcaaf759 252 }
DL3LD 1:1556bcaaf759 253
DL3LD 1:1556bcaaf759 254 /**
DL3LD 1:1556bcaaf759 255 * @brief This function Pauses the audio file stream. In case
DL3LD 1:1556bcaaf759 256 * of using DMA, the DMA Pause feature is used.
DL3LD 1:1556bcaaf759 257 * @note When calling BSP_AUDIO_OUT_Pause() function for pause, only
DL3LD 1:1556bcaaf759 258 * BSP_AUDIO_OUT_Resume() function should be called for resume (use of BSP_AUDIO_OUT_Play()
DL3LD 1:1556bcaaf759 259 * function for resume could lead to unexpected behaviour).
DL3LD 1:1556bcaaf759 260 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 261 */
DL3LD 1:1556bcaaf759 262 uint8_t BSP_AUDIO_OUT_Pause(void)
DL3LD 1:1556bcaaf759 263 {
DL3LD 1:1556bcaaf759 264 /* Call the Audio Codec Pause/Resume function */
DL3LD 1:1556bcaaf759 265 if(audio_drv->Pause(AUDIO_I2C_ADDRESS) != 0)
DL3LD 1:1556bcaaf759 266 {
DL3LD 1:1556bcaaf759 267 return AUDIO_ERROR;
DL3LD 1:1556bcaaf759 268 }
DL3LD 1:1556bcaaf759 269 else
DL3LD 1:1556bcaaf759 270 {
DL3LD 1:1556bcaaf759 271 /* Call the Media layer pause function */
DL3LD 1:1556bcaaf759 272 HAL_SAI_DMAPause(&haudio_out_sai);
DL3LD 1:1556bcaaf759 273
DL3LD 1:1556bcaaf759 274 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 275 return AUDIO_OK;
DL3LD 1:1556bcaaf759 276 }
DL3LD 1:1556bcaaf759 277 }
DL3LD 1:1556bcaaf759 278
DL3LD 1:1556bcaaf759 279 /**
DL3LD 1:1556bcaaf759 280 * @brief This function Resumes the audio file stream.
DL3LD 1:1556bcaaf759 281 * @note When calling BSP_AUDIO_OUT_Pause() function for pause, only
DL3LD 1:1556bcaaf759 282 * BSP_AUDIO_OUT_Resume() function should be called for resume (use of BSP_AUDIO_OUT_Play()
DL3LD 1:1556bcaaf759 283 * function for resume could lead to unexpected behaviour).
DL3LD 1:1556bcaaf759 284 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 285 */
DL3LD 1:1556bcaaf759 286 uint8_t BSP_AUDIO_OUT_Resume(void)
DL3LD 1:1556bcaaf759 287 {
DL3LD 1:1556bcaaf759 288 /* Call the Audio Codec Pause/Resume function */
DL3LD 1:1556bcaaf759 289 if(audio_drv->Resume(AUDIO_I2C_ADDRESS) != 0)
DL3LD 1:1556bcaaf759 290 {
DL3LD 1:1556bcaaf759 291 return AUDIO_ERROR;
DL3LD 1:1556bcaaf759 292 }
DL3LD 1:1556bcaaf759 293 else
DL3LD 1:1556bcaaf759 294 {
DL3LD 1:1556bcaaf759 295 /* Call the Media layer pause/resume function */
DL3LD 1:1556bcaaf759 296 HAL_SAI_DMAResume(&haudio_out_sai);
DL3LD 1:1556bcaaf759 297
DL3LD 1:1556bcaaf759 298 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 299 return AUDIO_OK;
DL3LD 1:1556bcaaf759 300 }
DL3LD 1:1556bcaaf759 301 }
DL3LD 1:1556bcaaf759 302
DL3LD 1:1556bcaaf759 303 /**
DL3LD 1:1556bcaaf759 304 * @brief Stops audio playing and Power down the Audio Codec.
DL3LD 1:1556bcaaf759 305 * @param Option: could be one of the following parameters
DL3LD 1:1556bcaaf759 306 * - CODEC_PDWN_SW: for software power off (by writing registers).
DL3LD 1:1556bcaaf759 307 * Then no need to reconfigure the Codec after power on.
DL3LD 1:1556bcaaf759 308 * - CODEC_PDWN_HW: completely shut down the codec (physically).
DL3LD 1:1556bcaaf759 309 * Then need to reconfigure the Codec after power on.
DL3LD 1:1556bcaaf759 310 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 311 */
DL3LD 1:1556bcaaf759 312 uint8_t BSP_AUDIO_OUT_Stop(uint32_t Option)
DL3LD 1:1556bcaaf759 313 {
DL3LD 1:1556bcaaf759 314 /* Call the Media layer stop function */
DL3LD 1:1556bcaaf759 315 HAL_SAI_DMAStop(&haudio_out_sai);
DL3LD 1:1556bcaaf759 316
DL3LD 1:1556bcaaf759 317 /* Call Audio Codec Stop function */
DL3LD 1:1556bcaaf759 318 if(audio_drv->Stop(AUDIO_I2C_ADDRESS, Option) != 0)
DL3LD 1:1556bcaaf759 319 {
DL3LD 1:1556bcaaf759 320 return AUDIO_ERROR;
DL3LD 1:1556bcaaf759 321 }
DL3LD 1:1556bcaaf759 322 else
DL3LD 1:1556bcaaf759 323 {
DL3LD 1:1556bcaaf759 324 if(Option == CODEC_PDWN_HW)
DL3LD 1:1556bcaaf759 325 {
DL3LD 1:1556bcaaf759 326 /* Wait at least 100us */
DL3LD 1:1556bcaaf759 327 HAL_Delay(1);
DL3LD 1:1556bcaaf759 328 }
DL3LD 1:1556bcaaf759 329 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 330 return AUDIO_OK;
DL3LD 1:1556bcaaf759 331 }
DL3LD 1:1556bcaaf759 332 }
DL3LD 1:1556bcaaf759 333
DL3LD 1:1556bcaaf759 334 /**
DL3LD 1:1556bcaaf759 335 * @brief Controls the current audio volume level.
DL3LD 1:1556bcaaf759 336 * @param Volume: Volume level to be set in percentage from 0% to 100% (0 for
DL3LD 1:1556bcaaf759 337 * Mute and 100 for Max volume level).
DL3LD 1:1556bcaaf759 338 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 339 */
DL3LD 1:1556bcaaf759 340 uint8_t BSP_AUDIO_OUT_SetVolume(uint8_t Volume)
DL3LD 1:1556bcaaf759 341 {
DL3LD 1:1556bcaaf759 342 /* Call the codec volume control function with converted volume value */
DL3LD 1:1556bcaaf759 343 if(audio_drv->SetVolume(AUDIO_I2C_ADDRESS, Volume) != 0)
DL3LD 1:1556bcaaf759 344 {
DL3LD 1:1556bcaaf759 345 return AUDIO_ERROR;
DL3LD 1:1556bcaaf759 346 }
DL3LD 1:1556bcaaf759 347 else
DL3LD 1:1556bcaaf759 348 {
DL3LD 1:1556bcaaf759 349 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 350 return AUDIO_OK;
DL3LD 1:1556bcaaf759 351 }
DL3LD 1:1556bcaaf759 352 }
DL3LD 1:1556bcaaf759 353
DL3LD 1:1556bcaaf759 354 /**
DL3LD 1:1556bcaaf759 355 * @brief Enables or disables the MUTE mode by software
DL3LD 1:1556bcaaf759 356 * @param Cmd: Could be AUDIO_MUTE_ON to mute sound or AUDIO_MUTE_OFF to
DL3LD 1:1556bcaaf759 357 * unmute the codec and restore previous volume level.
DL3LD 1:1556bcaaf759 358 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 359 */
DL3LD 1:1556bcaaf759 360 uint8_t BSP_AUDIO_OUT_SetMute(uint32_t Cmd)
DL3LD 1:1556bcaaf759 361 {
DL3LD 1:1556bcaaf759 362 /* Call the Codec Mute function */
DL3LD 1:1556bcaaf759 363 if(audio_drv->SetMute(AUDIO_I2C_ADDRESS, Cmd) != 0)
DL3LD 1:1556bcaaf759 364 {
DL3LD 1:1556bcaaf759 365 return AUDIO_ERROR;
DL3LD 1:1556bcaaf759 366 }
DL3LD 1:1556bcaaf759 367 else
DL3LD 1:1556bcaaf759 368 {
DL3LD 1:1556bcaaf759 369 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 370 return AUDIO_OK;
DL3LD 1:1556bcaaf759 371 }
DL3LD 1:1556bcaaf759 372 }
DL3LD 1:1556bcaaf759 373
DL3LD 1:1556bcaaf759 374 /**
DL3LD 1:1556bcaaf759 375 * @brief Switch dynamically (while audio file is played) the output target
DL3LD 1:1556bcaaf759 376 * (speaker or headphone).
DL3LD 1:1556bcaaf759 377 * @param Output: The audio output target: OUTPUT_DEVICE_SPEAKER,
DL3LD 1:1556bcaaf759 378 * OUTPUT_DEVICE_HEADPHONE or OUTPUT_DEVICE_BOTH
DL3LD 1:1556bcaaf759 379 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 380 */
DL3LD 1:1556bcaaf759 381 uint8_t BSP_AUDIO_OUT_SetOutputMode(uint8_t Output)
DL3LD 1:1556bcaaf759 382 {
DL3LD 1:1556bcaaf759 383 /* Call the Codec output device function */
DL3LD 1:1556bcaaf759 384 if(audio_drv->SetOutputMode(AUDIO_I2C_ADDRESS, Output) != 0)
DL3LD 1:1556bcaaf759 385 {
DL3LD 1:1556bcaaf759 386 return AUDIO_ERROR;
DL3LD 1:1556bcaaf759 387 }
DL3LD 1:1556bcaaf759 388 else
DL3LD 1:1556bcaaf759 389 {
DL3LD 1:1556bcaaf759 390 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 391 return AUDIO_OK;
DL3LD 1:1556bcaaf759 392 }
DL3LD 1:1556bcaaf759 393 }
DL3LD 1:1556bcaaf759 394
DL3LD 1:1556bcaaf759 395 /**
DL3LD 1:1556bcaaf759 396 * @brief Updates the audio frequency.
DL3LD 1:1556bcaaf759 397 * @param AudioFreq: Audio frequency used to play the audio stream.
DL3LD 1:1556bcaaf759 398 * @note This API should be called after the BSP_AUDIO_OUT_Init() to adjust the
DL3LD 1:1556bcaaf759 399 * audio frequency.
DL3LD 1:1556bcaaf759 400 * @retval None
DL3LD 1:1556bcaaf759 401 */
DL3LD 1:1556bcaaf759 402 void BSP_AUDIO_OUT_SetFrequency(uint32_t AudioFreq)
DL3LD 1:1556bcaaf759 403 {
DL3LD 1:1556bcaaf759 404 /* PLL clock is set depending by the AudioFreq (44.1khz vs 48khz groups) */
DL3LD 1:1556bcaaf759 405 BSP_AUDIO_OUT_ClockConfig(&haudio_out_sai, AudioFreq, NULL);
DL3LD 1:1556bcaaf759 406
DL3LD 1:1556bcaaf759 407 /* Disable SAI peripheral to allow access to SAI internal registers */
DL3LD 1:1556bcaaf759 408 __HAL_SAI_DISABLE(&haudio_out_sai);
DL3LD 1:1556bcaaf759 409
DL3LD 1:1556bcaaf759 410 /* Update the SAI audio frequency configuration */
DL3LD 1:1556bcaaf759 411 haudio_out_sai.Init.AudioFrequency = AudioFreq;
DL3LD 1:1556bcaaf759 412 HAL_SAI_Init(&haudio_out_sai);
DL3LD 1:1556bcaaf759 413
DL3LD 1:1556bcaaf759 414 /* Enable SAI peripheral to generate MCLK */
DL3LD 1:1556bcaaf759 415 __HAL_SAI_ENABLE(&haudio_out_sai);
DL3LD 1:1556bcaaf759 416 }
DL3LD 1:1556bcaaf759 417
DL3LD 1:1556bcaaf759 418 /**
DL3LD 1:1556bcaaf759 419 * @brief Updates the Audio frame slot configuration.
DL3LD 1:1556bcaaf759 420 * @param AudioFrameSlot: specifies the audio Frame slot
DL3LD 1:1556bcaaf759 421 * This parameter can be one of the following values
DL3LD 1:1556bcaaf759 422 * @arg CODEC_AUDIOFRAME_SLOT_0123
DL3LD 1:1556bcaaf759 423 * @arg CODEC_AUDIOFRAME_SLOT_02
DL3LD 1:1556bcaaf759 424 * @arg CODEC_AUDIOFRAME_SLOT_13
DL3LD 1:1556bcaaf759 425 * @note This API should be called after the BSP_AUDIO_OUT_Init() to adjust the
DL3LD 1:1556bcaaf759 426 * audio frame slot.
DL3LD 1:1556bcaaf759 427 * @retval None
DL3LD 1:1556bcaaf759 428 */
DL3LD 1:1556bcaaf759 429 void BSP_AUDIO_OUT_SetAudioFrameSlot(uint32_t AudioFrameSlot)
DL3LD 1:1556bcaaf759 430 {
DL3LD 1:1556bcaaf759 431 /* Disable SAI peripheral to allow access to SAI internal registers */
DL3LD 1:1556bcaaf759 432 __HAL_SAI_DISABLE(&haudio_out_sai);
DL3LD 1:1556bcaaf759 433
DL3LD 1:1556bcaaf759 434 /* Update the SAI audio frame slot configuration */
DL3LD 1:1556bcaaf759 435 haudio_out_sai.SlotInit.SlotActive = AudioFrameSlot;
DL3LD 1:1556bcaaf759 436 HAL_SAI_Init(&haudio_out_sai);
DL3LD 1:1556bcaaf759 437
DL3LD 1:1556bcaaf759 438 /* Enable SAI peripheral to generate MCLK */
DL3LD 1:1556bcaaf759 439 __HAL_SAI_ENABLE(&haudio_out_sai);
DL3LD 1:1556bcaaf759 440 }
DL3LD 1:1556bcaaf759 441
DL3LD 1:1556bcaaf759 442 /**
DL3LD 1:1556bcaaf759 443 * @brief Deinit the audio peripherals.
DL3LD 1:1556bcaaf759 444 * @retval None
DL3LD 1:1556bcaaf759 445 */
DL3LD 1:1556bcaaf759 446 void BSP_AUDIO_OUT_DeInit(void)
DL3LD 1:1556bcaaf759 447 {
DL3LD 1:1556bcaaf759 448 SAIx_Out_DeInit();
DL3LD 1:1556bcaaf759 449 /* DeInit the SAI MSP : this __weak function can be rewritten by the application */
DL3LD 1:1556bcaaf759 450 BSP_AUDIO_OUT_MspDeInit(&haudio_out_sai, NULL);
DL3LD 1:1556bcaaf759 451 }
DL3LD 1:1556bcaaf759 452
DL3LD 1:1556bcaaf759 453 /**
DL3LD 1:1556bcaaf759 454 * @brief Tx Transfer completed callbacks.
DL3LD 1:1556bcaaf759 455 * @param hsai: SAI handle
DL3LD 1:1556bcaaf759 456 * @retval None
DL3LD 1:1556bcaaf759 457 */
DL3LD 1:1556bcaaf759 458 void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
DL3LD 1:1556bcaaf759 459 {
DL3LD 1:1556bcaaf759 460 /* Manage the remaining file size and new address offset: This function
DL3LD 1:1556bcaaf759 461 should be coded by user (its prototype is already declared in stm32746g_discovery_audio.h) */
DL3LD 1:1556bcaaf759 462 BSP_AUDIO_OUT_TransferComplete_CallBack();
DL3LD 1:1556bcaaf759 463 }
DL3LD 1:1556bcaaf759 464
DL3LD 1:1556bcaaf759 465 /**
DL3LD 1:1556bcaaf759 466 * @brief Tx Half Transfer completed callbacks.
DL3LD 1:1556bcaaf759 467 * @param hsai: SAI handle
DL3LD 1:1556bcaaf759 468 * @retval None
DL3LD 1:1556bcaaf759 469 */
DL3LD 1:1556bcaaf759 470 void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
DL3LD 1:1556bcaaf759 471 {
DL3LD 1:1556bcaaf759 472 /* Manage the remaining file size and new address offset: This function
DL3LD 1:1556bcaaf759 473 should be coded by user (its prototype is already declared in stm32746g_discovery_audio.h) */
DL3LD 1:1556bcaaf759 474 BSP_AUDIO_OUT_HalfTransfer_CallBack();
DL3LD 1:1556bcaaf759 475 }
DL3LD 1:1556bcaaf759 476
DL3LD 1:1556bcaaf759 477 /**
DL3LD 1:1556bcaaf759 478 * @brief SAI error callbacks.
DL3LD 1:1556bcaaf759 479 * @param hsai: SAI handle
DL3LD 1:1556bcaaf759 480 * @retval None
DL3LD 1:1556bcaaf759 481 */
DL3LD 1:1556bcaaf759 482 void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai)
DL3LD 1:1556bcaaf759 483 {
DL3LD 1:1556bcaaf759 484 HAL_SAI_StateTypeDef audio_out_state;
DL3LD 1:1556bcaaf759 485 HAL_SAI_StateTypeDef audio_in_state;
DL3LD 1:1556bcaaf759 486
DL3LD 1:1556bcaaf759 487 audio_out_state = HAL_SAI_GetState(&haudio_out_sai);
DL3LD 1:1556bcaaf759 488 audio_in_state = HAL_SAI_GetState(&haudio_in_sai);
DL3LD 1:1556bcaaf759 489
DL3LD 1:1556bcaaf759 490 /* Determines if it is an audio out or audio in error */
DL3LD 1:1556bcaaf759 491 if ((audio_out_state == HAL_SAI_STATE_BUSY) || (audio_out_state == HAL_SAI_STATE_BUSY_TX)
DL3LD 1:1556bcaaf759 492 || (audio_out_state == HAL_SAI_STATE_TIMEOUT) || (audio_out_state == HAL_SAI_STATE_ERROR))
DL3LD 1:1556bcaaf759 493 {
DL3LD 1:1556bcaaf759 494 BSP_AUDIO_OUT_Error_CallBack();
DL3LD 1:1556bcaaf759 495 }
DL3LD 1:1556bcaaf759 496
DL3LD 1:1556bcaaf759 497 if ((audio_in_state == HAL_SAI_STATE_BUSY) || (audio_in_state == HAL_SAI_STATE_BUSY_RX)
DL3LD 1:1556bcaaf759 498 || (audio_in_state == HAL_SAI_STATE_TIMEOUT) || (audio_in_state == HAL_SAI_STATE_ERROR))
DL3LD 1:1556bcaaf759 499 {
DL3LD 1:1556bcaaf759 500 BSP_AUDIO_IN_Error_CallBack();
DL3LD 1:1556bcaaf759 501 }
DL3LD 1:1556bcaaf759 502 }
DL3LD 1:1556bcaaf759 503
DL3LD 1:1556bcaaf759 504 /**
DL3LD 1:1556bcaaf759 505 * @brief Manages the DMA full Transfer complete event.
DL3LD 1:1556bcaaf759 506 * @retval None
DL3LD 1:1556bcaaf759 507 */
DL3LD 1:1556bcaaf759 508 __weak void BSP_AUDIO_OUT_TransferComplete_CallBack(void)
DL3LD 1:1556bcaaf759 509 {
DL3LD 1:1556bcaaf759 510 }
DL3LD 1:1556bcaaf759 511
DL3LD 1:1556bcaaf759 512 /**
DL3LD 1:1556bcaaf759 513 * @brief Manages the DMA Half Transfer complete event.
DL3LD 1:1556bcaaf759 514 * @retval None
DL3LD 1:1556bcaaf759 515 */
DL3LD 1:1556bcaaf759 516 __weak void BSP_AUDIO_OUT_HalfTransfer_CallBack(void)
DL3LD 1:1556bcaaf759 517 {
DL3LD 1:1556bcaaf759 518 }
DL3LD 1:1556bcaaf759 519
DL3LD 1:1556bcaaf759 520 /**
DL3LD 1:1556bcaaf759 521 * @brief Manages the DMA FIFO error event.
DL3LD 1:1556bcaaf759 522 * @retval None
DL3LD 1:1556bcaaf759 523 */
DL3LD 1:1556bcaaf759 524 __weak void BSP_AUDIO_OUT_Error_CallBack(void)
DL3LD 1:1556bcaaf759 525 {
DL3LD 1:1556bcaaf759 526 }
DL3LD 1:1556bcaaf759 527
DL3LD 1:1556bcaaf759 528 /**
DL3LD 1:1556bcaaf759 529 * @brief Initializes BSP_AUDIO_OUT MSP.
DL3LD 1:1556bcaaf759 530 * @param hsai: SAI handle
DL3LD 1:1556bcaaf759 531 * @param Params
DL3LD 1:1556bcaaf759 532 * @retval None
DL3LD 1:1556bcaaf759 533 */
DL3LD 1:1556bcaaf759 534 __weak void BSP_AUDIO_OUT_MspInit(SAI_HandleTypeDef *hsai, void *Params)
DL3LD 1:1556bcaaf759 535 {
DL3LD 1:1556bcaaf759 536 static DMA_HandleTypeDef hdma_sai_tx;
DL3LD 1:1556bcaaf759 537 GPIO_InitTypeDef gpio_init_structure;
DL3LD 1:1556bcaaf759 538
DL3LD 1:1556bcaaf759 539 /* Enable SAI clock */
DL3LD 1:1556bcaaf759 540 AUDIO_OUT_SAIx_CLK_ENABLE();
DL3LD 1:1556bcaaf759 541
DL3LD 1:1556bcaaf759 542 /* Enable GPIO clock */
DL3LD 1:1556bcaaf759 543 AUDIO_OUT_SAIx_MCLK_ENABLE();
DL3LD 1:1556bcaaf759 544 AUDIO_OUT_SAIx_SCK_SD_ENABLE();
DL3LD 1:1556bcaaf759 545 AUDIO_OUT_SAIx_FS_ENABLE();
DL3LD 1:1556bcaaf759 546 /* CODEC_SAI pins configuration: FS, SCK, MCK and SD pins ------------------*/
DL3LD 1:1556bcaaf759 547 gpio_init_structure.Pin = AUDIO_OUT_SAIx_FS_PIN;
DL3LD 1:1556bcaaf759 548 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
DL3LD 1:1556bcaaf759 549 gpio_init_structure.Pull = GPIO_NOPULL;
DL3LD 1:1556bcaaf759 550 gpio_init_structure.Speed = GPIO_SPEED_HIGH;
DL3LD 1:1556bcaaf759 551 gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF;
DL3LD 1:1556bcaaf759 552 HAL_GPIO_Init(AUDIO_OUT_SAIx_FS_GPIO_PORT, &gpio_init_structure);
DL3LD 1:1556bcaaf759 553
DL3LD 1:1556bcaaf759 554 gpio_init_structure.Pin = AUDIO_OUT_SAIx_SCK_PIN;
DL3LD 1:1556bcaaf759 555 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
DL3LD 1:1556bcaaf759 556 gpio_init_structure.Pull = GPIO_NOPULL;
DL3LD 1:1556bcaaf759 557 gpio_init_structure.Speed = GPIO_SPEED_HIGH;
DL3LD 1:1556bcaaf759 558 gpio_init_structure.Alternate = AUDIO_OUT_SAIx_SCK_AF;
DL3LD 1:1556bcaaf759 559 HAL_GPIO_Init(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, &gpio_init_structure);
DL3LD 1:1556bcaaf759 560
DL3LD 1:1556bcaaf759 561 gpio_init_structure.Pin = AUDIO_OUT_SAIx_SD_PIN;
DL3LD 1:1556bcaaf759 562 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
DL3LD 1:1556bcaaf759 563 gpio_init_structure.Pull = GPIO_NOPULL;
DL3LD 1:1556bcaaf759 564 gpio_init_structure.Speed = GPIO_SPEED_HIGH;
DL3LD 1:1556bcaaf759 565 gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF;
DL3LD 1:1556bcaaf759 566 HAL_GPIO_Init(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, &gpio_init_structure);
DL3LD 1:1556bcaaf759 567
DL3LD 1:1556bcaaf759 568 gpio_init_structure.Pin = AUDIO_OUT_SAIx_MCLK_PIN;
DL3LD 1:1556bcaaf759 569 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
DL3LD 1:1556bcaaf759 570 gpio_init_structure.Pull = GPIO_NOPULL;
DL3LD 1:1556bcaaf759 571 gpio_init_structure.Speed = GPIO_SPEED_HIGH;
DL3LD 1:1556bcaaf759 572 gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF;
DL3LD 1:1556bcaaf759 573 HAL_GPIO_Init(AUDIO_OUT_SAIx_MCLK_GPIO_PORT, &gpio_init_structure);
DL3LD 1:1556bcaaf759 574
DL3LD 1:1556bcaaf759 575 /* Enable the DMA clock */
DL3LD 1:1556bcaaf759 576 AUDIO_OUT_SAIx_DMAx_CLK_ENABLE();
DL3LD 1:1556bcaaf759 577
DL3LD 1:1556bcaaf759 578 if(hsai->Instance == AUDIO_OUT_SAIx)
DL3LD 1:1556bcaaf759 579 {
DL3LD 1:1556bcaaf759 580 /* Configure the hdma_saiTx handle parameters */
DL3LD 1:1556bcaaf759 581 hdma_sai_tx.Init.Channel = AUDIO_OUT_SAIx_DMAx_CHANNEL;
DL3LD 1:1556bcaaf759 582 hdma_sai_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
DL3LD 1:1556bcaaf759 583 hdma_sai_tx.Init.PeriphInc = DMA_PINC_DISABLE;
DL3LD 1:1556bcaaf759 584 hdma_sai_tx.Init.MemInc = DMA_MINC_ENABLE;
DL3LD 1:1556bcaaf759 585 hdma_sai_tx.Init.PeriphDataAlignment = AUDIO_OUT_SAIx_DMAx_PERIPH_DATA_SIZE;
DL3LD 1:1556bcaaf759 586 hdma_sai_tx.Init.MemDataAlignment = AUDIO_OUT_SAIx_DMAx_MEM_DATA_SIZE;
DL3LD 1:1556bcaaf759 587 hdma_sai_tx.Init.Mode = DMA_CIRCULAR;
DL3LD 1:1556bcaaf759 588 hdma_sai_tx.Init.Priority = DMA_PRIORITY_HIGH;
DL3LD 1:1556bcaaf759 589 hdma_sai_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
DL3LD 1:1556bcaaf759 590 hdma_sai_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
DL3LD 1:1556bcaaf759 591 hdma_sai_tx.Init.MemBurst = DMA_MBURST_SINGLE;
DL3LD 1:1556bcaaf759 592 hdma_sai_tx.Init.PeriphBurst = DMA_PBURST_SINGLE;
DL3LD 1:1556bcaaf759 593
DL3LD 1:1556bcaaf759 594 hdma_sai_tx.Instance = AUDIO_OUT_SAIx_DMAx_STREAM;
DL3LD 1:1556bcaaf759 595
DL3LD 1:1556bcaaf759 596 /* Associate the DMA handle */
DL3LD 1:1556bcaaf759 597 __HAL_LINKDMA(hsai, hdmatx, hdma_sai_tx);
DL3LD 1:1556bcaaf759 598
DL3LD 1:1556bcaaf759 599 /* Deinitialize the Stream for new transfer */
DL3LD 1:1556bcaaf759 600 HAL_DMA_DeInit(&hdma_sai_tx);
DL3LD 1:1556bcaaf759 601
DL3LD 1:1556bcaaf759 602 /* Configure the DMA Stream */
DL3LD 1:1556bcaaf759 603 HAL_DMA_Init(&hdma_sai_tx);
DL3LD 1:1556bcaaf759 604 }
DL3LD 1:1556bcaaf759 605 #if ( __MBED__ == 1)
DL3LD 1:1556bcaaf759 606 // Enable interrupt
DL3LD 1:1556bcaaf759 607 IRQn_Type irqn = (IRQn_Type)(AUDIO_OUT_SAIx_DMAx_IRQ);
DL3LD 1:1556bcaaf759 608 NVIC_ClearPendingIRQ(irqn);
DL3LD 1:1556bcaaf759 609 NVIC_DisableIRQ(irqn);
DL3LD 1:1556bcaaf759 610 NVIC_SetPriority(irqn, AUDIO_OUT_IRQ_PREPRIO);
DL3LD 1:1556bcaaf759 611 NVIC_SetVector(irqn, (uint32_t)AUDIO_OUT_SAIx_DMAx_IRQHandler);
DL3LD 1:1556bcaaf759 612 NVIC_EnableIRQ(irqn);
DL3LD 1:1556bcaaf759 613
DL3LD 1:1556bcaaf759 614 #else
DL3LD 1:1556bcaaf759 615 /* SAI DMA IRQ Channel configuration */
DL3LD 1:1556bcaaf759 616 HAL_NVIC_SetPriority(AUDIO_OUT_SAIx_DMAx_IRQ, AUDIO_OUT_IRQ_PREPRIO, 0);
DL3LD 1:1556bcaaf759 617 HAL_NVIC_EnableIRQ(AUDIO_OUT_SAIx_DMAx_IRQ);
DL3LD 1:1556bcaaf759 618 #endif
DL3LD 1:1556bcaaf759 619 }
DL3LD 1:1556bcaaf759 620
DL3LD 1:1556bcaaf759 621 /**
DL3LD 1:1556bcaaf759 622 * @brief Deinitializes SAI MSP.
DL3LD 1:1556bcaaf759 623 * @param hsai: SAI handle
DL3LD 1:1556bcaaf759 624 * @param Params
DL3LD 1:1556bcaaf759 625 * @retval None
DL3LD 1:1556bcaaf759 626 */
DL3LD 1:1556bcaaf759 627 __weak void BSP_AUDIO_OUT_MspDeInit(SAI_HandleTypeDef *hsai, void *Params)
DL3LD 1:1556bcaaf759 628 {
DL3LD 1:1556bcaaf759 629 GPIO_InitTypeDef gpio_init_structure;
DL3LD 1:1556bcaaf759 630
DL3LD 1:1556bcaaf759 631 /* SAI DMA IRQ Channel deactivation */
DL3LD 1:1556bcaaf759 632 HAL_NVIC_DisableIRQ(AUDIO_OUT_SAIx_DMAx_IRQ);
DL3LD 1:1556bcaaf759 633
DL3LD 1:1556bcaaf759 634 if(hsai->Instance == AUDIO_OUT_SAIx)
DL3LD 1:1556bcaaf759 635 {
DL3LD 1:1556bcaaf759 636 /* Deinitialize the DMA stream */
DL3LD 1:1556bcaaf759 637 HAL_DMA_DeInit(hsai->hdmatx);
DL3LD 1:1556bcaaf759 638 }
DL3LD 1:1556bcaaf759 639
DL3LD 1:1556bcaaf759 640 /* Disable SAI peripheral */
DL3LD 1:1556bcaaf759 641 __HAL_SAI_DISABLE(hsai);
DL3LD 1:1556bcaaf759 642
DL3LD 1:1556bcaaf759 643 /* Deactives CODEC_SAI pins FS, SCK, MCK and SD by putting them in input mode */
DL3LD 1:1556bcaaf759 644 gpio_init_structure.Pin = AUDIO_OUT_SAIx_FS_PIN;
DL3LD 1:1556bcaaf759 645 HAL_GPIO_DeInit(AUDIO_OUT_SAIx_FS_GPIO_PORT, gpio_init_structure.Pin);
DL3LD 1:1556bcaaf759 646
DL3LD 1:1556bcaaf759 647 gpio_init_structure.Pin = AUDIO_OUT_SAIx_SCK_PIN;
DL3LD 1:1556bcaaf759 648 HAL_GPIO_DeInit(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, gpio_init_structure.Pin);
DL3LD 1:1556bcaaf759 649
DL3LD 1:1556bcaaf759 650 gpio_init_structure.Pin = AUDIO_OUT_SAIx_SD_PIN;
DL3LD 1:1556bcaaf759 651 HAL_GPIO_DeInit(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, gpio_init_structure.Pin);
DL3LD 1:1556bcaaf759 652
DL3LD 1:1556bcaaf759 653 gpio_init_structure.Pin = AUDIO_OUT_SAIx_MCLK_PIN;
DL3LD 1:1556bcaaf759 654 HAL_GPIO_DeInit(AUDIO_OUT_SAIx_MCLK_GPIO_PORT, gpio_init_structure.Pin);
DL3LD 1:1556bcaaf759 655
DL3LD 1:1556bcaaf759 656 /* Disable SAI clock */
DL3LD 1:1556bcaaf759 657 AUDIO_OUT_SAIx_CLK_DISABLE();
DL3LD 1:1556bcaaf759 658
DL3LD 1:1556bcaaf759 659 /* GPIO pins clock and DMA clock can be shut down in the application
DL3LD 1:1556bcaaf759 660 by surcharging this __weak function */
DL3LD 1:1556bcaaf759 661 }
DL3LD 1:1556bcaaf759 662
DL3LD 1:1556bcaaf759 663 /**
DL3LD 1:1556bcaaf759 664 * @brief Clock Config.
DL3LD 1:1556bcaaf759 665 * @param hsai: might be required to set audio peripheral predivider if any.
DL3LD 1:1556bcaaf759 666 * @param AudioFreq: Audio frequency used to play the audio stream.
DL3LD 1:1556bcaaf759 667 * @param Params
DL3LD 1:1556bcaaf759 668 * @note This API is called by BSP_AUDIO_OUT_Init() and BSP_AUDIO_OUT_SetFrequency()
DL3LD 1:1556bcaaf759 669 * Being __weak it can be overwritten by the application
DL3LD 1:1556bcaaf759 670 * @retval None
DL3LD 1:1556bcaaf759 671 */
DL3LD 1:1556bcaaf759 672 __weak void BSP_AUDIO_OUT_ClockConfig(SAI_HandleTypeDef *hsai, uint32_t AudioFreq, void *Params)
DL3LD 1:1556bcaaf759 673 {
DL3LD 1:1556bcaaf759 674 RCC_PeriphCLKInitTypeDef rcc_ex_clk_init_struct;
DL3LD 1:1556bcaaf759 675
DL3LD 1:1556bcaaf759 676 HAL_RCCEx_GetPeriphCLKConfig(&rcc_ex_clk_init_struct);
DL3LD 1:1556bcaaf759 677
DL3LD 1:1556bcaaf759 678 /* Set the PLL configuration according to the audio frequency */
DL3LD 1:1556bcaaf759 679 if((AudioFreq == AUDIO_FREQUENCY_11K) || (AudioFreq == AUDIO_FREQUENCY_22K) || (AudioFreq == AUDIO_FREQUENCY_44K))
DL3LD 1:1556bcaaf759 680 {
DL3LD 1:1556bcaaf759 681 /* Configure PLLI2S prescalers */
DL3LD 1:1556bcaaf759 682 /* PLLI2S_VCO: VCO_429M
DL3LD 1:1556bcaaf759 683 I2S_CLK(first level) = PLLI2S_VCO/PLLI2SQ = 429/2 = 214.5 Mhz
DL3LD 1:1556bcaaf759 684 I2S_CLK_x = I2S_CLK(first level)/PLLI2SDIVQ = 214.5/19 = 11.289 Mhz */
DL3LD 1:1556bcaaf759 685 rcc_ex_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_SAI2;
DL3LD 1:1556bcaaf759 686 rcc_ex_clk_init_struct.Sai2ClockSelection = RCC_SAI2CLKSOURCE_PLLI2S;
DL3LD 1:1556bcaaf759 687 rcc_ex_clk_init_struct.PLLI2S.PLLI2SN = 429;
DL3LD 1:1556bcaaf759 688 rcc_ex_clk_init_struct.PLLI2S.PLLI2SQ = 2;
DL3LD 1:1556bcaaf759 689 rcc_ex_clk_init_struct.PLLI2SDivQ = 19;
DL3LD 1:1556bcaaf759 690
DL3LD 1:1556bcaaf759 691 HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct);
DL3LD 1:1556bcaaf759 692
DL3LD 1:1556bcaaf759 693 }
DL3LD 1:1556bcaaf759 694 else /* AUDIO_FREQUENCY_8K, AUDIO_FREQUENCY_16K, AUDIO_FREQUENCY_48K), AUDIO_FREQUENCY_96K */
DL3LD 1:1556bcaaf759 695 {
DL3LD 1:1556bcaaf759 696 /* I2S clock config
DL3LD 1:1556bcaaf759 697 PLLI2S_VCO: VCO_344M
DL3LD 1:1556bcaaf759 698 I2S_CLK(first level) = PLLI2S_VCO/PLLI2SQ = 344/7 = 49.142 Mhz
DL3LD 1:1556bcaaf759 699 I2S_CLK_x = I2S_CLK(first level)/PLLI2SDIVQ = 49.142/1 = 49.142 Mhz */
DL3LD 1:1556bcaaf759 700 rcc_ex_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_SAI2;
DL3LD 1:1556bcaaf759 701 rcc_ex_clk_init_struct.Sai2ClockSelection = RCC_SAI2CLKSOURCE_PLLI2S;
DL3LD 1:1556bcaaf759 702 rcc_ex_clk_init_struct.PLLI2S.PLLI2SN = 344;
DL3LD 1:1556bcaaf759 703 rcc_ex_clk_init_struct.PLLI2S.PLLI2SQ = 7;
DL3LD 1:1556bcaaf759 704 rcc_ex_clk_init_struct.PLLI2SDivQ = 1;
DL3LD 1:1556bcaaf759 705
DL3LD 1:1556bcaaf759 706 HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct);
DL3LD 1:1556bcaaf759 707 }
DL3LD 1:1556bcaaf759 708 }
DL3LD 1:1556bcaaf759 709
DL3LD 1:1556bcaaf759 710 /*******************************************************************************
DL3LD 1:1556bcaaf759 711 Static Functions
DL3LD 1:1556bcaaf759 712 *******************************************************************************/
DL3LD 1:1556bcaaf759 713
DL3LD 1:1556bcaaf759 714 /**
DL3LD 1:1556bcaaf759 715 * @brief Initializes the output Audio Codec audio interface (SAI).
DL3LD 1:1556bcaaf759 716 * @param AudioFreq: Audio frequency to be configured for the SAI peripheral.
DL3LD 1:1556bcaaf759 717 * @note The default SlotActive configuration is set to CODEC_AUDIOFRAME_SLOT_0123
DL3LD 1:1556bcaaf759 718 * and user can update this configuration using
DL3LD 1:1556bcaaf759 719 * @retval None
DL3LD 1:1556bcaaf759 720 */
DL3LD 1:1556bcaaf759 721 static void SAIx_Out_Init(uint32_t AudioFreq)
DL3LD 1:1556bcaaf759 722 {
DL3LD 1:1556bcaaf759 723 /* Initialize the haudio_out_sai Instance parameter */
DL3LD 1:1556bcaaf759 724 haudio_out_sai.Instance = AUDIO_OUT_SAIx;
DL3LD 1:1556bcaaf759 725
DL3LD 1:1556bcaaf759 726 /* Disable SAI peripheral to allow access to SAI internal registers */
DL3LD 1:1556bcaaf759 727 __HAL_SAI_DISABLE(&haudio_out_sai);
DL3LD 1:1556bcaaf759 728
DL3LD 1:1556bcaaf759 729 /* Configure SAI_Block_x
DL3LD 1:1556bcaaf759 730 LSBFirst: Disabled
DL3LD 1:1556bcaaf759 731 DataSize: 16 */
DL3LD 1:1556bcaaf759 732 haudio_out_sai.Init.AudioFrequency = AudioFreq;
DL3LD 1:1556bcaaf759 733 haudio_out_sai.Init.AudioMode = SAI_MODEMASTER_TX;
DL3LD 1:1556bcaaf759 734 haudio_out_sai.Init.NoDivider = SAI_MASTERDIVIDER_ENABLED;
DL3LD 1:1556bcaaf759 735 haudio_out_sai.Init.Protocol = SAI_FREE_PROTOCOL;
DL3LD 1:1556bcaaf759 736 haudio_out_sai.Init.DataSize = SAI_DATASIZE_16;
DL3LD 1:1556bcaaf759 737 haudio_out_sai.Init.FirstBit = SAI_FIRSTBIT_MSB;
DL3LD 1:1556bcaaf759 738 haudio_out_sai.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE;
DL3LD 1:1556bcaaf759 739 haudio_out_sai.Init.Synchro = SAI_ASYNCHRONOUS;
DL3LD 1:1556bcaaf759 740 haudio_out_sai.Init.OutputDrive = SAI_OUTPUTDRIVE_ENABLED;
DL3LD 1:1556bcaaf759 741 haudio_out_sai.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF;
DL3LD 1:1556bcaaf759 742
DL3LD 1:1556bcaaf759 743 /* Configure SAI_Block_x Frame
DL3LD 1:1556bcaaf759 744 Frame Length: 64
DL3LD 1:1556bcaaf759 745 Frame active Length: 32
DL3LD 1:1556bcaaf759 746 FS Definition: Start frame + Channel Side identification
DL3LD 1:1556bcaaf759 747 FS Polarity: FS active Low
DL3LD 1:1556bcaaf759 748 FS Offset: FS asserted one bit before the first bit of slot 0 */
DL3LD 1:1556bcaaf759 749 haudio_out_sai.FrameInit.FrameLength = 64;
DL3LD 1:1556bcaaf759 750 haudio_out_sai.FrameInit.ActiveFrameLength = 32;
DL3LD 1:1556bcaaf759 751 haudio_out_sai.FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION;
DL3LD 1:1556bcaaf759 752 haudio_out_sai.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW;
DL3LD 1:1556bcaaf759 753 haudio_out_sai.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
DL3LD 1:1556bcaaf759 754
DL3LD 1:1556bcaaf759 755 /* Configure SAI Block_x Slot
DL3LD 1:1556bcaaf759 756 Slot First Bit Offset: 0
DL3LD 1:1556bcaaf759 757 Slot Size : 16
DL3LD 1:1556bcaaf759 758 Slot Number: 4
DL3LD 1:1556bcaaf759 759 Slot Active: All slot actives */
DL3LD 1:1556bcaaf759 760 haudio_out_sai.SlotInit.FirstBitOffset = 0;
DL3LD 1:1556bcaaf759 761 haudio_out_sai.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE;
DL3LD 1:1556bcaaf759 762 haudio_out_sai.SlotInit.SlotNumber = 4;
DL3LD 1:1556bcaaf759 763 haudio_out_sai.SlotInit.SlotActive = CODEC_AUDIOFRAME_SLOT_0123;
DL3LD 1:1556bcaaf759 764
DL3LD 1:1556bcaaf759 765 HAL_SAI_Init(&haudio_out_sai);
DL3LD 1:1556bcaaf759 766
DL3LD 1:1556bcaaf759 767 /* Enable SAI peripheral to generate MCLK */
DL3LD 1:1556bcaaf759 768 __HAL_SAI_ENABLE(&haudio_out_sai);
DL3LD 1:1556bcaaf759 769 }
DL3LD 1:1556bcaaf759 770
DL3LD 1:1556bcaaf759 771
DL3LD 1:1556bcaaf759 772
DL3LD 1:1556bcaaf759 773 /**
DL3LD 1:1556bcaaf759 774 * @brief Deinitializes the output Audio Codec audio interface (SAI).
DL3LD 1:1556bcaaf759 775 * @retval None
DL3LD 1:1556bcaaf759 776 */
DL3LD 1:1556bcaaf759 777 static void SAIx_Out_DeInit(void)
DL3LD 1:1556bcaaf759 778 {
DL3LD 1:1556bcaaf759 779 /* Initialize the haudio_out_sai Instance parameter */
DL3LD 1:1556bcaaf759 780 haudio_out_sai.Instance = AUDIO_OUT_SAIx;
DL3LD 1:1556bcaaf759 781
DL3LD 1:1556bcaaf759 782 /* Disable SAI peripheral */
DL3LD 1:1556bcaaf759 783 __HAL_SAI_DISABLE(&haudio_out_sai);
DL3LD 1:1556bcaaf759 784
DL3LD 1:1556bcaaf759 785 HAL_SAI_DeInit(&haudio_out_sai);
DL3LD 1:1556bcaaf759 786 }
DL3LD 1:1556bcaaf759 787
DL3LD 1:1556bcaaf759 788 /**
DL3LD 1:1556bcaaf759 789 * @}
DL3LD 1:1556bcaaf759 790 */
DL3LD 1:1556bcaaf759 791
DL3LD 1:1556bcaaf759 792 /** @defgroup STM32746G_DISCOVERY_AUDIO_Out_Private_Functions STM32746G_DISCOVERY_AUDIO Out Private Functions
DL3LD 1:1556bcaaf759 793 * @{
DL3LD 1:1556bcaaf759 794 */
DL3LD 1:1556bcaaf759 795
DL3LD 1:1556bcaaf759 796 /**
DL3LD 1:1556bcaaf759 797 * @brief Initializes wave recording.
DL3LD 1:1556bcaaf759 798 * @param InputDevice: INPUT_DEVICE_DIGITAL_MICROPHONE_2 or INPUT_DEVICE_INPUT_LINE_1
DL3LD 1:1556bcaaf759 799 * @param Volume: Initial volume level (in range 0(Mute)..80(+0dB)..100(+17.625dB))
DL3LD 1:1556bcaaf759 800 * @param AudioFreq: Audio frequency to be configured for the SAI peripheral.
DL3LD 1:1556bcaaf759 801 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 802 */
DL3LD 1:1556bcaaf759 803 uint8_t BSP_AUDIO_IN_Init(uint16_t InputDevice, uint8_t Volume, uint32_t AudioFreq)
DL3LD 1:1556bcaaf759 804 {
DL3LD 1:1556bcaaf759 805 uint8_t ret = AUDIO_ERROR;
DL3LD 1:1556bcaaf759 806 uint32_t deviceid = 0x00;
DL3LD 1:1556bcaaf759 807 uint32_t slot_active;
DL3LD 1:1556bcaaf759 808
DL3LD 1:1556bcaaf759 809 if ((InputDevice != INPUT_DEVICE_INPUT_LINE_1) && /* Only INPUT_LINE_1 and MICROPHONE_2 inputs supported */
DL3LD 1:1556bcaaf759 810 (InputDevice != INPUT_DEVICE_DIGITAL_MICROPHONE_2))
DL3LD 1:1556bcaaf759 811 {
DL3LD 1:1556bcaaf759 812 ret = AUDIO_ERROR;
DL3LD 1:1556bcaaf759 813 }
DL3LD 1:1556bcaaf759 814 else
DL3LD 1:1556bcaaf759 815 {
DL3LD 1:1556bcaaf759 816 /* Disable SAI */
DL3LD 1:1556bcaaf759 817 SAIx_In_DeInit();
DL3LD 1:1556bcaaf759 818
DL3LD 1:1556bcaaf759 819 /* PLL clock is set depending on the AudioFreq (44.1khz vs 48khz groups) */
DL3LD 1:1556bcaaf759 820 BSP_AUDIO_OUT_ClockConfig(&haudio_in_sai, AudioFreq, NULL); /* Clock config is shared between AUDIO IN and OUT */
DL3LD 1:1556bcaaf759 821
DL3LD 1:1556bcaaf759 822 /* SAI data transfer preparation:
DL3LD 1:1556bcaaf759 823 Prepare the Media to be used for the audio transfer from SAI peripheral to memory */
DL3LD 1:1556bcaaf759 824 haudio_in_sai.Instance = AUDIO_IN_SAIx;
DL3LD 1:1556bcaaf759 825 if(HAL_SAI_GetState(&haudio_in_sai) == HAL_SAI_STATE_RESET)
DL3LD 1:1556bcaaf759 826 {
DL3LD 1:1556bcaaf759 827 /* Init the SAI MSP: this __weak function can be redefined by the application*/
DL3LD 1:1556bcaaf759 828 BSP_AUDIO_OUT_MspInit(&haudio_in_sai, NULL); /* Initialize GPIOs for SAI2 block A Master signals */
DL3LD 1:1556bcaaf759 829 BSP_AUDIO_IN_MspInit(&haudio_in_sai, NULL);
DL3LD 1:1556bcaaf759 830 }
DL3LD 1:1556bcaaf759 831
DL3LD 1:1556bcaaf759 832 /* Configure SAI in master RX mode :
DL3LD 1:1556bcaaf759 833 * - SAI2_block_A in master RX mode
DL3LD 1:1556bcaaf759 834 * - SAI2_block_B in slave RX mode synchronous from SAI2_block_A
DL3LD 1:1556bcaaf759 835 */
DL3LD 1:1556bcaaf759 836 if (InputDevice == INPUT_DEVICE_DIGITAL_MICROPHONE_2)
DL3LD 1:1556bcaaf759 837 {
DL3LD 1:1556bcaaf759 838 slot_active = CODEC_AUDIOFRAME_SLOT_13;
DL3LD 1:1556bcaaf759 839 }
DL3LD 1:1556bcaaf759 840 else
DL3LD 1:1556bcaaf759 841 {
DL3LD 1:1556bcaaf759 842 slot_active = CODEC_AUDIOFRAME_SLOT_02;
DL3LD 1:1556bcaaf759 843 }
DL3LD 1:1556bcaaf759 844 SAIx_In_Init(SAI_MODEMASTER_RX, slot_active, AudioFreq);
DL3LD 1:1556bcaaf759 845
DL3LD 1:1556bcaaf759 846 /* wm8994 codec initialization */
DL3LD 1:1556bcaaf759 847 deviceid = wm8994_drv.ReadID(AUDIO_I2C_ADDRESS);
DL3LD 1:1556bcaaf759 848
DL3LD 1:1556bcaaf759 849 if((deviceid) == WM8994_ID)
DL3LD 1:1556bcaaf759 850 {
DL3LD 1:1556bcaaf759 851 /* Reset the Codec Registers */
DL3LD 1:1556bcaaf759 852 wm8994_drv.Reset(AUDIO_I2C_ADDRESS);
DL3LD 1:1556bcaaf759 853 /* Initialize the audio driver structure */
DL3LD 1:1556bcaaf759 854 audio_drv = &wm8994_drv;
DL3LD 1:1556bcaaf759 855 ret = AUDIO_OK;
DL3LD 1:1556bcaaf759 856 }
DL3LD 1:1556bcaaf759 857 else
DL3LD 1:1556bcaaf759 858 {
DL3LD 1:1556bcaaf759 859 ret = AUDIO_ERROR;
DL3LD 1:1556bcaaf759 860 }
DL3LD 1:1556bcaaf759 861
DL3LD 1:1556bcaaf759 862 if(ret == AUDIO_OK)
DL3LD 1:1556bcaaf759 863 {
DL3LD 1:1556bcaaf759 864 /* Initialize the codec internal registers */
DL3LD 1:1556bcaaf759 865 audio_drv->Init(AUDIO_I2C_ADDRESS, InputDevice, Volume, AudioFreq);
DL3LD 1:1556bcaaf759 866 }
DL3LD 1:1556bcaaf759 867 }
DL3LD 1:1556bcaaf759 868 return ret;
DL3LD 1:1556bcaaf759 869 }
DL3LD 1:1556bcaaf759 870
DL3LD 1:1556bcaaf759 871 /**
DL3LD 1:1556bcaaf759 872 * @brief Initializes wave recording and playback in parallel.
DL3LD 1:1556bcaaf759 873 * @param InputDevice: INPUT_DEVICE_DIGITAL_MICROPHONE_2
DL3LD 1:1556bcaaf759 874 * @param OutputDevice: OUTPUT_DEVICE_SPEAKER, OUTPUT_DEVICE_HEADPHONE,
DL3LD 1:1556bcaaf759 875 * or OUTPUT_DEVICE_BOTH.
DL3LD 1:1556bcaaf759 876 * @param Volume: Initial volume level (in range 0(Mute)..80(+0dB)..100(+17.625dB))
DL3LD 1:1556bcaaf759 877 * @param AudioFreq: Audio frequency to be configured for the SAI peripheral.
DL3LD 1:1556bcaaf759 878 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 879 */
DL3LD 1:1556bcaaf759 880 uint8_t BSP_AUDIO_IN_OUT_Init(uint16_t InputDevice, uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq)
DL3LD 1:1556bcaaf759 881 {
DL3LD 1:1556bcaaf759 882 uint8_t ret = AUDIO_ERROR;
DL3LD 1:1556bcaaf759 883 uint32_t deviceid = 0x00;
DL3LD 1:1556bcaaf759 884 uint32_t slot_active;
DL3LD 1:1556bcaaf759 885
DL3LD 1:1556bcaaf759 886 if (InputDevice != INPUT_DEVICE_DIGITAL_MICROPHONE_2) /* Only MICROPHONE_2 input supported */
DL3LD 1:1556bcaaf759 887 {
DL3LD 1:1556bcaaf759 888 ret = AUDIO_ERROR;
DL3LD 1:1556bcaaf759 889 }
DL3LD 1:1556bcaaf759 890 else
DL3LD 1:1556bcaaf759 891 {
DL3LD 1:1556bcaaf759 892 /* Disable SAI */
DL3LD 1:1556bcaaf759 893 SAIx_In_DeInit();
DL3LD 1:1556bcaaf759 894 SAIx_Out_DeInit();
DL3LD 1:1556bcaaf759 895
DL3LD 1:1556bcaaf759 896 /* PLL clock is set depending on the AudioFreq (44.1khz vs 48khz groups) */
DL3LD 1:1556bcaaf759 897 BSP_AUDIO_OUT_ClockConfig(&haudio_in_sai, AudioFreq, NULL); /* Clock config is shared between AUDIO IN and OUT */
DL3LD 1:1556bcaaf759 898
DL3LD 1:1556bcaaf759 899 /* SAI data transfer preparation:
DL3LD 1:1556bcaaf759 900 Prepare the Media to be used for the audio transfer from SAI peripheral to memory */
DL3LD 1:1556bcaaf759 901 haudio_in_sai.Instance = AUDIO_IN_SAIx;
DL3LD 1:1556bcaaf759 902 if(HAL_SAI_GetState(&haudio_in_sai) == HAL_SAI_STATE_RESET)
DL3LD 1:1556bcaaf759 903 {
DL3LD 1:1556bcaaf759 904 /* Init the SAI MSP: this __weak function can be redefined by the application*/
DL3LD 1:1556bcaaf759 905 BSP_AUDIO_IN_MspInit(&haudio_in_sai, NULL);
DL3LD 1:1556bcaaf759 906 }
DL3LD 1:1556bcaaf759 907
DL3LD 1:1556bcaaf759 908 /* SAI data transfer preparation:
DL3LD 1:1556bcaaf759 909 Prepare the Media to be used for the audio transfer from memory to SAI peripheral */
DL3LD 1:1556bcaaf759 910 haudio_out_sai.Instance = AUDIO_OUT_SAIx;
DL3LD 1:1556bcaaf759 911 if(HAL_SAI_GetState(&haudio_out_sai) == HAL_SAI_STATE_RESET)
DL3LD 1:1556bcaaf759 912 {
DL3LD 1:1556bcaaf759 913 /* Init the SAI MSP: this __weak function can be redefined by the application*/
DL3LD 1:1556bcaaf759 914 BSP_AUDIO_OUT_MspInit(&haudio_out_sai, NULL);
DL3LD 1:1556bcaaf759 915 }
DL3LD 1:1556bcaaf759 916
DL3LD 1:1556bcaaf759 917 /* Configure SAI in master mode :
DL3LD 1:1556bcaaf759 918 * - SAI2_block_A in master TX mode
DL3LD 1:1556bcaaf759 919 * - SAI2_block_B in slave RX mode synchronous from SAI2_block_A
DL3LD 1:1556bcaaf759 920 */
DL3LD 1:1556bcaaf759 921 if (InputDevice == INPUT_DEVICE_DIGITAL_MICROPHONE_2)
DL3LD 1:1556bcaaf759 922 {
DL3LD 1:1556bcaaf759 923 slot_active = CODEC_AUDIOFRAME_SLOT_13;
DL3LD 1:1556bcaaf759 924 }
DL3LD 1:1556bcaaf759 925 else
DL3LD 1:1556bcaaf759 926 {
DL3LD 1:1556bcaaf759 927 slot_active = CODEC_AUDIOFRAME_SLOT_02;
DL3LD 1:1556bcaaf759 928 }
DL3LD 1:1556bcaaf759 929 SAIx_In_Init(SAI_MODEMASTER_TX, slot_active, AudioFreq);
DL3LD 1:1556bcaaf759 930
DL3LD 1:1556bcaaf759 931 /* wm8994 codec initialization */
DL3LD 1:1556bcaaf759 932 deviceid = wm8994_drv.ReadID(AUDIO_I2C_ADDRESS);
DL3LD 1:1556bcaaf759 933
DL3LD 1:1556bcaaf759 934 if((deviceid) == WM8994_ID)
DL3LD 1:1556bcaaf759 935 {
DL3LD 1:1556bcaaf759 936 /* Reset the Codec Registers */
DL3LD 1:1556bcaaf759 937 wm8994_drv.Reset(AUDIO_I2C_ADDRESS);
DL3LD 1:1556bcaaf759 938 /* Initialize the audio driver structure */
DL3LD 1:1556bcaaf759 939 audio_drv = &wm8994_drv;
DL3LD 1:1556bcaaf759 940 ret = AUDIO_OK;
DL3LD 1:1556bcaaf759 941 }
DL3LD 1:1556bcaaf759 942 else
DL3LD 1:1556bcaaf759 943 {
DL3LD 1:1556bcaaf759 944 ret = AUDIO_ERROR;
DL3LD 1:1556bcaaf759 945 }
DL3LD 1:1556bcaaf759 946
DL3LD 1:1556bcaaf759 947 if(ret == AUDIO_OK)
DL3LD 1:1556bcaaf759 948 {
DL3LD 1:1556bcaaf759 949 /* Initialize the codec internal registers */
DL3LD 1:1556bcaaf759 950 audio_drv->Init(AUDIO_I2C_ADDRESS, InputDevice | OutputDevice, Volume, AudioFreq);
DL3LD 1:1556bcaaf759 951 }
DL3LD 1:1556bcaaf759 952 }
DL3LD 1:1556bcaaf759 953 return ret;
DL3LD 1:1556bcaaf759 954 }
DL3LD 1:1556bcaaf759 955
DL3LD 1:1556bcaaf759 956
DL3LD 1:1556bcaaf759 957 /**
DL3LD 1:1556bcaaf759 958 * @brief Starts audio recording.
DL3LD 1:1556bcaaf759 959 * @param pbuf: Main buffer pointer for the recorded data storing
DL3LD 1:1556bcaaf759 960 * @param size: size of the recorded buffer in number of elements (typically number of half-words)
DL3LD 1:1556bcaaf759 961 * Be careful that it is not the same unit than BSP_AUDIO_OUT_Play function
DL3LD 1:1556bcaaf759 962 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 963 */
DL3LD 1:1556bcaaf759 964 uint8_t BSP_AUDIO_IN_Record(uint16_t* pbuf, uint32_t size)
DL3LD 1:1556bcaaf759 965 {
DL3LD 1:1556bcaaf759 966 uint32_t ret = AUDIO_ERROR;
DL3LD 1:1556bcaaf759 967
DL3LD 1:1556bcaaf759 968 /* Start the process receive DMA */
DL3LD 1:1556bcaaf759 969 HAL_SAI_Receive_DMA(&haudio_in_sai, (uint8_t*)pbuf, size);
DL3LD 1:1556bcaaf759 970
DL3LD 1:1556bcaaf759 971 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 972 ret = AUDIO_OK;
DL3LD 1:1556bcaaf759 973
DL3LD 1:1556bcaaf759 974 return ret;
DL3LD 1:1556bcaaf759 975 }
DL3LD 1:1556bcaaf759 976
DL3LD 1:1556bcaaf759 977 /**
DL3LD 1:1556bcaaf759 978 * @brief Stops audio recording.
DL3LD 1:1556bcaaf759 979 * @param Option: could be one of the following parameters
DL3LD 1:1556bcaaf759 980 * - CODEC_PDWN_SW: for software power off (by writing registers).
DL3LD 1:1556bcaaf759 981 * Then no need to reconfigure the Codec after power on.
DL3LD 1:1556bcaaf759 982 * - CODEC_PDWN_HW: completely shut down the codec (physically).
DL3LD 1:1556bcaaf759 983 * Then need to reconfigure the Codec after power on.
DL3LD 1:1556bcaaf759 984 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 985 */
DL3LD 1:1556bcaaf759 986 uint8_t BSP_AUDIO_IN_Stop(uint32_t Option)
DL3LD 1:1556bcaaf759 987 {
DL3LD 1:1556bcaaf759 988 /* Call the Media layer stop function */
DL3LD 1:1556bcaaf759 989 HAL_SAI_DMAStop(&haudio_in_sai);
DL3LD 1:1556bcaaf759 990
DL3LD 1:1556bcaaf759 991 /* Call Audio Codec Stop function */
DL3LD 1:1556bcaaf759 992 if(audio_drv->Stop(AUDIO_I2C_ADDRESS, Option) != 0)
DL3LD 1:1556bcaaf759 993 {
DL3LD 1:1556bcaaf759 994 return AUDIO_ERROR;
DL3LD 1:1556bcaaf759 995 }
DL3LD 1:1556bcaaf759 996 else
DL3LD 1:1556bcaaf759 997 {
DL3LD 1:1556bcaaf759 998 if(Option == CODEC_PDWN_HW)
DL3LD 1:1556bcaaf759 999 {
DL3LD 1:1556bcaaf759 1000 /* Wait at least 100us */
DL3LD 1:1556bcaaf759 1001 HAL_Delay(1);
DL3LD 1:1556bcaaf759 1002 }
DL3LD 1:1556bcaaf759 1003 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 1004 return AUDIO_OK;
DL3LD 1:1556bcaaf759 1005 }
DL3LD 1:1556bcaaf759 1006 }
DL3LD 1:1556bcaaf759 1007
DL3LD 1:1556bcaaf759 1008 /**
DL3LD 1:1556bcaaf759 1009 * @brief Pauses the audio file stream.
DL3LD 1:1556bcaaf759 1010 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 1011 */
DL3LD 1:1556bcaaf759 1012 uint8_t BSP_AUDIO_IN_Pause(void)
DL3LD 1:1556bcaaf759 1013 {
DL3LD 1:1556bcaaf759 1014 /* Call the Media layer pause function */
DL3LD 1:1556bcaaf759 1015 HAL_SAI_DMAPause(&haudio_in_sai);
DL3LD 1:1556bcaaf759 1016 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 1017 return AUDIO_OK;
DL3LD 1:1556bcaaf759 1018 }
DL3LD 1:1556bcaaf759 1019
DL3LD 1:1556bcaaf759 1020 /**
DL3LD 1:1556bcaaf759 1021 * @brief Resumes the audio file stream.
DL3LD 1:1556bcaaf759 1022 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 1023 */
DL3LD 1:1556bcaaf759 1024 uint8_t BSP_AUDIO_IN_Resume(void)
DL3LD 1:1556bcaaf759 1025 {
DL3LD 1:1556bcaaf759 1026 /* Call the Media layer pause/resume function */
DL3LD 1:1556bcaaf759 1027 HAL_SAI_DMAResume(&haudio_in_sai);
DL3LD 1:1556bcaaf759 1028 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 1029 return AUDIO_OK;
DL3LD 1:1556bcaaf759 1030 }
DL3LD 1:1556bcaaf759 1031
DL3LD 1:1556bcaaf759 1032 /**
DL3LD 1:1556bcaaf759 1033 * @brief Controls the audio in volume level.
DL3LD 1:1556bcaaf759 1034 * @param Volume: Volume level in range 0(Mute)..80(+0dB)..100(+17.625dB)
DL3LD 1:1556bcaaf759 1035 * @retval AUDIO_OK if correct communication, else wrong communication
DL3LD 1:1556bcaaf759 1036 */
DL3LD 1:1556bcaaf759 1037 uint8_t BSP_AUDIO_IN_SetVolume(uint8_t Volume)
DL3LD 1:1556bcaaf759 1038 {
DL3LD 1:1556bcaaf759 1039 /* Call the codec volume control function with converted volume value */
DL3LD 1:1556bcaaf759 1040 if(audio_drv->SetVolume(AUDIO_I2C_ADDRESS, Volume) != 0)
DL3LD 1:1556bcaaf759 1041 {
DL3LD 1:1556bcaaf759 1042 return AUDIO_ERROR;
DL3LD 1:1556bcaaf759 1043 }
DL3LD 1:1556bcaaf759 1044 else
DL3LD 1:1556bcaaf759 1045 {
DL3LD 1:1556bcaaf759 1046 /* Set the Global variable AudioInVolume */
DL3LD 1:1556bcaaf759 1047 AudioInVolume = Volume;
DL3LD 1:1556bcaaf759 1048 /* Return AUDIO_OK when all operations are correctly done */
DL3LD 1:1556bcaaf759 1049 return AUDIO_OK;
DL3LD 1:1556bcaaf759 1050 }
DL3LD 1:1556bcaaf759 1051 }
DL3LD 1:1556bcaaf759 1052
DL3LD 1:1556bcaaf759 1053 /**
DL3LD 1:1556bcaaf759 1054 * @brief Deinit the audio IN peripherals.
DL3LD 1:1556bcaaf759 1055 * @retval None
DL3LD 1:1556bcaaf759 1056 */
DL3LD 1:1556bcaaf759 1057 void BSP_AUDIO_IN_DeInit(void)
DL3LD 1:1556bcaaf759 1058 {
DL3LD 1:1556bcaaf759 1059 SAIx_In_DeInit();
DL3LD 1:1556bcaaf759 1060 /* DeInit the SAI MSP : this __weak function can be rewritten by the application */
DL3LD 1:1556bcaaf759 1061 BSP_AUDIO_IN_MspDeInit(&haudio_in_sai, NULL);
DL3LD 1:1556bcaaf759 1062 }
DL3LD 1:1556bcaaf759 1063
DL3LD 1:1556bcaaf759 1064 /**
DL3LD 1:1556bcaaf759 1065 * @brief Rx Transfer completed callbacks.
DL3LD 1:1556bcaaf759 1066 * @param hsai: SAI handle
DL3LD 1:1556bcaaf759 1067 * @retval None
DL3LD 1:1556bcaaf759 1068 */
DL3LD 1:1556bcaaf759 1069 void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
DL3LD 1:1556bcaaf759 1070 {
DL3LD 1:1556bcaaf759 1071 /* Call the record update function to get the next buffer to fill and its size (size is ignored) */
DL3LD 1:1556bcaaf759 1072 BSP_AUDIO_IN_TransferComplete_CallBack();
DL3LD 1:1556bcaaf759 1073 }
DL3LD 1:1556bcaaf759 1074
DL3LD 1:1556bcaaf759 1075 /**
DL3LD 1:1556bcaaf759 1076 * @brief Rx Half Transfer completed callbacks.
DL3LD 1:1556bcaaf759 1077 * @param hsai: SAI handle
DL3LD 1:1556bcaaf759 1078 * @retval None
DL3LD 1:1556bcaaf759 1079 */
DL3LD 1:1556bcaaf759 1080 void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
DL3LD 1:1556bcaaf759 1081 {
DL3LD 1:1556bcaaf759 1082 /* Manage the remaining file size and new address offset: This function
DL3LD 1:1556bcaaf759 1083 should be coded by user (its prototype is already declared in stm32746g_discovery_audio.h) */
DL3LD 1:1556bcaaf759 1084 BSP_AUDIO_IN_HalfTransfer_CallBack();
DL3LD 1:1556bcaaf759 1085 }
DL3LD 1:1556bcaaf759 1086
DL3LD 1:1556bcaaf759 1087 /**
DL3LD 1:1556bcaaf759 1088 * @brief User callback when record buffer is filled.
DL3LD 1:1556bcaaf759 1089 * @retval None
DL3LD 1:1556bcaaf759 1090 */
DL3LD 1:1556bcaaf759 1091 __weak void BSP_AUDIO_IN_TransferComplete_CallBack(void)
DL3LD 1:1556bcaaf759 1092 {
DL3LD 1:1556bcaaf759 1093 /* This function should be implemented by the user application.
DL3LD 1:1556bcaaf759 1094 It is called into this driver when the current buffer is filled
DL3LD 1:1556bcaaf759 1095 to prepare the next buffer pointer and its size. */
DL3LD 1:1556bcaaf759 1096 }
DL3LD 1:1556bcaaf759 1097
DL3LD 1:1556bcaaf759 1098 /**
DL3LD 1:1556bcaaf759 1099 * @brief Manages the DMA Half Transfer complete event.
DL3LD 1:1556bcaaf759 1100 * @retval None
DL3LD 1:1556bcaaf759 1101 */
DL3LD 1:1556bcaaf759 1102 __weak void BSP_AUDIO_IN_HalfTransfer_CallBack(void)
DL3LD 1:1556bcaaf759 1103 {
DL3LD 1:1556bcaaf759 1104 /* This function should be implemented by the user application.
DL3LD 1:1556bcaaf759 1105 It is called into this driver when the current buffer is filled
DL3LD 1:1556bcaaf759 1106 to prepare the next buffer pointer and its size. */
DL3LD 1:1556bcaaf759 1107 }
DL3LD 1:1556bcaaf759 1108
DL3LD 1:1556bcaaf759 1109 /**
DL3LD 1:1556bcaaf759 1110 * @brief Audio IN Error callback function.
DL3LD 1:1556bcaaf759 1111 * @retval None
DL3LD 1:1556bcaaf759 1112 */
DL3LD 1:1556bcaaf759 1113 __weak void BSP_AUDIO_IN_Error_CallBack(void)
DL3LD 1:1556bcaaf759 1114 {
DL3LD 1:1556bcaaf759 1115 /* This function is called when an Interrupt due to transfer error on or peripheral
DL3LD 1:1556bcaaf759 1116 error occurs. */
DL3LD 1:1556bcaaf759 1117 }
DL3LD 1:1556bcaaf759 1118
DL3LD 1:1556bcaaf759 1119 /**
DL3LD 1:1556bcaaf759 1120 * @brief Initializes BSP_AUDIO_IN MSP.
DL3LD 1:1556bcaaf759 1121 * @param hsai: SAI handle
DL3LD 1:1556bcaaf759 1122 * @param Params
DL3LD 1:1556bcaaf759 1123 * @retval None
DL3LD 1:1556bcaaf759 1124 */
DL3LD 1:1556bcaaf759 1125 __weak void BSP_AUDIO_IN_MspInit(SAI_HandleTypeDef *hsai, void *Params)
DL3LD 1:1556bcaaf759 1126 {
DL3LD 1:1556bcaaf759 1127 static DMA_HandleTypeDef hdma_sai_rx;
DL3LD 1:1556bcaaf759 1128 GPIO_InitTypeDef gpio_init_structure;
DL3LD 1:1556bcaaf759 1129
DL3LD 1:1556bcaaf759 1130 /* Enable SAI clock */
DL3LD 1:1556bcaaf759 1131 AUDIO_IN_SAIx_CLK_ENABLE();
DL3LD 1:1556bcaaf759 1132
DL3LD 1:1556bcaaf759 1133 /* Enable SD GPIO clock */
DL3LD 1:1556bcaaf759 1134 AUDIO_IN_SAIx_SD_ENABLE();
DL3LD 1:1556bcaaf759 1135 /* CODEC_SAI pin configuration: SD pin */
DL3LD 1:1556bcaaf759 1136 gpio_init_structure.Pin = AUDIO_IN_SAIx_SD_PIN;
DL3LD 1:1556bcaaf759 1137 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
DL3LD 1:1556bcaaf759 1138 gpio_init_structure.Pull = GPIO_NOPULL;
DL3LD 1:1556bcaaf759 1139 gpio_init_structure.Speed = GPIO_SPEED_FAST;
DL3LD 1:1556bcaaf759 1140 gpio_init_structure.Alternate = AUDIO_IN_SAIx_SD_AF;
DL3LD 1:1556bcaaf759 1141 HAL_GPIO_Init(AUDIO_IN_SAIx_SD_GPIO_PORT, &gpio_init_structure);
DL3LD 1:1556bcaaf759 1142
DL3LD 1:1556bcaaf759 1143 /* Enable Audio INT GPIO clock */
DL3LD 1:1556bcaaf759 1144 AUDIO_IN_INT_GPIO_ENABLE();
DL3LD 1:1556bcaaf759 1145 /* Audio INT pin configuration: input */
DL3LD 1:1556bcaaf759 1146 gpio_init_structure.Pin = AUDIO_IN_INT_GPIO_PIN;
DL3LD 1:1556bcaaf759 1147 gpio_init_structure.Mode = GPIO_MODE_INPUT;
DL3LD 1:1556bcaaf759 1148 gpio_init_structure.Pull = GPIO_NOPULL;
DL3LD 1:1556bcaaf759 1149 gpio_init_structure.Speed = GPIO_SPEED_FAST;
DL3LD 1:1556bcaaf759 1150 HAL_GPIO_Init(AUDIO_IN_INT_GPIO_PORT, &gpio_init_structure);
DL3LD 1:1556bcaaf759 1151
DL3LD 1:1556bcaaf759 1152 /* Enable the DMA clock */
DL3LD 1:1556bcaaf759 1153 AUDIO_IN_SAIx_DMAx_CLK_ENABLE();
DL3LD 1:1556bcaaf759 1154
DL3LD 1:1556bcaaf759 1155 if(hsai->Instance == AUDIO_IN_SAIx)
DL3LD 1:1556bcaaf759 1156 {
DL3LD 1:1556bcaaf759 1157 /* Configure the hdma_sai_rx handle parameters */
DL3LD 1:1556bcaaf759 1158 hdma_sai_rx.Init.Channel = AUDIO_IN_SAIx_DMAx_CHANNEL;
DL3LD 1:1556bcaaf759 1159 hdma_sai_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
DL3LD 1:1556bcaaf759 1160 hdma_sai_rx.Init.PeriphInc = DMA_PINC_DISABLE;
DL3LD 1:1556bcaaf759 1161 hdma_sai_rx.Init.MemInc = DMA_MINC_ENABLE;
DL3LD 1:1556bcaaf759 1162 hdma_sai_rx.Init.PeriphDataAlignment = AUDIO_IN_SAIx_DMAx_PERIPH_DATA_SIZE;
DL3LD 1:1556bcaaf759 1163 hdma_sai_rx.Init.MemDataAlignment = AUDIO_IN_SAIx_DMAx_MEM_DATA_SIZE;
DL3LD 1:1556bcaaf759 1164 hdma_sai_rx.Init.Mode = DMA_CIRCULAR;
DL3LD 1:1556bcaaf759 1165 hdma_sai_rx.Init.Priority = DMA_PRIORITY_HIGH;
DL3LD 1:1556bcaaf759 1166 hdma_sai_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
DL3LD 1:1556bcaaf759 1167 hdma_sai_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
DL3LD 1:1556bcaaf759 1168 hdma_sai_rx.Init.MemBurst = DMA_MBURST_SINGLE;
DL3LD 1:1556bcaaf759 1169 hdma_sai_rx.Init.PeriphBurst = DMA_MBURST_SINGLE;
DL3LD 1:1556bcaaf759 1170
DL3LD 1:1556bcaaf759 1171 hdma_sai_rx.Instance = AUDIO_IN_SAIx_DMAx_STREAM;
DL3LD 1:1556bcaaf759 1172
DL3LD 1:1556bcaaf759 1173 /* Associate the DMA handle */
DL3LD 1:1556bcaaf759 1174 __HAL_LINKDMA(hsai, hdmarx, hdma_sai_rx);
DL3LD 1:1556bcaaf759 1175
DL3LD 1:1556bcaaf759 1176 /* Deinitialize the Stream for new transfer */
DL3LD 1:1556bcaaf759 1177 HAL_DMA_DeInit(&hdma_sai_rx);
DL3LD 1:1556bcaaf759 1178
DL3LD 1:1556bcaaf759 1179 /* Configure the DMA Stream */
DL3LD 1:1556bcaaf759 1180 HAL_DMA_Init(&hdma_sai_rx);
DL3LD 1:1556bcaaf759 1181 }
DL3LD 1:1556bcaaf759 1182
DL3LD 1:1556bcaaf759 1183 /* SAI DMA IRQ Channel configuration */
DL3LD 1:1556bcaaf759 1184 #if ( __MBED__ == 1)
DL3LD 1:1556bcaaf759 1185 IRQn_Type irqn = (IRQn_Type)(AUDIO_IN_SAIx_DMAx_IRQ);
DL3LD 1:1556bcaaf759 1186 NVIC_ClearPendingIRQ(irqn);
DL3LD 1:1556bcaaf759 1187 NVIC_DisableIRQ(irqn);
DL3LD 1:1556bcaaf759 1188 NVIC_SetPriority(irqn, AUDIO_IN_IRQ_PREPRIO);
DL3LD 1:1556bcaaf759 1189 NVIC_SetVector(irqn, (uint32_t)AUDIO_IN_SAIx_DMAx_IRQHandler);
DL3LD 1:1556bcaaf759 1190 NVIC_EnableIRQ(irqn);
DL3LD 1:1556bcaaf759 1191 #else
DL3LD 1:1556bcaaf759 1192 HAL_NVIC_SetPriority(AUDIO_IN_SAIx_DMAx_IRQ, AUDIO_IN_IRQ_PREPRIO, 0);
DL3LD 1:1556bcaaf759 1193 HAL_NVIC_EnableIRQ(AUDIO_IN_SAIx_DMAx_IRQ);
DL3LD 1:1556bcaaf759 1194 #endif
DL3LD 1:1556bcaaf759 1195
DL3LD 1:1556bcaaf759 1196 /* Audio INT IRQ Channel configuration */
DL3LD 1:1556bcaaf759 1197 #if ( __MBED__ == 1)
DL3LD 1:1556bcaaf759 1198 irqn = (IRQn_Type)(AUDIO_IN_INT_IRQ);
DL3LD 1:1556bcaaf759 1199 NVIC_ClearPendingIRQ(irqn);
DL3LD 1:1556bcaaf759 1200 NVIC_DisableIRQ(irqn);
DL3LD 1:1556bcaaf759 1201 NVIC_SetPriority(irqn, AUDIO_IN_IRQ_PREPRIO);
DL3LD 1:1556bcaaf759 1202 NVIC_SetVector(irqn, (uint32_t)AUDIO_IN_INT_IRQHandler);
DL3LD 1:1556bcaaf759 1203 NVIC_EnableIRQ(irqn);
DL3LD 1:1556bcaaf759 1204 #else
DL3LD 1:1556bcaaf759 1205 HAL_NVIC_SetPriority(AUDIO_IN_INT_IRQ, AUDIO_IN_IRQ_PREPRIO, 0);
DL3LD 1:1556bcaaf759 1206 HAL_NVIC_EnableIRQ(AUDIO_IN_INT_IRQ);
DL3LD 1:1556bcaaf759 1207 #endif
DL3LD 1:1556bcaaf759 1208 }
DL3LD 1:1556bcaaf759 1209
DL3LD 1:1556bcaaf759 1210 /**
DL3LD 1:1556bcaaf759 1211 * @brief DeInitializes BSP_AUDIO_IN MSP.
DL3LD 1:1556bcaaf759 1212 * @param hsai: SAI handle
DL3LD 1:1556bcaaf759 1213 * @param Params
DL3LD 1:1556bcaaf759 1214 * @retval None
DL3LD 1:1556bcaaf759 1215 */
DL3LD 1:1556bcaaf759 1216 __weak void BSP_AUDIO_IN_MspDeInit(SAI_HandleTypeDef *hsai, void *Params)
DL3LD 1:1556bcaaf759 1217 {
DL3LD 1:1556bcaaf759 1218 GPIO_InitTypeDef gpio_init_structure;
DL3LD 1:1556bcaaf759 1219
DL3LD 1:1556bcaaf759 1220 static DMA_HandleTypeDef hdma_sai_rx;
DL3LD 1:1556bcaaf759 1221
DL3LD 1:1556bcaaf759 1222 /* SAI IN DMA IRQ Channel deactivation */
DL3LD 1:1556bcaaf759 1223 HAL_NVIC_DisableIRQ(AUDIO_IN_SAIx_DMAx_IRQ);
DL3LD 1:1556bcaaf759 1224
DL3LD 1:1556bcaaf759 1225 if(hsai->Instance == AUDIO_IN_SAIx)
DL3LD 1:1556bcaaf759 1226 {
DL3LD 1:1556bcaaf759 1227 /* Deinitialize the Stream for new transfer */
DL3LD 1:1556bcaaf759 1228 HAL_DMA_DeInit(&hdma_sai_rx);
DL3LD 1:1556bcaaf759 1229 }
DL3LD 1:1556bcaaf759 1230
DL3LD 1:1556bcaaf759 1231 /* Disable SAI block */
DL3LD 1:1556bcaaf759 1232 __HAL_SAI_DISABLE(hsai);
DL3LD 1:1556bcaaf759 1233
DL3LD 1:1556bcaaf759 1234 /* Disable pin: SD pin */
DL3LD 1:1556bcaaf759 1235 gpio_init_structure.Pin = AUDIO_IN_SAIx_SD_PIN;
DL3LD 1:1556bcaaf759 1236 HAL_GPIO_DeInit(AUDIO_IN_SAIx_SD_GPIO_PORT, gpio_init_structure.Pin);
DL3LD 1:1556bcaaf759 1237
DL3LD 1:1556bcaaf759 1238 /* Disable SAI clock */
DL3LD 1:1556bcaaf759 1239 AUDIO_IN_SAIx_CLK_DISABLE();
DL3LD 1:1556bcaaf759 1240
DL3LD 1:1556bcaaf759 1241 /* GPIO pins clock and DMA clock can be shut down in the application
DL3LD 1:1556bcaaf759 1242 by surcharging this __weak function */
DL3LD 1:1556bcaaf759 1243 }
DL3LD 1:1556bcaaf759 1244
DL3LD 1:1556bcaaf759 1245
DL3LD 1:1556bcaaf759 1246 /*******************************************************************************
DL3LD 1:1556bcaaf759 1247 Static Functions
DL3LD 1:1556bcaaf759 1248 *******************************************************************************/
DL3LD 1:1556bcaaf759 1249
DL3LD 1:1556bcaaf759 1250 /**
DL3LD 1:1556bcaaf759 1251 * @brief Initializes the input Audio Codec audio interface (SAI).
DL3LD 1:1556bcaaf759 1252 * @param SaiOutMode: SAI_MODEMASTER_TX (for record and playback in parallel)
DL3LD 1:1556bcaaf759 1253 * or SAI_MODEMASTER_RX (for record only).
DL3LD 1:1556bcaaf759 1254 * @param SlotActive: CODEC_AUDIOFRAME_SLOT_02 or CODEC_AUDIOFRAME_SLOT_13
DL3LD 1:1556bcaaf759 1255 * @param AudioFreq: Audio frequency to be configured for the SAI peripheral.
DL3LD 1:1556bcaaf759 1256 * @retval None
DL3LD 1:1556bcaaf759 1257 */
DL3LD 1:1556bcaaf759 1258 static void SAIx_In_Init(uint32_t SaiOutMode, uint32_t SlotActive, uint32_t AudioFreq)
DL3LD 1:1556bcaaf759 1259 {
DL3LD 1:1556bcaaf759 1260 /* Initialize SAI2 block A in MASTER RX */
DL3LD 1:1556bcaaf759 1261 /* Initialize the haudio_out_sai Instance parameter */
DL3LD 1:1556bcaaf759 1262 haudio_out_sai.Instance = AUDIO_OUT_SAIx;
DL3LD 1:1556bcaaf759 1263
DL3LD 1:1556bcaaf759 1264 /* Disable SAI peripheral to allow access to SAI internal registers */
DL3LD 1:1556bcaaf759 1265 __HAL_SAI_DISABLE(&haudio_out_sai);
DL3LD 1:1556bcaaf759 1266
DL3LD 1:1556bcaaf759 1267 /* Configure SAI_Block_x
DL3LD 1:1556bcaaf759 1268 LSBFirst: Disabled
DL3LD 1:1556bcaaf759 1269 DataSize: 16 */
DL3LD 1:1556bcaaf759 1270 haudio_out_sai.Init.AudioFrequency = AudioFreq;
DL3LD 1:1556bcaaf759 1271 haudio_out_sai.Init.AudioMode = SaiOutMode;
DL3LD 1:1556bcaaf759 1272 haudio_out_sai.Init.NoDivider = SAI_MASTERDIVIDER_ENABLED;
DL3LD 1:1556bcaaf759 1273 haudio_out_sai.Init.Protocol = SAI_FREE_PROTOCOL;
DL3LD 1:1556bcaaf759 1274 haudio_out_sai.Init.DataSize = SAI_DATASIZE_16;
DL3LD 1:1556bcaaf759 1275 haudio_out_sai.Init.FirstBit = SAI_FIRSTBIT_MSB;
DL3LD 1:1556bcaaf759 1276 haudio_out_sai.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE;
DL3LD 1:1556bcaaf759 1277 haudio_out_sai.Init.Synchro = SAI_ASYNCHRONOUS;
DL3LD 1:1556bcaaf759 1278 haudio_out_sai.Init.OutputDrive = SAI_OUTPUTDRIVE_ENABLED;
DL3LD 1:1556bcaaf759 1279 haudio_out_sai.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF;
DL3LD 1:1556bcaaf759 1280
DL3LD 1:1556bcaaf759 1281 /* Configure SAI_Block_x Frame
DL3LD 1:1556bcaaf759 1282 Frame Length: 64
DL3LD 1:1556bcaaf759 1283 Frame active Length: 32
DL3LD 1:1556bcaaf759 1284 FS Definition: Start frame + Channel Side identification
DL3LD 1:1556bcaaf759 1285 FS Polarity: FS active Low
DL3LD 1:1556bcaaf759 1286 FS Offset: FS asserted one bit before the first bit of slot 0 */
DL3LD 1:1556bcaaf759 1287 haudio_out_sai.FrameInit.FrameLength = 64;
DL3LD 1:1556bcaaf759 1288 haudio_out_sai.FrameInit.ActiveFrameLength = 32;
DL3LD 1:1556bcaaf759 1289 haudio_out_sai.FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION;
DL3LD 1:1556bcaaf759 1290 haudio_out_sai.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW;
DL3LD 1:1556bcaaf759 1291 haudio_out_sai.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
DL3LD 1:1556bcaaf759 1292
DL3LD 1:1556bcaaf759 1293 /* Configure SAI Block_x Slot
DL3LD 1:1556bcaaf759 1294 Slot First Bit Offset: 0
DL3LD 1:1556bcaaf759 1295 Slot Size : 16
DL3LD 1:1556bcaaf759 1296 Slot Number: 4
DL3LD 1:1556bcaaf759 1297 Slot Active: All slot actives */
DL3LD 1:1556bcaaf759 1298 haudio_out_sai.SlotInit.FirstBitOffset = 0;
DL3LD 1:1556bcaaf759 1299 haudio_out_sai.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE;
DL3LD 1:1556bcaaf759 1300 haudio_out_sai.SlotInit.SlotNumber = 4;
DL3LD 1:1556bcaaf759 1301 haudio_out_sai.SlotInit.SlotActive = SlotActive;
DL3LD 1:1556bcaaf759 1302
DL3LD 1:1556bcaaf759 1303 HAL_SAI_Init(&haudio_out_sai);
DL3LD 1:1556bcaaf759 1304
DL3LD 1:1556bcaaf759 1305 /* Initialize SAI2 block B in SLAVE RX synchronous from SAI2 block A */
DL3LD 1:1556bcaaf759 1306 /* Initialize the haudio_in_sai Instance parameter */
DL3LD 1:1556bcaaf759 1307 haudio_in_sai.Instance = AUDIO_IN_SAIx;
DL3LD 1:1556bcaaf759 1308
DL3LD 1:1556bcaaf759 1309 /* Disable SAI peripheral to allow access to SAI internal registers */
DL3LD 1:1556bcaaf759 1310 __HAL_SAI_DISABLE(&haudio_in_sai);
DL3LD 1:1556bcaaf759 1311
DL3LD 1:1556bcaaf759 1312 /* Configure SAI_Block_x
DL3LD 1:1556bcaaf759 1313 LSBFirst: Disabled
DL3LD 1:1556bcaaf759 1314 DataSize: 16 */
DL3LD 1:1556bcaaf759 1315 haudio_in_sai.Init.AudioFrequency = AudioFreq;
DL3LD 1:1556bcaaf759 1316 haudio_in_sai.Init.AudioMode = SAI_MODESLAVE_RX;
DL3LD 1:1556bcaaf759 1317 haudio_in_sai.Init.NoDivider = SAI_MASTERDIVIDER_ENABLED;
DL3LD 1:1556bcaaf759 1318 haudio_in_sai.Init.Protocol = SAI_FREE_PROTOCOL;
DL3LD 1:1556bcaaf759 1319 haudio_in_sai.Init.DataSize = SAI_DATASIZE_16;
DL3LD 1:1556bcaaf759 1320 haudio_in_sai.Init.FirstBit = SAI_FIRSTBIT_MSB;
DL3LD 1:1556bcaaf759 1321 haudio_in_sai.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE;
DL3LD 1:1556bcaaf759 1322 haudio_in_sai.Init.Synchro = SAI_SYNCHRONOUS;
DL3LD 1:1556bcaaf759 1323 haudio_in_sai.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLED;
DL3LD 1:1556bcaaf759 1324 haudio_in_sai.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF;
DL3LD 1:1556bcaaf759 1325
DL3LD 1:1556bcaaf759 1326 /* Configure SAI_Block_x Frame
DL3LD 1:1556bcaaf759 1327 Frame Length: 64
DL3LD 1:1556bcaaf759 1328 Frame active Length: 32
DL3LD 1:1556bcaaf759 1329 FS Definition: Start frame + Channel Side identification
DL3LD 1:1556bcaaf759 1330 FS Polarity: FS active Low
DL3LD 1:1556bcaaf759 1331 FS Offset: FS asserted one bit before the first bit of slot 0 */
DL3LD 1:1556bcaaf759 1332 haudio_in_sai.FrameInit.FrameLength = 64;
DL3LD 1:1556bcaaf759 1333 haudio_in_sai.FrameInit.ActiveFrameLength = 32;
DL3LD 1:1556bcaaf759 1334 haudio_in_sai.FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION;
DL3LD 1:1556bcaaf759 1335 haudio_in_sai.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW;
DL3LD 1:1556bcaaf759 1336 haudio_in_sai.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
DL3LD 1:1556bcaaf759 1337
DL3LD 1:1556bcaaf759 1338 /* Configure SAI Block_x Slot
DL3LD 1:1556bcaaf759 1339 Slot First Bit Offset: 0
DL3LD 1:1556bcaaf759 1340 Slot Size : 16
DL3LD 1:1556bcaaf759 1341 Slot Number: 4
DL3LD 1:1556bcaaf759 1342 Slot Active: All slot active */
DL3LD 1:1556bcaaf759 1343 haudio_in_sai.SlotInit.FirstBitOffset = 0;
DL3LD 1:1556bcaaf759 1344 haudio_in_sai.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE;
DL3LD 1:1556bcaaf759 1345 haudio_in_sai.SlotInit.SlotNumber = 4;
DL3LD 1:1556bcaaf759 1346 haudio_in_sai.SlotInit.SlotActive = SlotActive;
DL3LD 1:1556bcaaf759 1347
DL3LD 1:1556bcaaf759 1348 HAL_SAI_Init(&haudio_in_sai);
DL3LD 1:1556bcaaf759 1349
DL3LD 1:1556bcaaf759 1350 /* Enable SAI peripheral to generate MCLK */
DL3LD 1:1556bcaaf759 1351 __HAL_SAI_ENABLE(&haudio_out_sai);
DL3LD 1:1556bcaaf759 1352
DL3LD 1:1556bcaaf759 1353 /* Enable SAI peripheral */
DL3LD 1:1556bcaaf759 1354 __HAL_SAI_ENABLE(&haudio_in_sai);
DL3LD 1:1556bcaaf759 1355 }
DL3LD 1:1556bcaaf759 1356
DL3LD 1:1556bcaaf759 1357
DL3LD 1:1556bcaaf759 1358
DL3LD 1:1556bcaaf759 1359 /**
DL3LD 1:1556bcaaf759 1360 * @brief Deinitializes the output Audio Codec audio interface (SAI).
DL3LD 1:1556bcaaf759 1361 * @retval None
DL3LD 1:1556bcaaf759 1362 */
DL3LD 1:1556bcaaf759 1363 static void SAIx_In_DeInit(void)
DL3LD 1:1556bcaaf759 1364 {
DL3LD 1:1556bcaaf759 1365 /* Initialize the haudio_in_sai Instance parameter */
DL3LD 1:1556bcaaf759 1366 haudio_in_sai.Instance = AUDIO_IN_SAIx;
DL3LD 1:1556bcaaf759 1367
DL3LD 1:1556bcaaf759 1368 /* Disable SAI peripheral */
DL3LD 1:1556bcaaf759 1369 __HAL_SAI_DISABLE(&haudio_in_sai);
DL3LD 1:1556bcaaf759 1370
DL3LD 1:1556bcaaf759 1371 HAL_SAI_DeInit(&haudio_in_sai);
DL3LD 1:1556bcaaf759 1372 }
DL3LD 1:1556bcaaf759 1373
DL3LD 1:1556bcaaf759 1374 /**
DL3LD 1:1556bcaaf759 1375 * @brief This function handles External line 15_10 interrupt request.
DL3LD 1:1556bcaaf759 1376 * @param None
DL3LD 1:1556bcaaf759 1377 * @retval None
DL3LD 1:1556bcaaf759 1378 */
DL3LD 1:1556bcaaf759 1379 static void AUDIO_IN_INT_IRQHandler(void)
DL3LD 1:1556bcaaf759 1380 {
DL3LD 1:1556bcaaf759 1381 /* Interrupt handler shared between SD_DETECT pin, USER_KEY button and touch screen interrupt */
DL3LD 1:1556bcaaf759 1382 if (__HAL_GPIO_EXTI_GET_IT(AUDIO_IN_INT_GPIO_PIN) != RESET)
DL3LD 1:1556bcaaf759 1383 {
DL3LD 1:1556bcaaf759 1384 HAL_GPIO_EXTI_IRQHandler(AUDIO_IN_INT_GPIO_PIN); /* Audio Interrupt */
DL3LD 1:1556bcaaf759 1385 }
DL3LD 1:1556bcaaf759 1386 }
DL3LD 1:1556bcaaf759 1387
DL3LD 1:1556bcaaf759 1388 /**
DL3LD 1:1556bcaaf759 1389 * @brief This function handles DMA2 Stream 7 interrupt request.
DL3LD 1:1556bcaaf759 1390 * @param None
DL3LD 1:1556bcaaf759 1391 * @retval None
DL3LD 1:1556bcaaf759 1392 */
DL3LD 1:1556bcaaf759 1393 static void AUDIO_IN_SAIx_DMAx_IRQHandler(void)
DL3LD 1:1556bcaaf759 1394 {
DL3LD 1:1556bcaaf759 1395 HAL_DMA_IRQHandler(haudio_in_sai.hdmarx);
DL3LD 1:1556bcaaf759 1396 }
DL3LD 1:1556bcaaf759 1397
DL3LD 1:1556bcaaf759 1398 /**
DL3LD 1:1556bcaaf759 1399 * @brief This function handles DMA2 Stream 6 interrupt request.
DL3LD 1:1556bcaaf759 1400 * @param None
DL3LD 1:1556bcaaf759 1401 * @retval None
DL3LD 1:1556bcaaf759 1402 */
DL3LD 1:1556bcaaf759 1403 static void AUDIO_OUT_SAIx_DMAx_IRQHandler(void)
DL3LD 1:1556bcaaf759 1404 {
DL3LD 1:1556bcaaf759 1405 HAL_DMA_IRQHandler(haudio_out_sai.hdmatx);
DL3LD 1:1556bcaaf759 1406 }
DL3LD 1:1556bcaaf759 1407
DL3LD 1:1556bcaaf759 1408 /**
DL3LD 1:1556bcaaf759 1409 * @}
DL3LD 1:1556bcaaf759 1410 */
DL3LD 1:1556bcaaf759 1411
DL3LD 1:1556bcaaf759 1412 /**
DL3LD 1:1556bcaaf759 1413 * @}
DL3LD 1:1556bcaaf759 1414 */
DL3LD 1:1556bcaaf759 1415
DL3LD 1:1556bcaaf759 1416 /**
DL3LD 1:1556bcaaf759 1417 * @}
DL3LD 1:1556bcaaf759 1418 */
DL3LD 1:1556bcaaf759 1419
DL3LD 1:1556bcaaf759 1420 /**
DL3LD 1:1556bcaaf759 1421 * @}
DL3LD 1:1556bcaaf759 1422 */
DL3LD 1:1556bcaaf759 1423
DL3LD 1:1556bcaaf759 1424 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
DL3LD 1:1556bcaaf759 1425