SPKT

Dependents:   Player

Committer:
phungductung
Date:
Fri Jun 07 05:06:42 2019 +0000
Revision:
0:4e245f4bc8ac
spkt

Who changed what in which revision?

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