bugfixes and reduced version for disco board only

Dependents:   Scope DISCO-F746NG_Sinewave DISCO-F746NG_Sweep DISCO-F746NG_Oscilloscope ... more

Fork of BSP_DISCO_F746NG_patch by Nirvana Jay

Committer:
the_sz
Date:
Sun Jan 31 17:45:21 2016 +0000
Revision:
7:a4e658110084
Parent:
4:0094f74cb733
remove debug line

Who changed what in which revision?

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