mbed library sources

Dependents:   Marvino mbot

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

Full URL: https://github.com/mbedmicro/mbed/commit/6d84db41c6833e0b9b024741eb0616a5f62d5599/

DISCO_F746NG - Improvements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 610:813dcc80987e 1 /**
mbed_official 610:813dcc80987e 2 ******************************************************************************
mbed_official 610:813dcc80987e 3 * @file stm32l4xx_hal_sai.c
mbed_official 610:813dcc80987e 4 * @author MCD Application Team
mbed_official 610:813dcc80987e 5 * @version V1.0.0
mbed_official 610:813dcc80987e 6 * @date 26-June-2015
mbed_official 610:813dcc80987e 7 * @brief SAI HAL module driver.
mbed_official 610:813dcc80987e 8 * This file provides firmware functions to manage the following
mbed_official 610:813dcc80987e 9 * functionalities of the Serial Audio Interface (SAI) peripheral:
mbed_official 610:813dcc80987e 10 * + Initialization/de-initialization functions
mbed_official 610:813dcc80987e 11 * + I/O operation functions
mbed_official 610:813dcc80987e 12 * + Peripheral Control functions
mbed_official 610:813dcc80987e 13 * + Peripheral State functions
mbed_official 610:813dcc80987e 14 *
mbed_official 610:813dcc80987e 15 @verbatim
mbed_official 610:813dcc80987e 16 ==============================================================================
mbed_official 610:813dcc80987e 17 ##### How to use this driver #####
mbed_official 610:813dcc80987e 18 ==============================================================================
mbed_official 610:813dcc80987e 19 [..]
mbed_official 610:813dcc80987e 20 The SAI HAL driver can be used as follows:
mbed_official 610:813dcc80987e 21
mbed_official 610:813dcc80987e 22 (#) Declare a SAI_HandleTypeDef handle structure (eg. SAI_HandleTypeDef hsai).
mbed_official 610:813dcc80987e 23 (#) Initialize the SAI low level resources by implementing the HAL_SAI_MspInit() API:
mbed_official 610:813dcc80987e 24 (##) Enable the SAI interface clock.
mbed_official 610:813dcc80987e 25 (##) SAI pins configuration:
mbed_official 610:813dcc80987e 26 (+++) Enable the clock for the SAI GPIOs.
mbed_official 610:813dcc80987e 27 (+++) Configure these SAI pins as alternate function pull-up.
mbed_official 610:813dcc80987e 28 (##) NVIC configuration if you need to use interrupt process (HAL_SAI_Transmit_IT()
mbed_official 610:813dcc80987e 29 and HAL_SAI_Receive_IT() APIs):
mbed_official 610:813dcc80987e 30 (+++) Configure the SAI interrupt priority.
mbed_official 610:813dcc80987e 31 (+++) Enable the NVIC SAI IRQ handle.
mbed_official 610:813dcc80987e 32
mbed_official 610:813dcc80987e 33 (##) DMA Configuration if you need to use DMA process (HAL_SAI_Transmit_DMA()
mbed_official 610:813dcc80987e 34 and HAL_SAI_Receive_DMA() APIs):
mbed_official 610:813dcc80987e 35 (+++) Declare a DMA handle structure for the Tx/Rx channel.
mbed_official 610:813dcc80987e 36 (+++) Enable the DMAx interface clock.
mbed_official 610:813dcc80987e 37 (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
mbed_official 610:813dcc80987e 38 (+++) Configure the DMA Tx/Rx Channel.
mbed_official 610:813dcc80987e 39 (+++) Associate the initialized DMA handle to the SAI DMA Tx/Rx handle.
mbed_official 610:813dcc80987e 40 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the
mbed_official 610:813dcc80987e 41 DMA Tx/Rx Channel.
mbed_official 610:813dcc80987e 42
mbed_official 610:813dcc80987e 43 (#) The initialization can be done by two ways
mbed_official 610:813dcc80987e 44 (##) Expert mode : Initialize the structures Init, FrameInit and SlotInit and call HAL_SAI_Init().
mbed_official 610:813dcc80987e 45 (##) Simplified mode : Initialize the high part of Init Structure and call HAL_SAI_InitProtocol().
mbed_official 610:813dcc80987e 46
mbed_official 610:813dcc80987e 47 [..]
mbed_official 610:813dcc80987e 48 (@) The specific SAI interrupts (FIFO request and Overrun underrun interrupt)
mbed_official 610:813dcc80987e 49 will be managed using the macros __HAL_SAI_ENABLE_IT() and __HAL_SAI_DISABLE_IT()
mbed_official 610:813dcc80987e 50 inside the transmit and receive process.
mbed_official 610:813dcc80987e 51
mbed_official 610:813dcc80987e 52 [..]
mbed_official 610:813dcc80987e 53 (@) Make sure that either:
mbed_official 610:813dcc80987e 54 (+@) PLLSAI1CLK output is configured or
mbed_official 610:813dcc80987e 55 (+@) PLLSAI2CLK output is configured or
mbed_official 610:813dcc80987e 56 (+@) PLLSAI3CLK output is configured or
mbed_official 610:813dcc80987e 57 (+@) External clock source is configured after setting correctly
mbed_official 610:813dcc80987e 58 the define constant EXTERNAL_SAI1_CLOCK_VALUE or EXTERNAL_SAI2_CLOCK_VALUE in the stm32l4xx_hal_conf.h file.
mbed_official 610:813dcc80987e 59
mbed_official 610:813dcc80987e 60 [..]
mbed_official 610:813dcc80987e 61 (@) In master Tx mode: enabling the audio block immediately generates the bit clock
mbed_official 610:813dcc80987e 62 for the external slaves even if there is no data in the FIFO, However FS signal
mbed_official 610:813dcc80987e 63 generation is conditioned by the presence of data in the FIFO.
mbed_official 610:813dcc80987e 64
mbed_official 610:813dcc80987e 65 [..]
mbed_official 610:813dcc80987e 66 (@) In master Rx mode: enabling the audio block immediately generates the bit clock
mbed_official 610:813dcc80987e 67 and FS signal for the external slaves.
mbed_official 610:813dcc80987e 68
mbed_official 610:813dcc80987e 69 [..]
mbed_official 610:813dcc80987e 70 (@) It is mandatory to respect the following conditions in order to avoid bad SAI behavior:
mbed_official 610:813dcc80987e 71 (+@) First bit Offset <= (SLOT size - Data size)
mbed_official 610:813dcc80987e 72 (+@) Data size <= SLOT size
mbed_official 610:813dcc80987e 73 (+@) Number of SLOT x SLOT size = Frame length
mbed_official 610:813dcc80987e 74 (+@) The number of slots should be even when SAI_FS_CHANNEL_IDENTIFICATION is selected.
mbed_official 610:813dcc80987e 75
mbed_official 610:813dcc80987e 76 [..]
mbed_official 610:813dcc80987e 77 Three operation modes are available within this driver :
mbed_official 610:813dcc80987e 78
mbed_official 610:813dcc80987e 79 *** Polling mode IO operation ***
mbed_official 610:813dcc80987e 80 =================================
mbed_official 610:813dcc80987e 81 [..]
mbed_official 610:813dcc80987e 82 (+) Send an amount of data in blocking mode using HAL_SAI_Transmit()
mbed_official 610:813dcc80987e 83 (+) Receive an amount of data in blocking mode using HAL_SAI_Receive()
mbed_official 610:813dcc80987e 84
mbed_official 610:813dcc80987e 85 *** Interrupt mode IO operation ***
mbed_official 610:813dcc80987e 86 ===================================
mbed_official 610:813dcc80987e 87 [..]
mbed_official 610:813dcc80987e 88 (+) Send an amount of data in non-blocking mode using HAL_SAI_Transmit_IT()
mbed_official 610:813dcc80987e 89 (+) At transmission end of transfer HAL_SAI_TxCpltCallback() is executed and user can
mbed_official 610:813dcc80987e 90 add his own code by customization of function pointer HAL_SAI_TxCpltCallback()
mbed_official 610:813dcc80987e 91 (+) Receive an amount of data in non-blocking mode using HAL_SAI_Receive_IT()
mbed_official 610:813dcc80987e 92 (+) At reception end of transfer HAL_SAI_RxCpltCallback() is executed and user can
mbed_official 610:813dcc80987e 93 add his own code by customization of function pointer HAL_SAI_RxCpltCallback()
mbed_official 610:813dcc80987e 94 (+) In case of flag error, HAL_SAI_ErrorCallback() function is executed and user can
mbed_official 610:813dcc80987e 95 add his own code by customization of function pointer HAL_SAI_ErrorCallback()
mbed_official 610:813dcc80987e 96
mbed_official 610:813dcc80987e 97 *** DMA mode IO operation ***
mbed_official 610:813dcc80987e 98 ==============================
mbed_official 610:813dcc80987e 99 [..]
mbed_official 610:813dcc80987e 100 (+) Send an amount of data in non-blocking mode (DMA) using HAL_SAI_Transmit_DMA()
mbed_official 610:813dcc80987e 101 (+) At transmission end of transfer HAL_SAI_TxCpltCallback() is executed and user can
mbed_official 610:813dcc80987e 102 add his own code by customization of function pointer HAL_SAI_TxCpltCallback()
mbed_official 610:813dcc80987e 103 (+) Receive an amount of data in non-blocking mode (DMA) using HAL_SAI_Receive_DMA()
mbed_official 610:813dcc80987e 104 (+) At reception end of transfer HAL_SAI_RxCpltCallback() is executed and user can
mbed_official 610:813dcc80987e 105 add his own code by customization of function pointer HAL_SAI_RxCpltCallback()
mbed_official 610:813dcc80987e 106 (+) In case of flag error, HAL_SAI_ErrorCallback() function is executed and user can
mbed_official 610:813dcc80987e 107 add his own code by customization of function pointer HAL_SAI_ErrorCallback()
mbed_official 610:813dcc80987e 108 (+) Pause the DMA Transfer using HAL_SAI_DMAPause()
mbed_official 610:813dcc80987e 109 (+) Resume the DMA Transfer using HAL_SAI_DMAResume()
mbed_official 610:813dcc80987e 110 (+) Stop the DMA Transfer using HAL_SAI_DMAStop()
mbed_official 610:813dcc80987e 111
mbed_official 610:813dcc80987e 112 *** SAI HAL driver additional function list ***
mbed_official 610:813dcc80987e 113 =================================================
mbed_official 610:813dcc80987e 114 [..]
mbed_official 610:813dcc80987e 115 Below the list the others API available SAI HAL driver :
mbed_official 610:813dcc80987e 116
mbed_official 610:813dcc80987e 117 (+) HAL_SAI_EnableTxMuteMode(): Enable the mute in tx mode
mbed_official 610:813dcc80987e 118 (+) HAL_SAI_DisableTxMuteMode(): Disable the mute in tx mode
mbed_official 610:813dcc80987e 119 (+) HAL_SAI_EnableRxMuteMode(): Enable the mute in Rx mode
mbed_official 610:813dcc80987e 120 (+) HAL_SAI_DisableRxMuteMode(): Disable the mute in Rx mode
mbed_official 610:813dcc80987e 121 (+) HAL_SAI_FlushRxFifo(): Flush the rx fifo.
mbed_official 610:813dcc80987e 122 (+) HAL_SAI_Abort(): Abort the current transfer
mbed_official 610:813dcc80987e 123
mbed_official 610:813dcc80987e 124 *** SAI HAL driver macros list ***
mbed_official 610:813dcc80987e 125 =============================================
mbed_official 610:813dcc80987e 126 [..]
mbed_official 610:813dcc80987e 127 Below the list of most used macros in SAI HAL driver :
mbed_official 610:813dcc80987e 128
mbed_official 610:813dcc80987e 129 (+) __HAL_SAI_ENABLE(): Enable the SAI peripheral
mbed_official 610:813dcc80987e 130 (+) __HAL_SAI_DISABLE(): Disable the SAI peripheral
mbed_official 610:813dcc80987e 131 (+) __HAL_SAI_ENABLE_IT(): Enable the specified SAI interrupts
mbed_official 610:813dcc80987e 132 (+) __HAL_SAI_DISABLE_IT(): Disable the specified SAI interrupts
mbed_official 610:813dcc80987e 133 (+) __HAL_SAI_GET_IT_SOURCE(): Check if the specified SAI interrupt source is
mbed_official 610:813dcc80987e 134 enabled or disabled
mbed_official 610:813dcc80987e 135 (+) __HAL_SAI_GET_FLAG(): Check whether the specified SAI flag is set or not
mbed_official 610:813dcc80987e 136
mbed_official 610:813dcc80987e 137 @endverbatim
mbed_official 610:813dcc80987e 138 ******************************************************************************
mbed_official 610:813dcc80987e 139 * @attention
mbed_official 610:813dcc80987e 140 *
mbed_official 610:813dcc80987e 141 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 610:813dcc80987e 142 *
mbed_official 610:813dcc80987e 143 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 610:813dcc80987e 144 * are permitted provided that the following conditions are met:
mbed_official 610:813dcc80987e 145 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 610:813dcc80987e 146 * this list of conditions and the following disclaimer.
mbed_official 610:813dcc80987e 147 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 610:813dcc80987e 148 * this list of conditions and the following disclaimer in the documentation
mbed_official 610:813dcc80987e 149 * and/or other materials provided with the distribution.
mbed_official 610:813dcc80987e 150 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 610:813dcc80987e 151 * may be used to endorse or promote products derived from this software
mbed_official 610:813dcc80987e 152 * without specific prior written permission.
mbed_official 610:813dcc80987e 153 *
mbed_official 610:813dcc80987e 154 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 610:813dcc80987e 155 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 610:813dcc80987e 156 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 610:813dcc80987e 157 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 610:813dcc80987e 158 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 610:813dcc80987e 159 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 610:813dcc80987e 160 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 610:813dcc80987e 161 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 610:813dcc80987e 162 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 610:813dcc80987e 163 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 610:813dcc80987e 164 *
mbed_official 610:813dcc80987e 165 ******************************************************************************
mbed_official 610:813dcc80987e 166 */
mbed_official 610:813dcc80987e 167
mbed_official 610:813dcc80987e 168 /* Includes ------------------------------------------------------------------*/
mbed_official 610:813dcc80987e 169 #include "stm32l4xx_hal.h"
mbed_official 610:813dcc80987e 170
mbed_official 610:813dcc80987e 171 /** @addtogroup STM32L4xx_HAL_Driver
mbed_official 610:813dcc80987e 172 * @{
mbed_official 610:813dcc80987e 173 */
mbed_official 610:813dcc80987e 174
mbed_official 610:813dcc80987e 175 /** @defgroup SAI SAI
mbed_official 610:813dcc80987e 176 * @brief SAI HAL module driver
mbed_official 610:813dcc80987e 177 * @{
mbed_official 610:813dcc80987e 178 */
mbed_official 610:813dcc80987e 179
mbed_official 610:813dcc80987e 180 #ifdef HAL_SAI_MODULE_ENABLED
mbed_official 610:813dcc80987e 181
mbed_official 610:813dcc80987e 182 /* Private typedef -----------------------------------------------------------*/
mbed_official 610:813dcc80987e 183 /** @defgroup SAI_Private_Typedefs SAI Private Typedefs
mbed_official 610:813dcc80987e 184 * @{
mbed_official 610:813dcc80987e 185 */
mbed_official 610:813dcc80987e 186 typedef enum {
mbed_official 610:813dcc80987e 187 SAI_MODE_DMA,
mbed_official 610:813dcc80987e 188 SAI_MODE_IT
mbed_official 610:813dcc80987e 189 }SAI_ModeTypedef;
mbed_official 610:813dcc80987e 190 /**
mbed_official 610:813dcc80987e 191 * @}
mbed_official 610:813dcc80987e 192 */
mbed_official 610:813dcc80987e 193
mbed_official 610:813dcc80987e 194 /* Private define ------------------------------------------------------------*/
mbed_official 610:813dcc80987e 195 /** @defgroup SAI_Private_Constants SAI Private Constants
mbed_official 610:813dcc80987e 196 * @{
mbed_official 610:813dcc80987e 197 */
mbed_official 610:813dcc80987e 198 #define SAI_FIFO_SIZE 8
mbed_official 610:813dcc80987e 199 #define SAI_DEFAULT_TIMEOUT 4
mbed_official 610:813dcc80987e 200 /**
mbed_official 610:813dcc80987e 201 * @}
mbed_official 610:813dcc80987e 202 */
mbed_official 610:813dcc80987e 203
mbed_official 610:813dcc80987e 204 /* Private macro -------------------------------------------------------------*/
mbed_official 610:813dcc80987e 205 /* Private variables ---------------------------------------------------------*/
mbed_official 610:813dcc80987e 206 /* Private function prototypes -----------------------------------------------*/
mbed_official 610:813dcc80987e 207 /** @defgroup SAI_Private_Functions SAI Private Functions
mbed_official 610:813dcc80987e 208 * @{
mbed_official 610:813dcc80987e 209 */
mbed_official 610:813dcc80987e 210 static void SAI_FillFifo(SAI_HandleTypeDef *hsai);
mbed_official 610:813dcc80987e 211 static int32_t SAI_InterruptFlag(SAI_HandleTypeDef *hsai, uint32_t mode);
mbed_official 610:813dcc80987e 212 static HAL_StatusTypeDef SAI_InitI2S(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot);
mbed_official 610:813dcc80987e 213 static HAL_StatusTypeDef SAI_InitPCM(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot);
mbed_official 610:813dcc80987e 214
mbed_official 610:813dcc80987e 215 static HAL_StatusTypeDef SAI_Disable(SAI_HandleTypeDef *hsai);
mbed_official 610:813dcc80987e 216 static void SAI_Transmit_IT8Bit(SAI_HandleTypeDef *hsai);
mbed_official 610:813dcc80987e 217 static void SAI_Transmit_IT16Bit(SAI_HandleTypeDef *hsai);
mbed_official 610:813dcc80987e 218 static void SAI_Transmit_IT32Bit(SAI_HandleTypeDef *hsai);
mbed_official 610:813dcc80987e 219 static void SAI_Receive_IT8Bit(SAI_HandleTypeDef *hsai);
mbed_official 610:813dcc80987e 220 static void SAI_Receive_IT16Bit(SAI_HandleTypeDef *hsai);
mbed_official 610:813dcc80987e 221 static void SAI_Receive_IT32Bit(SAI_HandleTypeDef *hsai);
mbed_official 610:813dcc80987e 222 static void SAI_DMATxCplt(DMA_HandleTypeDef *hdma);
mbed_official 610:813dcc80987e 223 static void SAI_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 610:813dcc80987e 224 static void SAI_DMARxCplt(DMA_HandleTypeDef *hdma);
mbed_official 610:813dcc80987e 225 static void SAI_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 610:813dcc80987e 226 static void SAI_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 610:813dcc80987e 227 /**
mbed_official 610:813dcc80987e 228 * @}
mbed_official 610:813dcc80987e 229 */
mbed_official 610:813dcc80987e 230
mbed_official 610:813dcc80987e 231 /* Exported functions --------------------------------------------------------*/
mbed_official 610:813dcc80987e 232
mbed_official 610:813dcc80987e 233 /** @defgroup SAI_Exported_Functions SAI Exported Functions
mbed_official 610:813dcc80987e 234 * @{
mbed_official 610:813dcc80987e 235 */
mbed_official 610:813dcc80987e 236
mbed_official 610:813dcc80987e 237 /** @defgroup SAI_Exported_Functions_Group1 Initialization and de-initialization functions
mbed_official 610:813dcc80987e 238 * @brief Initialization and Configuration functions
mbed_official 610:813dcc80987e 239 *
mbed_official 610:813dcc80987e 240 @verbatim
mbed_official 610:813dcc80987e 241 ===============================================================================
mbed_official 610:813dcc80987e 242 ##### Initialization and de-initialization functions #####
mbed_official 610:813dcc80987e 243 ===============================================================================
mbed_official 610:813dcc80987e 244 [..] This subsection provides a set of functions allowing to initialize and
mbed_official 610:813dcc80987e 245 de-initialize the SAIx peripheral:
mbed_official 610:813dcc80987e 246
mbed_official 610:813dcc80987e 247 (+) User must implement HAL_SAI_MspInit() function in which he configures
mbed_official 610:813dcc80987e 248 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).
mbed_official 610:813dcc80987e 249
mbed_official 610:813dcc80987e 250 (+) Call the function HAL_SAI_Init() to configure the selected device with
mbed_official 610:813dcc80987e 251 the selected configuration:
mbed_official 610:813dcc80987e 252 (++) Mode (Master/slave TX/RX)
mbed_official 610:813dcc80987e 253 (++) Protocol
mbed_official 610:813dcc80987e 254 (++) Data Size
mbed_official 610:813dcc80987e 255 (++) MCLK Output
mbed_official 610:813dcc80987e 256 (++) Audio frequency
mbed_official 610:813dcc80987e 257 (++) FIFO Threshold
mbed_official 610:813dcc80987e 258 (++) Frame Config
mbed_official 610:813dcc80987e 259 (++) Slot Config
mbed_official 610:813dcc80987e 260
mbed_official 610:813dcc80987e 261 (+) Call the function HAL_SAI_DeInit() to restore the default configuration
mbed_official 610:813dcc80987e 262 of the selected SAI peripheral.
mbed_official 610:813dcc80987e 263
mbed_official 610:813dcc80987e 264 @endverbatim
mbed_official 610:813dcc80987e 265 * @{
mbed_official 610:813dcc80987e 266 */
mbed_official 610:813dcc80987e 267
mbed_official 610:813dcc80987e 268 /**
mbed_official 610:813dcc80987e 269 * @brief Initialize the structure FrameInit, SlotInit and the low part of
mbed_official 610:813dcc80987e 270 * Init according to the specified parameters and call the function
mbed_official 610:813dcc80987e 271 * HAL_SAI_Init to initialize the SAI block.
mbed_official 610:813dcc80987e 272 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 273 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 274 * @param protocol: one of the supported protocol @ref SAI_Protocol
mbed_official 610:813dcc80987e 275 * @param datasize: one of the supported datasize @ref SAI_Protocol_DataSize
mbed_official 610:813dcc80987e 276 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 277 * @param nbslot: Number of slot.
mbed_official 610:813dcc80987e 278 * @retval HAL status
mbed_official 610:813dcc80987e 279 */
mbed_official 610:813dcc80987e 280 HAL_StatusTypeDef HAL_SAI_InitProtocol(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
mbed_official 610:813dcc80987e 281 {
mbed_official 610:813dcc80987e 282 HAL_StatusTypeDef errorcode = HAL_OK;
mbed_official 610:813dcc80987e 283
mbed_official 610:813dcc80987e 284 switch(protocol)
mbed_official 610:813dcc80987e 285 {
mbed_official 610:813dcc80987e 286 case SAI_I2S_STANDARD :
mbed_official 610:813dcc80987e 287 case SAI_I2S_MSBJUSTIFIED :
mbed_official 610:813dcc80987e 288 case SAI_I2S_LSBJUSTIFIED :
mbed_official 610:813dcc80987e 289 errorcode = SAI_InitI2S(hsai, protocol, datasize, nbslot);
mbed_official 610:813dcc80987e 290 break;
mbed_official 610:813dcc80987e 291 case SAI_PCM_LONG :
mbed_official 610:813dcc80987e 292 case SAI_PCM_SHORT :
mbed_official 610:813dcc80987e 293 errorcode = SAI_InitPCM(hsai, protocol, datasize, nbslot);
mbed_official 610:813dcc80987e 294 break;
mbed_official 610:813dcc80987e 295 default :
mbed_official 610:813dcc80987e 296 errorcode = HAL_ERROR;
mbed_official 610:813dcc80987e 297 break;
mbed_official 610:813dcc80987e 298 }
mbed_official 610:813dcc80987e 299
mbed_official 610:813dcc80987e 300 if(errorcode == HAL_OK)
mbed_official 610:813dcc80987e 301 {
mbed_official 610:813dcc80987e 302 errorcode = HAL_SAI_Init(hsai);
mbed_official 610:813dcc80987e 303 }
mbed_official 610:813dcc80987e 304
mbed_official 610:813dcc80987e 305 return errorcode;
mbed_official 610:813dcc80987e 306 }
mbed_official 610:813dcc80987e 307
mbed_official 610:813dcc80987e 308 /**
mbed_official 610:813dcc80987e 309 * @brief Initialize the SAI according to the specified parameters
mbed_official 610:813dcc80987e 310 * in the SAI_InitTypeDef structure and initialize the associated handle.
mbed_official 610:813dcc80987e 311 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 312 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 313 * @retval HAL status
mbed_official 610:813dcc80987e 314 */
mbed_official 610:813dcc80987e 315 HAL_StatusTypeDef HAL_SAI_Init(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 316 {
mbed_official 610:813dcc80987e 317 uint32_t tmpregisterGCR = 0;
mbed_official 610:813dcc80987e 318
mbed_official 610:813dcc80987e 319 /* Check the SAI handle allocation */
mbed_official 610:813dcc80987e 320 if(hsai == NULL)
mbed_official 610:813dcc80987e 321 {
mbed_official 610:813dcc80987e 322 return HAL_ERROR;
mbed_official 610:813dcc80987e 323 }
mbed_official 610:813dcc80987e 324
mbed_official 610:813dcc80987e 325 /* check the instance */
mbed_official 610:813dcc80987e 326 assert_param(IS_SAI_ALL_INSTANCE(hsai->Instance));
mbed_official 610:813dcc80987e 327
mbed_official 610:813dcc80987e 328 /* Check the SAI Block parameters */
mbed_official 610:813dcc80987e 329 assert_param(IS_SAI_AUDIO_FREQUENCY(hsai->Init.AudioFrequency));
mbed_official 610:813dcc80987e 330 assert_param(IS_SAI_BLOCK_PROTOCOL(hsai->Init.Protocol));
mbed_official 610:813dcc80987e 331 assert_param(IS_SAI_BLOCK_MODE(hsai->Init.AudioMode));
mbed_official 610:813dcc80987e 332 assert_param(IS_SAI_BLOCK_DATASIZE(hsai->Init.DataSize));
mbed_official 610:813dcc80987e 333 assert_param(IS_SAI_BLOCK_FIRST_BIT(hsai->Init.FirstBit));
mbed_official 610:813dcc80987e 334 assert_param(IS_SAI_BLOCK_CLOCK_STROBING(hsai->Init.ClockStrobing));
mbed_official 610:813dcc80987e 335 assert_param(IS_SAI_BLOCK_SYNCHRO(hsai->Init.Synchro));
mbed_official 610:813dcc80987e 336 assert_param(IS_SAI_BLOCK_OUTPUT_DRIVE(hsai->Init.OutputDrive));
mbed_official 610:813dcc80987e 337 assert_param(IS_SAI_BLOCK_NODIVIDER(hsai->Init.NoDivider));
mbed_official 610:813dcc80987e 338 assert_param(IS_SAI_BLOCK_FIFO_THRESHOLD(hsai->Init.FIFOThreshold));
mbed_official 610:813dcc80987e 339 assert_param(IS_SAI_MONOSTEREO_MODE(hsai->Init.MonoStereoMode));
mbed_official 610:813dcc80987e 340 assert_param(IS_SAI_BLOCK_COMPANDING_MODE(hsai->Init.CompandingMode));
mbed_official 610:813dcc80987e 341 assert_param(IS_SAI_BLOCK_TRISTATE_MANAGEMENT(hsai->Init.TriState));
mbed_official 610:813dcc80987e 342 assert_param(IS_SAI_BLOCK_SYNCEXT(hsai->Init.SynchroExt));
mbed_official 610:813dcc80987e 343
mbed_official 610:813dcc80987e 344 /* Check the SAI Block Frame parameters */
mbed_official 610:813dcc80987e 345 assert_param(IS_SAI_BLOCK_FRAME_LENGTH(hsai->FrameInit.FrameLength));
mbed_official 610:813dcc80987e 346 assert_param(IS_SAI_BLOCK_ACTIVE_FRAME(hsai->FrameInit.ActiveFrameLength));
mbed_official 610:813dcc80987e 347 assert_param(IS_SAI_BLOCK_FS_DEFINITION(hsai->FrameInit.FSDefinition));
mbed_official 610:813dcc80987e 348 assert_param(IS_SAI_BLOCK_FS_POLARITY(hsai->FrameInit.FSPolarity));
mbed_official 610:813dcc80987e 349 assert_param(IS_SAI_BLOCK_FS_OFFSET(hsai->FrameInit.FSOffset));
mbed_official 610:813dcc80987e 350
mbed_official 610:813dcc80987e 351 /* Check the SAI Block Slot parameters */
mbed_official 610:813dcc80987e 352 assert_param(IS_SAI_BLOCK_FIRSTBIT_OFFSET(hsai->SlotInit.FirstBitOffset));
mbed_official 610:813dcc80987e 353 assert_param(IS_SAI_BLOCK_SLOT_SIZE(hsai->SlotInit.SlotSize));
mbed_official 610:813dcc80987e 354 assert_param(IS_SAI_BLOCK_SLOT_NUMBER(hsai->SlotInit.SlotNumber));
mbed_official 610:813dcc80987e 355 assert_param(IS_SAI_SLOT_ACTIVE(hsai->SlotInit.SlotActive));
mbed_official 610:813dcc80987e 356
mbed_official 610:813dcc80987e 357 if(hsai->State == HAL_SAI_STATE_RESET)
mbed_official 610:813dcc80987e 358 {
mbed_official 610:813dcc80987e 359 /* Allocate lock resource and initialize it */
mbed_official 610:813dcc80987e 360 hsai->Lock = HAL_UNLOCKED;
mbed_official 610:813dcc80987e 361
mbed_official 610:813dcc80987e 362 /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
mbed_official 610:813dcc80987e 363 HAL_SAI_MspInit(hsai);
mbed_official 610:813dcc80987e 364 }
mbed_official 610:813dcc80987e 365
mbed_official 610:813dcc80987e 366 hsai->State = HAL_SAI_STATE_BUSY;
mbed_official 610:813dcc80987e 367
mbed_official 610:813dcc80987e 368 /* Disable the selected SAI peripheral */
mbed_official 610:813dcc80987e 369 SAI_Disable(hsai);
mbed_official 610:813dcc80987e 370
mbed_official 610:813dcc80987e 371 /* SAI Block Synchro Configuration ---------------------------------------------------*/
mbed_official 610:813dcc80987e 372 /* This setting must be done with both audio block (A & B) disabled */
mbed_official 610:813dcc80987e 373 switch(hsai->Init.SynchroExt)
mbed_official 610:813dcc80987e 374 {
mbed_official 610:813dcc80987e 375 case SAI_SYNCEXT_IN_ENABLE :
mbed_official 610:813dcc80987e 376 tmpregisterGCR = SAI_GCR_SYNCIN_0;
mbed_official 610:813dcc80987e 377 break;
mbed_official 610:813dcc80987e 378 case SAI_SYNCEXT_OUTBLOCKA_ENABLE :
mbed_official 610:813dcc80987e 379 tmpregisterGCR = SAI_GCR_SYNCOUT_0;
mbed_official 610:813dcc80987e 380 break;
mbed_official 610:813dcc80987e 381 case SAI_SYNCEXT_OUTBLOCKB_ENABLE :
mbed_official 610:813dcc80987e 382 tmpregisterGCR = SAI_GCR_SYNCOUT_1;
mbed_official 610:813dcc80987e 383 break;
mbed_official 610:813dcc80987e 384 case SAI_SYNCEXT_DISABLE :
mbed_official 610:813dcc80987e 385 default:
mbed_official 610:813dcc80987e 386 tmpregisterGCR = 0;
mbed_official 610:813dcc80987e 387 break;
mbed_official 610:813dcc80987e 388 }
mbed_official 610:813dcc80987e 389
mbed_official 610:813dcc80987e 390 if((hsai->Instance == SAI1_Block_A) || (hsai->Instance == SAI1_Block_B))
mbed_official 610:813dcc80987e 391 {
mbed_official 610:813dcc80987e 392 SAI1->GCR = tmpregisterGCR;
mbed_official 610:813dcc80987e 393 }
mbed_official 610:813dcc80987e 394 else
mbed_official 610:813dcc80987e 395 {
mbed_official 610:813dcc80987e 396 SAI2->GCR = tmpregisterGCR;
mbed_official 610:813dcc80987e 397 }
mbed_official 610:813dcc80987e 398
mbed_official 610:813dcc80987e 399 if(hsai->Init.AudioFrequency != SAI_AUDIO_FREQUENCY_MCKDIV)
mbed_official 610:813dcc80987e 400 {
mbed_official 610:813dcc80987e 401 uint32_t freq = 0;
mbed_official 610:813dcc80987e 402 uint32_t tmpval;
mbed_official 610:813dcc80987e 403 /* In this case, the MCKDIV value is calculated to get AudioFrequency */
mbed_official 610:813dcc80987e 404 if((hsai->Instance == SAI1_Block_A ) || (hsai->Instance == SAI1_Block_B ))
mbed_official 610:813dcc80987e 405 {
mbed_official 610:813dcc80987e 406 freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI1);
mbed_official 610:813dcc80987e 407 }
mbed_official 610:813dcc80987e 408 if((hsai->Instance == SAI2_Block_A ) || (hsai->Instance == SAI2_Block_B ))
mbed_official 610:813dcc80987e 409 {
mbed_official 610:813dcc80987e 410 freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI2);
mbed_official 610:813dcc80987e 411 }
mbed_official 610:813dcc80987e 412
mbed_official 610:813dcc80987e 413 /* Configure Master Clock using the following formula :
mbed_official 610:813dcc80987e 414 MCLK_x = SAI_CK_x / (MCKDIV[3:0] * 2) with MCLK_x = 256 * FS
mbed_official 610:813dcc80987e 415 FS = SAI_CK_x / (MCKDIV[3:0] * 2) * 256
mbed_official 610:813dcc80987e 416 MCKDIV[3:0] = SAI_CK_x / FS * 512 */
mbed_official 610:813dcc80987e 417 /* (freq x 10) to keep Significant digits */
mbed_official 610:813dcc80987e 418 tmpval = (freq * 10) / (hsai->Init.AudioFrequency * 2 * 256);
mbed_official 610:813dcc80987e 419 hsai->Init.Mckdiv = tmpval / 10;
mbed_official 610:813dcc80987e 420
mbed_official 610:813dcc80987e 421 /* Round result to the nearest integer */
mbed_official 610:813dcc80987e 422 if((tmpval % 10) > 8)
mbed_official 610:813dcc80987e 423 {
mbed_official 610:813dcc80987e 424 hsai->Init.Mckdiv+= 1;
mbed_official 610:813dcc80987e 425 }
mbed_official 610:813dcc80987e 426 }
mbed_official 610:813dcc80987e 427
mbed_official 610:813dcc80987e 428 /* SAI Block Configuration ------------------------------------------------------------*/
mbed_official 610:813dcc80987e 429 /* SAI CR1 Configuration */
mbed_official 610:813dcc80987e 430 hsai->Instance->CR1&=~(SAI_xCR1_MODE | SAI_xCR1_PRTCFG | SAI_xCR1_DS | \
mbed_official 610:813dcc80987e 431 SAI_xCR1_LSBFIRST | SAI_xCR1_CKSTR | SAI_xCR1_SYNCEN |\
mbed_official 610:813dcc80987e 432 SAI_xCR1_MONO | SAI_xCR1_OUTDRIV | SAI_xCR1_DMAEN | \
mbed_official 610:813dcc80987e 433 SAI_xCR1_NODIV | SAI_xCR1_MCKDIV);
mbed_official 610:813dcc80987e 434
mbed_official 610:813dcc80987e 435 hsai->Instance->CR1|=(hsai->Init.AudioMode | hsai->Init.Protocol | \
mbed_official 610:813dcc80987e 436 hsai->Init.DataSize | hsai->Init.FirstBit | \
mbed_official 610:813dcc80987e 437 hsai->Init.ClockStrobing | hsai->Init.Synchro | \
mbed_official 610:813dcc80987e 438 hsai->Init.MonoStereoMode | hsai->Init.OutputDrive | \
mbed_official 610:813dcc80987e 439 hsai->Init.NoDivider | (hsai->Init.Mckdiv << 20) | hsai->Init.CompandingMode);
mbed_official 610:813dcc80987e 440
mbed_official 610:813dcc80987e 441 /* SAI CR2 Configuration */
mbed_official 610:813dcc80987e 442 hsai->Instance->CR2&= ~(SAI_xCR2_FTH | SAI_xCR2_FFLUSH | SAI_xCR2_COMP);
mbed_official 610:813dcc80987e 443 hsai->Instance->CR2|= (hsai->Init.FIFOThreshold | hsai->Init.CompandingMode | hsai->Init.TriState);
mbed_official 610:813dcc80987e 444
mbed_official 610:813dcc80987e 445
mbed_official 610:813dcc80987e 446 /* SAI Frame Configuration -----------------------------------------*/
mbed_official 610:813dcc80987e 447 hsai->Instance->FRCR&=(~(SAI_xFRCR_FRL | SAI_xFRCR_FSALL | SAI_xFRCR_FSDEF | \
mbed_official 610:813dcc80987e 448 SAI_xFRCR_FSPO | SAI_xFRCR_FSOFF));
mbed_official 610:813dcc80987e 449 hsai->Instance->FRCR|=((hsai->FrameInit.FrameLength - 1) |
mbed_official 610:813dcc80987e 450 hsai->FrameInit.FSOffset |
mbed_official 610:813dcc80987e 451 hsai->FrameInit.FSDefinition |
mbed_official 610:813dcc80987e 452 hsai->FrameInit.FSPolarity |
mbed_official 610:813dcc80987e 453 ((hsai->FrameInit.ActiveFrameLength - 1) << 8));
mbed_official 610:813dcc80987e 454
mbed_official 610:813dcc80987e 455 /* SAI Block_x SLOT Configuration ------------------------------------------*/
mbed_official 610:813dcc80987e 456 /* This register has no meaning in AC 97 and SPDIF audio protocol */
mbed_official 610:813dcc80987e 457 hsai->Instance->SLOTR&= (~(SAI_xSLOTR_FBOFF | SAI_xSLOTR_SLOTSZ | \
mbed_official 610:813dcc80987e 458 SAI_xSLOTR_NBSLOT | SAI_xSLOTR_SLOTEN ));
mbed_official 610:813dcc80987e 459
mbed_official 610:813dcc80987e 460 hsai->Instance->SLOTR|= hsai->SlotInit.FirstBitOffset | hsai->SlotInit.SlotSize
mbed_official 610:813dcc80987e 461 | hsai->SlotInit.SlotActive | ((hsai->SlotInit.SlotNumber - 1) << 8);
mbed_official 610:813dcc80987e 462
mbed_official 610:813dcc80987e 463 /* Initialize the error code */
mbed_official 610:813dcc80987e 464 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
mbed_official 610:813dcc80987e 465
mbed_official 610:813dcc80987e 466 /* Initialize the SAI state */
mbed_official 610:813dcc80987e 467 hsai->State= HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 468
mbed_official 610:813dcc80987e 469 /* Release Lock */
mbed_official 610:813dcc80987e 470 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 471
mbed_official 610:813dcc80987e 472 return HAL_OK;
mbed_official 610:813dcc80987e 473 }
mbed_official 610:813dcc80987e 474
mbed_official 610:813dcc80987e 475 /**
mbed_official 610:813dcc80987e 476 * @brief DeInitialize the SAI peripheral.
mbed_official 610:813dcc80987e 477 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 478 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 479 * @retval HAL status
mbed_official 610:813dcc80987e 480 */
mbed_official 610:813dcc80987e 481 HAL_StatusTypeDef HAL_SAI_DeInit(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 482 {
mbed_official 610:813dcc80987e 483 /* Check the SAI handle allocation */
mbed_official 610:813dcc80987e 484 if(hsai == NULL)
mbed_official 610:813dcc80987e 485 {
mbed_official 610:813dcc80987e 486 return HAL_ERROR;
mbed_official 610:813dcc80987e 487 }
mbed_official 610:813dcc80987e 488
mbed_official 610:813dcc80987e 489 hsai->State = HAL_SAI_STATE_BUSY;
mbed_official 610:813dcc80987e 490
mbed_official 610:813dcc80987e 491 /* Disabled All interrupt and clear all the flag */
mbed_official 610:813dcc80987e 492 hsai->Instance->IMR = 0;
mbed_official 610:813dcc80987e 493 hsai->Instance->CLRFR = 0xFFFFFFFF;
mbed_official 610:813dcc80987e 494
mbed_official 610:813dcc80987e 495 /* Disable the SAI */
mbed_official 610:813dcc80987e 496 SAI_Disable(hsai);
mbed_official 610:813dcc80987e 497
mbed_official 610:813dcc80987e 498 /* Flush the fifo */
mbed_official 610:813dcc80987e 499 SET_BIT(hsai->Instance->CR2, SAI_xCR2_FFLUSH);
mbed_official 610:813dcc80987e 500
mbed_official 610:813dcc80987e 501 /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */
mbed_official 610:813dcc80987e 502 HAL_SAI_MspDeInit(hsai);
mbed_official 610:813dcc80987e 503
mbed_official 610:813dcc80987e 504 /* Initialize the error code */
mbed_official 610:813dcc80987e 505 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
mbed_official 610:813dcc80987e 506
mbed_official 610:813dcc80987e 507 /* Initialize the SAI state */
mbed_official 610:813dcc80987e 508 hsai->State = HAL_SAI_STATE_RESET;
mbed_official 610:813dcc80987e 509
mbed_official 610:813dcc80987e 510 return HAL_OK;
mbed_official 610:813dcc80987e 511 }
mbed_official 610:813dcc80987e 512
mbed_official 610:813dcc80987e 513 /**
mbed_official 610:813dcc80987e 514 * @brief Initialize the SAI MSP.
mbed_official 610:813dcc80987e 515 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 516 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 517 * @retval None
mbed_official 610:813dcc80987e 518 */
mbed_official 610:813dcc80987e 519 __weak void HAL_SAI_MspInit(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 520 {
mbed_official 610:813dcc80987e 521 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 610:813dcc80987e 522 the HAL_SAI_MspInit could be implemented in the user file
mbed_official 610:813dcc80987e 523 */
mbed_official 610:813dcc80987e 524 }
mbed_official 610:813dcc80987e 525
mbed_official 610:813dcc80987e 526 /**
mbed_official 610:813dcc80987e 527 * @brief DeInitialize the SAI MSP.
mbed_official 610:813dcc80987e 528 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 529 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 530 * @retval None
mbed_official 610:813dcc80987e 531 */
mbed_official 610:813dcc80987e 532 __weak void HAL_SAI_MspDeInit(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 533 {
mbed_official 610:813dcc80987e 534 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 610:813dcc80987e 535 the HAL_SAI_MspDeInit could be implemented in the user file
mbed_official 610:813dcc80987e 536 */
mbed_official 610:813dcc80987e 537 }
mbed_official 610:813dcc80987e 538
mbed_official 610:813dcc80987e 539 /**
mbed_official 610:813dcc80987e 540 * @}
mbed_official 610:813dcc80987e 541 */
mbed_official 610:813dcc80987e 542
mbed_official 610:813dcc80987e 543 /** @defgroup SAI_Exported_Functions_Group2 IO operation functions
mbed_official 610:813dcc80987e 544 * @brief Data transfers functions
mbed_official 610:813dcc80987e 545 *
mbed_official 610:813dcc80987e 546 @verbatim
mbed_official 610:813dcc80987e 547 ===============================================================================
mbed_official 610:813dcc80987e 548 ##### IO operation functions #####
mbed_official 610:813dcc80987e 549 ===============================================================================
mbed_official 610:813dcc80987e 550 [..]
mbed_official 610:813dcc80987e 551 This subsection provides a set of functions allowing to manage the SAI data
mbed_official 610:813dcc80987e 552 transfers.
mbed_official 610:813dcc80987e 553
mbed_official 610:813dcc80987e 554 (+) There are two modes of transfer:
mbed_official 610:813dcc80987e 555 (++) Blocking mode : The communication is performed in the polling mode.
mbed_official 610:813dcc80987e 556 The status of all data processing is returned by the same function
mbed_official 610:813dcc80987e 557 after finishing transfer.
mbed_official 610:813dcc80987e 558 (++) No-Blocking mode : The communication is performed using Interrupts
mbed_official 610:813dcc80987e 559 or DMA. These functions return the status of the transfer startup.
mbed_official 610:813dcc80987e 560 The end of the data processing will be indicated through the
mbed_official 610:813dcc80987e 561 dedicated SAI IRQ when using Interrupt mode or the DMA IRQ when
mbed_official 610:813dcc80987e 562 using DMA mode.
mbed_official 610:813dcc80987e 563
mbed_official 610:813dcc80987e 564 (+) Blocking mode functions are :
mbed_official 610:813dcc80987e 565 (++) HAL_SAI_Transmit()
mbed_official 610:813dcc80987e 566 (++) HAL_SAI_Receive()
mbed_official 610:813dcc80987e 567 (++) HAL_SAI_TransmitReceive()
mbed_official 610:813dcc80987e 568
mbed_official 610:813dcc80987e 569 (+) Non Blocking mode functions with Interrupt are :
mbed_official 610:813dcc80987e 570 (++) HAL_SAI_Transmit_IT()
mbed_official 610:813dcc80987e 571 (++) HAL_SAI_Receive_IT()
mbed_official 610:813dcc80987e 572 (++) HAL_SAI_TransmitReceive_IT()
mbed_official 610:813dcc80987e 573
mbed_official 610:813dcc80987e 574 (+) Non Blocking mode functions with DMA are :
mbed_official 610:813dcc80987e 575 (++) HAL_SAI_Transmit_DMA()
mbed_official 610:813dcc80987e 576 (++) HAL_SAI_Receive_DMA()
mbed_official 610:813dcc80987e 577 (++) HAL_SAI_TransmitReceive_DMA()
mbed_official 610:813dcc80987e 578
mbed_official 610:813dcc80987e 579 (+) A set of Transfer Complete Callbacks are provided in non Blocking mode:
mbed_official 610:813dcc80987e 580 (++) HAL_SAI_TxCpltCallback()
mbed_official 610:813dcc80987e 581 (++) HAL_SAI_RxCpltCallback()
mbed_official 610:813dcc80987e 582 (++) HAL_SAI_ErrorCallback()
mbed_official 610:813dcc80987e 583
mbed_official 610:813dcc80987e 584 @endverbatim
mbed_official 610:813dcc80987e 585 * @{
mbed_official 610:813dcc80987e 586 */
mbed_official 610:813dcc80987e 587
mbed_official 610:813dcc80987e 588 /**
mbed_official 610:813dcc80987e 589 * @brief Transmit an amount of data in blocking mode.
mbed_official 610:813dcc80987e 590 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 591 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 592 * @param pData: Pointer to data buffer
mbed_official 610:813dcc80987e 593 * @param Size: Amount of data to be sent
mbed_official 610:813dcc80987e 594 * @param Timeout: Timeout duration
mbed_official 610:813dcc80987e 595 * @retval HAL status
mbed_official 610:813dcc80987e 596 */
mbed_official 610:813dcc80987e 597 HAL_StatusTypeDef HAL_SAI_Transmit(SAI_HandleTypeDef *hsai, uint8_t* pData, uint16_t Size, uint32_t Timeout)
mbed_official 610:813dcc80987e 598 {
mbed_official 610:813dcc80987e 599 uint32_t tickstart = HAL_GetTick();
mbed_official 610:813dcc80987e 600 HAL_StatusTypeDef errorcode = HAL_OK;
mbed_official 610:813dcc80987e 601
mbed_official 610:813dcc80987e 602 /* Process Locked */
mbed_official 610:813dcc80987e 603 __HAL_LOCK(hsai);
mbed_official 610:813dcc80987e 604
mbed_official 610:813dcc80987e 605 if((pData == NULL ) || (Size == 0))
mbed_official 610:813dcc80987e 606 {
mbed_official 610:813dcc80987e 607 errorcode = HAL_ERROR;
mbed_official 610:813dcc80987e 608 goto error;
mbed_official 610:813dcc80987e 609 }
mbed_official 610:813dcc80987e 610
mbed_official 610:813dcc80987e 611 if(hsai->State != HAL_SAI_STATE_READY)
mbed_official 610:813dcc80987e 612 {
mbed_official 610:813dcc80987e 613 errorcode = HAL_BUSY;
mbed_official 610:813dcc80987e 614 goto error;
mbed_official 610:813dcc80987e 615 }
mbed_official 610:813dcc80987e 616
mbed_official 610:813dcc80987e 617 hsai->State = HAL_SAI_STATE_BUSY_TX;
mbed_official 610:813dcc80987e 618 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
mbed_official 610:813dcc80987e 619 hsai->XferSize = Size;
mbed_official 610:813dcc80987e 620 hsai->XferCount = Size;
mbed_official 610:813dcc80987e 621 hsai->pBuffPtr = pData;
mbed_official 610:813dcc80987e 622
mbed_official 610:813dcc80987e 623 /* Check if the SAI is already enabled */
mbed_official 610:813dcc80987e 624 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
mbed_official 610:813dcc80987e 625 {
mbed_official 610:813dcc80987e 626 /* fill the fifo with data before to enabled the SAI */
mbed_official 610:813dcc80987e 627 SAI_FillFifo(hsai);
mbed_official 610:813dcc80987e 628 /* Enable SAI peripheral */
mbed_official 610:813dcc80987e 629 __HAL_SAI_ENABLE(hsai);
mbed_official 610:813dcc80987e 630 }
mbed_official 610:813dcc80987e 631
mbed_official 610:813dcc80987e 632 do
mbed_official 610:813dcc80987e 633 {
mbed_official 610:813dcc80987e 634 /* Write data if the FIFO is not full */
mbed_official 610:813dcc80987e 635 if((hsai->Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_FULL)
mbed_official 610:813dcc80987e 636 {
mbed_official 610:813dcc80987e 637 if((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
mbed_official 610:813dcc80987e 638 {
mbed_official 610:813dcc80987e 639 hsai->Instance->DR = (*hsai->pBuffPtr++);
mbed_official 610:813dcc80987e 640 }
mbed_official 610:813dcc80987e 641 else if(hsai->Init.DataSize <= SAI_DATASIZE_16)
mbed_official 610:813dcc80987e 642 {
mbed_official 610:813dcc80987e 643 *(uint16_t *)&hsai->Instance->DR = *((uint16_t *)hsai->pBuffPtr);
mbed_official 610:813dcc80987e 644 hsai->pBuffPtr+= 2;
mbed_official 610:813dcc80987e 645 }
mbed_official 610:813dcc80987e 646 else
mbed_official 610:813dcc80987e 647 {
mbed_official 610:813dcc80987e 648 hsai->Instance->DR = *((uint32_t *)hsai->pBuffPtr);
mbed_official 610:813dcc80987e 649 hsai->pBuffPtr+= 4;
mbed_official 610:813dcc80987e 650 }
mbed_official 610:813dcc80987e 651 hsai->XferCount--;
mbed_official 610:813dcc80987e 652 }
mbed_official 610:813dcc80987e 653 else
mbed_official 610:813dcc80987e 654 {
mbed_official 610:813dcc80987e 655 /* Check for the Timeout */
mbed_official 610:813dcc80987e 656 if((Timeout != HAL_MAX_DELAY) && ((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)))
mbed_official 610:813dcc80987e 657 {
mbed_official 610:813dcc80987e 658 errorcode = HAL_TIMEOUT;
mbed_official 610:813dcc80987e 659 goto error;
mbed_official 610:813dcc80987e 660 }
mbed_official 610:813dcc80987e 661 }
mbed_official 610:813dcc80987e 662 }
mbed_official 610:813dcc80987e 663 while(0 != hsai->XferCount);
mbed_official 610:813dcc80987e 664
mbed_official 610:813dcc80987e 665 error :
mbed_official 610:813dcc80987e 666 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 667 /* Process Unlocked */
mbed_official 610:813dcc80987e 668 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 669 return errorcode;
mbed_official 610:813dcc80987e 670 }
mbed_official 610:813dcc80987e 671
mbed_official 610:813dcc80987e 672 /**
mbed_official 610:813dcc80987e 673 * @brief Receive an amount of data in blocking mode.
mbed_official 610:813dcc80987e 674 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 675 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 676 * @param pData: Pointer to data buffer
mbed_official 610:813dcc80987e 677 * @param Size: Amount of data to be received
mbed_official 610:813dcc80987e 678 * @param Timeout: Timeout duration
mbed_official 610:813dcc80987e 679 * @retval HAL status
mbed_official 610:813dcc80987e 680 */
mbed_official 610:813dcc80987e 681 HAL_StatusTypeDef HAL_SAI_Receive(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 610:813dcc80987e 682 {
mbed_official 610:813dcc80987e 683 uint32_t tickstart = HAL_GetTick();
mbed_official 610:813dcc80987e 684 HAL_StatusTypeDef errorcode = HAL_OK;
mbed_official 610:813dcc80987e 685
mbed_official 610:813dcc80987e 686 /* Process Locked */
mbed_official 610:813dcc80987e 687 __HAL_LOCK(hsai);
mbed_official 610:813dcc80987e 688
mbed_official 610:813dcc80987e 689 if((pData == NULL ) || (Size == 0))
mbed_official 610:813dcc80987e 690 {
mbed_official 610:813dcc80987e 691 errorcode = HAL_ERROR;
mbed_official 610:813dcc80987e 692 goto error;
mbed_official 610:813dcc80987e 693 }
mbed_official 610:813dcc80987e 694
mbed_official 610:813dcc80987e 695 if(hsai->State != HAL_SAI_STATE_READY)
mbed_official 610:813dcc80987e 696 {
mbed_official 610:813dcc80987e 697 errorcode = HAL_BUSY;
mbed_official 610:813dcc80987e 698 goto error;
mbed_official 610:813dcc80987e 699 }
mbed_official 610:813dcc80987e 700
mbed_official 610:813dcc80987e 701 hsai->pBuffPtr = pData;
mbed_official 610:813dcc80987e 702 hsai->XferSize = Size;
mbed_official 610:813dcc80987e 703 hsai->XferCount = Size;
mbed_official 610:813dcc80987e 704 hsai->State = HAL_SAI_STATE_BUSY_RX;
mbed_official 610:813dcc80987e 705 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
mbed_official 610:813dcc80987e 706
mbed_official 610:813dcc80987e 707 /* Check if the SAI is already enabled */
mbed_official 610:813dcc80987e 708 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
mbed_official 610:813dcc80987e 709 {
mbed_official 610:813dcc80987e 710 /* Enable SAI peripheral */
mbed_official 610:813dcc80987e 711 __HAL_SAI_ENABLE(hsai);
mbed_official 610:813dcc80987e 712 }
mbed_official 610:813dcc80987e 713
mbed_official 610:813dcc80987e 714 /* Receive data */
mbed_official 610:813dcc80987e 715 do
mbed_official 610:813dcc80987e 716 {
mbed_official 610:813dcc80987e 717 /* Wait until RXNE flag is set */
mbed_official 610:813dcc80987e 718 if((hsai->Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_EMPTY)
mbed_official 610:813dcc80987e 719 {
mbed_official 610:813dcc80987e 720 if((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
mbed_official 610:813dcc80987e 721 {
mbed_official 610:813dcc80987e 722 (*hsai->pBuffPtr++) = hsai->Instance->DR;
mbed_official 610:813dcc80987e 723 }
mbed_official 610:813dcc80987e 724 else if(hsai->Init.DataSize <= SAI_DATASIZE_16)
mbed_official 610:813dcc80987e 725 {
mbed_official 610:813dcc80987e 726 *((uint16_t*)hsai->pBuffPtr) = hsai->Instance->DR;
mbed_official 610:813dcc80987e 727 hsai->pBuffPtr+= 2;
mbed_official 610:813dcc80987e 728 }
mbed_official 610:813dcc80987e 729 else
mbed_official 610:813dcc80987e 730 {
mbed_official 610:813dcc80987e 731 *((uint32_t*)hsai->pBuffPtr) = hsai->Instance->DR;
mbed_official 610:813dcc80987e 732 hsai->pBuffPtr+= 4;
mbed_official 610:813dcc80987e 733 }
mbed_official 610:813dcc80987e 734 hsai->XferCount--;
mbed_official 610:813dcc80987e 735 }
mbed_official 610:813dcc80987e 736 else
mbed_official 610:813dcc80987e 737 {
mbed_official 610:813dcc80987e 738 /* Check for the Timeout */
mbed_official 610:813dcc80987e 739 if((Timeout != HAL_MAX_DELAY) && ((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)))
mbed_official 610:813dcc80987e 740 {
mbed_official 610:813dcc80987e 741 errorcode = HAL_TIMEOUT;
mbed_official 610:813dcc80987e 742 goto error;
mbed_official 610:813dcc80987e 743 }
mbed_official 610:813dcc80987e 744 }
mbed_official 610:813dcc80987e 745 }
mbed_official 610:813dcc80987e 746 while(0 != hsai->XferCount);
mbed_official 610:813dcc80987e 747
mbed_official 610:813dcc80987e 748 error :
mbed_official 610:813dcc80987e 749 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 750 /* Process Unlocked */
mbed_official 610:813dcc80987e 751 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 752 return errorcode;
mbed_official 610:813dcc80987e 753 }
mbed_official 610:813dcc80987e 754
mbed_official 610:813dcc80987e 755 /**
mbed_official 610:813dcc80987e 756 * @brief Transmit an amount of data in non-blocking mode with Interrupt.
mbed_official 610:813dcc80987e 757 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 758 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 759 * @param pData: Pointer to data buffer
mbed_official 610:813dcc80987e 760 * @param Size: Amount of data to be sent
mbed_official 610:813dcc80987e 761 * @retval HAL status
mbed_official 610:813dcc80987e 762 */
mbed_official 610:813dcc80987e 763 HAL_StatusTypeDef HAL_SAI_Transmit_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
mbed_official 610:813dcc80987e 764 {
mbed_official 610:813dcc80987e 765 HAL_StatusTypeDef errorcode = HAL_OK;
mbed_official 610:813dcc80987e 766
mbed_official 610:813dcc80987e 767 /* Process Locked */
mbed_official 610:813dcc80987e 768 __HAL_LOCK(hsai);
mbed_official 610:813dcc80987e 769
mbed_official 610:813dcc80987e 770 if((pData == NULL) || (Size == 0))
mbed_official 610:813dcc80987e 771 {
mbed_official 610:813dcc80987e 772 errorcode = HAL_ERROR;
mbed_official 610:813dcc80987e 773 goto error;
mbed_official 610:813dcc80987e 774 }
mbed_official 610:813dcc80987e 775
mbed_official 610:813dcc80987e 776 if(hsai->State != HAL_SAI_STATE_READY)
mbed_official 610:813dcc80987e 777 {
mbed_official 610:813dcc80987e 778 errorcode = HAL_BUSY;
mbed_official 610:813dcc80987e 779 goto error;
mbed_official 610:813dcc80987e 780 }
mbed_official 610:813dcc80987e 781
mbed_official 610:813dcc80987e 782 hsai->pBuffPtr = pData;
mbed_official 610:813dcc80987e 783 hsai->XferSize = Size;
mbed_official 610:813dcc80987e 784 hsai->XferCount = Size;
mbed_official 610:813dcc80987e 785 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
mbed_official 610:813dcc80987e 786 hsai->State = HAL_SAI_STATE_BUSY_TX;
mbed_official 610:813dcc80987e 787 if((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
mbed_official 610:813dcc80987e 788 {
mbed_official 610:813dcc80987e 789 hsai->InterruptServiceRoutine = SAI_Transmit_IT8Bit;
mbed_official 610:813dcc80987e 790 }
mbed_official 610:813dcc80987e 791 else if(hsai->Init.DataSize <= SAI_DATASIZE_16)
mbed_official 610:813dcc80987e 792 {
mbed_official 610:813dcc80987e 793 hsai->InterruptServiceRoutine = SAI_Transmit_IT16Bit;
mbed_official 610:813dcc80987e 794 }
mbed_official 610:813dcc80987e 795 else
mbed_official 610:813dcc80987e 796 {
mbed_official 610:813dcc80987e 797 hsai->InterruptServiceRoutine = SAI_Transmit_IT32Bit;
mbed_official 610:813dcc80987e 798 }
mbed_official 610:813dcc80987e 799
mbed_official 610:813dcc80987e 800 /* Enable FRQ and OVRUDR interrupts */
mbed_official 610:813dcc80987e 801 __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
mbed_official 610:813dcc80987e 802
mbed_official 610:813dcc80987e 803 /* Check if the SAI is already enabled */
mbed_official 610:813dcc80987e 804 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
mbed_official 610:813dcc80987e 805 {
mbed_official 610:813dcc80987e 806 /* Fill the fifo before starting the communication */
mbed_official 610:813dcc80987e 807 SAI_FillFifo(hsai);
mbed_official 610:813dcc80987e 808 /* Enable SAI peripheral */
mbed_official 610:813dcc80987e 809 __HAL_SAI_ENABLE(hsai);
mbed_official 610:813dcc80987e 810 }
mbed_official 610:813dcc80987e 811
mbed_official 610:813dcc80987e 812 error :
mbed_official 610:813dcc80987e 813 /* Process Unlocked */
mbed_official 610:813dcc80987e 814 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 815 return errorcode;
mbed_official 610:813dcc80987e 816 }
mbed_official 610:813dcc80987e 817
mbed_official 610:813dcc80987e 818 /**
mbed_official 610:813dcc80987e 819 * @brief Receive an amount of data in non-blocking mode with Interrupt.
mbed_official 610:813dcc80987e 820 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 821 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 822 * @param pData: Pointer to data buffer
mbed_official 610:813dcc80987e 823 * @param Size: Amount of data to be received
mbed_official 610:813dcc80987e 824 * @retval HAL status
mbed_official 610:813dcc80987e 825 */
mbed_official 610:813dcc80987e 826 HAL_StatusTypeDef HAL_SAI_Receive_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
mbed_official 610:813dcc80987e 827 {
mbed_official 610:813dcc80987e 828 HAL_StatusTypeDef errorcode = HAL_OK;
mbed_official 610:813dcc80987e 829
mbed_official 610:813dcc80987e 830 /* Process Locked */
mbed_official 610:813dcc80987e 831 __HAL_LOCK(hsai);
mbed_official 610:813dcc80987e 832
mbed_official 610:813dcc80987e 833 if((pData == NULL) || (Size == 0))
mbed_official 610:813dcc80987e 834 {
mbed_official 610:813dcc80987e 835 errorcode = HAL_ERROR;
mbed_official 610:813dcc80987e 836 goto error;
mbed_official 610:813dcc80987e 837 }
mbed_official 610:813dcc80987e 838
mbed_official 610:813dcc80987e 839 if(hsai->State != HAL_SAI_STATE_READY)
mbed_official 610:813dcc80987e 840 {
mbed_official 610:813dcc80987e 841 errorcode = HAL_BUSY;
mbed_official 610:813dcc80987e 842 goto error;
mbed_official 610:813dcc80987e 843 }
mbed_official 610:813dcc80987e 844
mbed_official 610:813dcc80987e 845 hsai->pBuffPtr = pData;
mbed_official 610:813dcc80987e 846 hsai->XferSize = Size;
mbed_official 610:813dcc80987e 847 hsai->XferCount = Size;
mbed_official 610:813dcc80987e 848 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
mbed_official 610:813dcc80987e 849 hsai->State = HAL_SAI_STATE_BUSY_RX;
mbed_official 610:813dcc80987e 850 if((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
mbed_official 610:813dcc80987e 851 {
mbed_official 610:813dcc80987e 852 hsai->InterruptServiceRoutine = SAI_Receive_IT8Bit;
mbed_official 610:813dcc80987e 853 }
mbed_official 610:813dcc80987e 854 else if(hsai->Init.DataSize <= SAI_DATASIZE_16)
mbed_official 610:813dcc80987e 855 {
mbed_official 610:813dcc80987e 856 hsai->InterruptServiceRoutine = SAI_Receive_IT16Bit;
mbed_official 610:813dcc80987e 857 }
mbed_official 610:813dcc80987e 858 else
mbed_official 610:813dcc80987e 859 {
mbed_official 610:813dcc80987e 860 hsai->InterruptServiceRoutine = SAI_Receive_IT32Bit;
mbed_official 610:813dcc80987e 861 }
mbed_official 610:813dcc80987e 862
mbed_official 610:813dcc80987e 863 /* Enable the interrupts */
mbed_official 610:813dcc80987e 864 __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
mbed_official 610:813dcc80987e 865
mbed_official 610:813dcc80987e 866 /* Check if the SAI is already enabled */
mbed_official 610:813dcc80987e 867 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
mbed_official 610:813dcc80987e 868 {
mbed_official 610:813dcc80987e 869 /* Enable SAI peripheral */
mbed_official 610:813dcc80987e 870 __HAL_SAI_ENABLE(hsai);
mbed_official 610:813dcc80987e 871 }
mbed_official 610:813dcc80987e 872
mbed_official 610:813dcc80987e 873 error :
mbed_official 610:813dcc80987e 874 /* Process Unlocked */
mbed_official 610:813dcc80987e 875 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 876 return errorcode;
mbed_official 610:813dcc80987e 877 }
mbed_official 610:813dcc80987e 878
mbed_official 610:813dcc80987e 879 /**
mbed_official 610:813dcc80987e 880 * @brief Pause the audio stream playing from the Media.
mbed_official 610:813dcc80987e 881 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 882 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 883 * @retval HAL status
mbed_official 610:813dcc80987e 884 */
mbed_official 610:813dcc80987e 885 HAL_StatusTypeDef HAL_SAI_DMAPause(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 886 {
mbed_official 610:813dcc80987e 887 /* Process Locked */
mbed_official 610:813dcc80987e 888 __HAL_LOCK(hsai);
mbed_official 610:813dcc80987e 889
mbed_official 610:813dcc80987e 890 /* Pause the audio file playing by disabling the SAI DMA requests */
mbed_official 610:813dcc80987e 891 hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
mbed_official 610:813dcc80987e 892
mbed_official 610:813dcc80987e 893 /* Process Unlocked */
mbed_official 610:813dcc80987e 894 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 895
mbed_official 610:813dcc80987e 896 return HAL_OK;
mbed_official 610:813dcc80987e 897 }
mbed_official 610:813dcc80987e 898
mbed_official 610:813dcc80987e 899 /**
mbed_official 610:813dcc80987e 900 * @brief Resume the audio stream playing from the Media.
mbed_official 610:813dcc80987e 901 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 902 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 903 * @retval HAL status
mbed_official 610:813dcc80987e 904 */
mbed_official 610:813dcc80987e 905 HAL_StatusTypeDef HAL_SAI_DMAResume(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 906 {
mbed_official 610:813dcc80987e 907 /* Process Locked */
mbed_official 610:813dcc80987e 908 __HAL_LOCK(hsai);
mbed_official 610:813dcc80987e 909
mbed_official 610:813dcc80987e 910 /* Enable the SAI DMA requests */
mbed_official 610:813dcc80987e 911 hsai->Instance->CR1 |= SAI_xCR1_DMAEN;
mbed_official 610:813dcc80987e 912
mbed_official 610:813dcc80987e 913 /* If the SAI peripheral is still not enabled, enable it */
mbed_official 610:813dcc80987e 914 if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
mbed_official 610:813dcc80987e 915 {
mbed_official 610:813dcc80987e 916 /* Enable SAI peripheral */
mbed_official 610:813dcc80987e 917 __HAL_SAI_ENABLE(hsai);
mbed_official 610:813dcc80987e 918 }
mbed_official 610:813dcc80987e 919
mbed_official 610:813dcc80987e 920 /* Process Unlocked */
mbed_official 610:813dcc80987e 921 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 922
mbed_official 610:813dcc80987e 923 return HAL_OK;
mbed_official 610:813dcc80987e 924 }
mbed_official 610:813dcc80987e 925
mbed_official 610:813dcc80987e 926 /**
mbed_official 610:813dcc80987e 927 * @brief Stop the audio stream playing from the Media.
mbed_official 610:813dcc80987e 928 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 929 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 930 * @retval HAL status
mbed_official 610:813dcc80987e 931 */
mbed_official 610:813dcc80987e 932 HAL_StatusTypeDef HAL_SAI_DMAStop(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 933 {
mbed_official 610:813dcc80987e 934 /* Process Locked */
mbed_official 610:813dcc80987e 935 __HAL_LOCK(hsai);
mbed_official 610:813dcc80987e 936
mbed_official 610:813dcc80987e 937 /* Disable the SAI DMA request */
mbed_official 610:813dcc80987e 938 hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
mbed_official 610:813dcc80987e 939
mbed_official 610:813dcc80987e 940 /* Abort the SAI DMA Channel */
mbed_official 610:813dcc80987e 941 if(hsai->hdmatx != NULL)
mbed_official 610:813dcc80987e 942 {
mbed_official 610:813dcc80987e 943 HAL_DMA_Abort(hsai->hdmatx);
mbed_official 610:813dcc80987e 944 }
mbed_official 610:813dcc80987e 945
mbed_official 610:813dcc80987e 946 if(hsai->hdmarx != NULL)
mbed_official 610:813dcc80987e 947 {
mbed_official 610:813dcc80987e 948 HAL_DMA_Abort(hsai->hdmarx);
mbed_official 610:813dcc80987e 949 }
mbed_official 610:813dcc80987e 950
mbed_official 610:813dcc80987e 951 /* Disable SAI peripheral */
mbed_official 610:813dcc80987e 952 SAI_Disable(hsai);
mbed_official 610:813dcc80987e 953
mbed_official 610:813dcc80987e 954 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 955
mbed_official 610:813dcc80987e 956 /* Process Unlocked */
mbed_official 610:813dcc80987e 957 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 958
mbed_official 610:813dcc80987e 959 return HAL_OK;
mbed_official 610:813dcc80987e 960 }
mbed_official 610:813dcc80987e 961
mbed_official 610:813dcc80987e 962 /**
mbed_official 610:813dcc80987e 963 * @brief Abort the current transfer and disable the SAI.
mbed_official 610:813dcc80987e 964 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 965 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 966 * @retval HAL status
mbed_official 610:813dcc80987e 967 */
mbed_official 610:813dcc80987e 968 HAL_StatusTypeDef HAL_SAI_Abort(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 969 {
mbed_official 610:813dcc80987e 970 /* Disable the SAI DMA request */
mbed_official 610:813dcc80987e 971 hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
mbed_official 610:813dcc80987e 972
mbed_official 610:813dcc80987e 973 /* Abort the SAI DMA Channel */
mbed_official 610:813dcc80987e 974 if(hsai->hdmatx != NULL)
mbed_official 610:813dcc80987e 975 {
mbed_official 610:813dcc80987e 976 HAL_DMA_Abort(hsai->hdmatx);
mbed_official 610:813dcc80987e 977 }
mbed_official 610:813dcc80987e 978
mbed_official 610:813dcc80987e 979 if(hsai->hdmarx != NULL)
mbed_official 610:813dcc80987e 980 {
mbed_official 610:813dcc80987e 981 HAL_DMA_Abort(hsai->hdmarx);
mbed_official 610:813dcc80987e 982 }
mbed_official 610:813dcc80987e 983
mbed_official 610:813dcc80987e 984 /* Disabled All interrupt and clear all the flag */
mbed_official 610:813dcc80987e 985 hsai->Instance->IMR = 0;
mbed_official 610:813dcc80987e 986 hsai->Instance->CLRFR = 0xFFFFFFFF;
mbed_official 610:813dcc80987e 987
mbed_official 610:813dcc80987e 988 /* Disable SAI peripheral */
mbed_official 610:813dcc80987e 989 SAI_Disable(hsai);
mbed_official 610:813dcc80987e 990
mbed_official 610:813dcc80987e 991 /* Flush the fifo */
mbed_official 610:813dcc80987e 992 SET_BIT(hsai->Instance->CR2, SAI_xCR2_FFLUSH);
mbed_official 610:813dcc80987e 993
mbed_official 610:813dcc80987e 994 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 995
mbed_official 610:813dcc80987e 996 /* Process Unlocked */
mbed_official 610:813dcc80987e 997 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 998
mbed_official 610:813dcc80987e 999 return HAL_OK;
mbed_official 610:813dcc80987e 1000 }
mbed_official 610:813dcc80987e 1001
mbed_official 610:813dcc80987e 1002 /**
mbed_official 610:813dcc80987e 1003 * @brief Transmit an amount of data in non-blocking mode with DMA.
mbed_official 610:813dcc80987e 1004 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1005 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1006 * @param pData: Pointer to data buffer
mbed_official 610:813dcc80987e 1007 * @param Size: Amount of data to be sent
mbed_official 610:813dcc80987e 1008 * @retval HAL status
mbed_official 610:813dcc80987e 1009 */
mbed_official 610:813dcc80987e 1010 HAL_StatusTypeDef HAL_SAI_Transmit_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
mbed_official 610:813dcc80987e 1011 {
mbed_official 610:813dcc80987e 1012 HAL_StatusTypeDef errorcode = HAL_OK;
mbed_official 610:813dcc80987e 1013
mbed_official 610:813dcc80987e 1014 /* Process Locked */
mbed_official 610:813dcc80987e 1015 __HAL_LOCK(hsai);
mbed_official 610:813dcc80987e 1016
mbed_official 610:813dcc80987e 1017 if((pData == NULL) || (Size == 0))
mbed_official 610:813dcc80987e 1018 {
mbed_official 610:813dcc80987e 1019 errorcode = HAL_ERROR;
mbed_official 610:813dcc80987e 1020 goto error;
mbed_official 610:813dcc80987e 1021 }
mbed_official 610:813dcc80987e 1022
mbed_official 610:813dcc80987e 1023 if(hsai->State != HAL_SAI_STATE_READY)
mbed_official 610:813dcc80987e 1024 {
mbed_official 610:813dcc80987e 1025 errorcode = HAL_BUSY;
mbed_official 610:813dcc80987e 1026 goto error;
mbed_official 610:813dcc80987e 1027 }
mbed_official 610:813dcc80987e 1028
mbed_official 610:813dcc80987e 1029 hsai->pBuffPtr = pData;
mbed_official 610:813dcc80987e 1030 hsai->XferSize = Size;
mbed_official 610:813dcc80987e 1031 hsai->XferCount = Size;
mbed_official 610:813dcc80987e 1032 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
mbed_official 610:813dcc80987e 1033 hsai->State = HAL_SAI_STATE_BUSY_TX;
mbed_official 610:813dcc80987e 1034
mbed_official 610:813dcc80987e 1035 /* Set the SAI Tx DMA Half transfer complete callback */
mbed_official 610:813dcc80987e 1036 hsai->hdmatx->XferHalfCpltCallback = SAI_DMATxHalfCplt;
mbed_official 610:813dcc80987e 1037
mbed_official 610:813dcc80987e 1038 /* Set the SAI TxDMA transfer complete callback */
mbed_official 610:813dcc80987e 1039 hsai->hdmatx->XferCpltCallback = SAI_DMATxCplt;
mbed_official 610:813dcc80987e 1040
mbed_official 610:813dcc80987e 1041 /* Set the DMA error callback */
mbed_official 610:813dcc80987e 1042 hsai->hdmatx->XferErrorCallback = SAI_DMAError;
mbed_official 610:813dcc80987e 1043
mbed_official 610:813dcc80987e 1044 /* Enable the Tx DMA Channel */
mbed_official 610:813dcc80987e 1045 HAL_DMA_Start_IT(hsai->hdmatx, (uint32_t)hsai->pBuffPtr, (uint32_t)&hsai->Instance->DR, hsai->XferSize);
mbed_official 610:813dcc80987e 1046
mbed_official 610:813dcc80987e 1047 /* Check if the SAI is already enabled */
mbed_official 610:813dcc80987e 1048 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
mbed_official 610:813dcc80987e 1049 {
mbed_official 610:813dcc80987e 1050 /* Enable SAI peripheral */
mbed_official 610:813dcc80987e 1051 __HAL_SAI_ENABLE(hsai);
mbed_official 610:813dcc80987e 1052 }
mbed_official 610:813dcc80987e 1053
mbed_official 610:813dcc80987e 1054 /* Enable the interrupts for error handling */
mbed_official 610:813dcc80987e 1055 __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
mbed_official 610:813dcc80987e 1056
mbed_official 610:813dcc80987e 1057 /* Enable SAI Tx DMA Request */
mbed_official 610:813dcc80987e 1058 hsai->Instance->CR1 |= SAI_xCR1_DMAEN;
mbed_official 610:813dcc80987e 1059
mbed_official 610:813dcc80987e 1060 error :
mbed_official 610:813dcc80987e 1061 /* Process Unlocked */
mbed_official 610:813dcc80987e 1062 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 1063 return errorcode;
mbed_official 610:813dcc80987e 1064 }
mbed_official 610:813dcc80987e 1065
mbed_official 610:813dcc80987e 1066 /**
mbed_official 610:813dcc80987e 1067 * @brief Receive an amount of data in non-blocking mode with DMA.
mbed_official 610:813dcc80987e 1068 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1069 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1070 * @param pData: Pointer to data buffer
mbed_official 610:813dcc80987e 1071 * @param Size: Amount of data to be received
mbed_official 610:813dcc80987e 1072 * @retval HAL status
mbed_official 610:813dcc80987e 1073 */
mbed_official 610:813dcc80987e 1074 HAL_StatusTypeDef HAL_SAI_Receive_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
mbed_official 610:813dcc80987e 1075 {
mbed_official 610:813dcc80987e 1076 HAL_StatusTypeDef errorcode = HAL_OK;
mbed_official 610:813dcc80987e 1077
mbed_official 610:813dcc80987e 1078 /* Process Locked */
mbed_official 610:813dcc80987e 1079 __HAL_LOCK(hsai);
mbed_official 610:813dcc80987e 1080
mbed_official 610:813dcc80987e 1081 if((pData == NULL) || (Size == 0))
mbed_official 610:813dcc80987e 1082 {
mbed_official 610:813dcc80987e 1083 errorcode = HAL_ERROR;
mbed_official 610:813dcc80987e 1084 goto error;
mbed_official 610:813dcc80987e 1085 }
mbed_official 610:813dcc80987e 1086
mbed_official 610:813dcc80987e 1087 if(hsai->State != HAL_SAI_STATE_READY)
mbed_official 610:813dcc80987e 1088 {
mbed_official 610:813dcc80987e 1089 errorcode = HAL_BUSY;
mbed_official 610:813dcc80987e 1090 goto error;
mbed_official 610:813dcc80987e 1091 }
mbed_official 610:813dcc80987e 1092 hsai->pBuffPtr = pData;
mbed_official 610:813dcc80987e 1093 hsai->XferSize = Size;
mbed_official 610:813dcc80987e 1094 hsai->XferCount = Size;
mbed_official 610:813dcc80987e 1095 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
mbed_official 610:813dcc80987e 1096 hsai->State = HAL_SAI_STATE_BUSY_RX;
mbed_official 610:813dcc80987e 1097
mbed_official 610:813dcc80987e 1098 /* Set the SAI Rx DMA Half transfer complete callback */
mbed_official 610:813dcc80987e 1099 hsai->hdmarx->XferHalfCpltCallback = SAI_DMARxHalfCplt;
mbed_official 610:813dcc80987e 1100
mbed_official 610:813dcc80987e 1101 /* Set the SAI Rx DMA transfer complete callback */
mbed_official 610:813dcc80987e 1102 hsai->hdmarx->XferCpltCallback = SAI_DMARxCplt;
mbed_official 610:813dcc80987e 1103
mbed_official 610:813dcc80987e 1104 /* Set the DMA error callback */
mbed_official 610:813dcc80987e 1105 hsai->hdmarx->XferErrorCallback = SAI_DMAError;
mbed_official 610:813dcc80987e 1106
mbed_official 610:813dcc80987e 1107 /* Enable the Rx DMA Channel */
mbed_official 610:813dcc80987e 1108 HAL_DMA_Start_IT(hsai->hdmarx, (uint32_t)&hsai->Instance->DR, (uint32_t)hsai->pBuffPtr, hsai->XferSize);
mbed_official 610:813dcc80987e 1109
mbed_official 610:813dcc80987e 1110 /* Check if the SAI is already enabled */
mbed_official 610:813dcc80987e 1111 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
mbed_official 610:813dcc80987e 1112 {
mbed_official 610:813dcc80987e 1113 /* Enable SAI peripheral */
mbed_official 610:813dcc80987e 1114 __HAL_SAI_ENABLE(hsai);
mbed_official 610:813dcc80987e 1115 }
mbed_official 610:813dcc80987e 1116
mbed_official 610:813dcc80987e 1117 /* Enable the interrupts for error handling */
mbed_official 610:813dcc80987e 1118 __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
mbed_official 610:813dcc80987e 1119
mbed_official 610:813dcc80987e 1120 /* Enable SAI Rx DMA Request */
mbed_official 610:813dcc80987e 1121 hsai->Instance->CR1 |= SAI_xCR1_DMAEN;
mbed_official 610:813dcc80987e 1122
mbed_official 610:813dcc80987e 1123 error :
mbed_official 610:813dcc80987e 1124 /* Process Unlocked */
mbed_official 610:813dcc80987e 1125 __HAL_UNLOCK(hsai);
mbed_official 610:813dcc80987e 1126 return errorcode;
mbed_official 610:813dcc80987e 1127 }
mbed_official 610:813dcc80987e 1128
mbed_official 610:813dcc80987e 1129 /**
mbed_official 610:813dcc80987e 1130 * @brief Enable the Tx mute mode.
mbed_official 610:813dcc80987e 1131 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1132 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1133 * @param val: value sent during the mute @ref SAI_Block_Mute_Value
mbed_official 610:813dcc80987e 1134 * @retval HAL status
mbed_official 610:813dcc80987e 1135 */
mbed_official 610:813dcc80987e 1136 HAL_StatusTypeDef HAL_SAI_EnableTxMuteMode(SAI_HandleTypeDef *hsai, uint16_t val)
mbed_official 610:813dcc80987e 1137 {
mbed_official 610:813dcc80987e 1138 assert_param(IS_SAI_BLOCK_MUTE_VALUE(val));
mbed_official 610:813dcc80987e 1139
mbed_official 610:813dcc80987e 1140 if(hsai->State != HAL_SAI_STATE_RESET)
mbed_official 610:813dcc80987e 1141 {
mbed_official 610:813dcc80987e 1142 CLEAR_BIT(hsai->Instance->CR2, SAI_xCR2_MUTEVAL | SAI_xCR2_MUTE);
mbed_official 610:813dcc80987e 1143 SET_BIT(hsai->Instance->CR2, SAI_xCR2_MUTE | val);
mbed_official 610:813dcc80987e 1144 return HAL_OK;
mbed_official 610:813dcc80987e 1145 }
mbed_official 610:813dcc80987e 1146 return HAL_ERROR;
mbed_official 610:813dcc80987e 1147 }
mbed_official 610:813dcc80987e 1148
mbed_official 610:813dcc80987e 1149 /**
mbed_official 610:813dcc80987e 1150 * @brief Disable the Tx mute mode.
mbed_official 610:813dcc80987e 1151 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1152 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1153 * @retval HAL status
mbed_official 610:813dcc80987e 1154 */
mbed_official 610:813dcc80987e 1155 HAL_StatusTypeDef HAL_SAI_DisableTxMuteMode(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1156 {
mbed_official 610:813dcc80987e 1157 if(hsai->State != HAL_SAI_STATE_RESET)
mbed_official 610:813dcc80987e 1158 {
mbed_official 610:813dcc80987e 1159 CLEAR_BIT(hsai->Instance->CR2, SAI_xCR2_MUTEVAL | SAI_xCR2_MUTE);
mbed_official 610:813dcc80987e 1160 return HAL_OK;
mbed_official 610:813dcc80987e 1161 }
mbed_official 610:813dcc80987e 1162 return HAL_ERROR;
mbed_official 610:813dcc80987e 1163 }
mbed_official 610:813dcc80987e 1164
mbed_official 610:813dcc80987e 1165 /**
mbed_official 610:813dcc80987e 1166 * @brief Enable the Rx mute detection.
mbed_official 610:813dcc80987e 1167 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1168 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1169 * @param callback: function called when the mute is detected
mbed_official 610:813dcc80987e 1170 * @param counter: number a data before mute detection max 63.
mbed_official 610:813dcc80987e 1171 * @retval HAL status
mbed_official 610:813dcc80987e 1172 */
mbed_official 610:813dcc80987e 1173 HAL_StatusTypeDef HAL_SAI_EnableRxMuteMode(SAI_HandleTypeDef *hsai, SAIcallback callback, uint16_t counter)
mbed_official 610:813dcc80987e 1174 {
mbed_official 610:813dcc80987e 1175 assert_param(IS_SAI_BLOCK_MUTE_COUNTER(counter));
mbed_official 610:813dcc80987e 1176
mbed_official 610:813dcc80987e 1177 if(hsai->State != HAL_SAI_STATE_RESET)
mbed_official 610:813dcc80987e 1178 {
mbed_official 610:813dcc80987e 1179 /* set the mute counter */
mbed_official 610:813dcc80987e 1180 CLEAR_BIT(hsai->Instance->CR2, SAI_xCR2_MUTECNT);
mbed_official 610:813dcc80987e 1181 SET_BIT(hsai->Instance->CR2, ((uint32_t)counter << 6));
mbed_official 610:813dcc80987e 1182 hsai->mutecallback = callback;
mbed_official 610:813dcc80987e 1183 /* enable the IT interrupt */
mbed_official 610:813dcc80987e 1184 __HAL_SAI_ENABLE_IT(hsai, SAI_IT_MUTEDET);
mbed_official 610:813dcc80987e 1185 return HAL_OK;
mbed_official 610:813dcc80987e 1186 }
mbed_official 610:813dcc80987e 1187 return HAL_ERROR;
mbed_official 610:813dcc80987e 1188 }
mbed_official 610:813dcc80987e 1189
mbed_official 610:813dcc80987e 1190 /**
mbed_official 610:813dcc80987e 1191 * @brief Disable the Rx mute detection.
mbed_official 610:813dcc80987e 1192 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1193 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1194 * @retval HAL status
mbed_official 610:813dcc80987e 1195 */
mbed_official 610:813dcc80987e 1196 HAL_StatusTypeDef HAL_SAI_DisableRxMuteMode(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1197 {
mbed_official 610:813dcc80987e 1198 if(hsai->State != HAL_SAI_STATE_RESET)
mbed_official 610:813dcc80987e 1199 {
mbed_official 610:813dcc80987e 1200 /* set the mutecallback to NULL */
mbed_official 610:813dcc80987e 1201 hsai->mutecallback = (SAIcallback)NULL;
mbed_official 610:813dcc80987e 1202 /* enable the IT interrupt */
mbed_official 610:813dcc80987e 1203 __HAL_SAI_DISABLE_IT(hsai, SAI_IT_MUTEDET);
mbed_official 610:813dcc80987e 1204 return HAL_OK;
mbed_official 610:813dcc80987e 1205 }
mbed_official 610:813dcc80987e 1206 return HAL_ERROR;
mbed_official 610:813dcc80987e 1207 }
mbed_official 610:813dcc80987e 1208
mbed_official 610:813dcc80987e 1209 /**
mbed_official 610:813dcc80987e 1210 * @brief Handle SAI interrupt request.
mbed_official 610:813dcc80987e 1211 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1212 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1213 * @retval None
mbed_official 610:813dcc80987e 1214 */
mbed_official 610:813dcc80987e 1215 void HAL_SAI_IRQHandler(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1216 {
mbed_official 610:813dcc80987e 1217 if(hsai->State != HAL_SAI_STATE_RESET)
mbed_official 610:813dcc80987e 1218 {
mbed_official 610:813dcc80987e 1219 __IO uint32_t tmpFlag = hsai->Instance->SR;
mbed_official 610:813dcc80987e 1220 __IO uint32_t tmpItSource = hsai->Instance->IMR;
mbed_official 610:813dcc80987e 1221
mbed_official 610:813dcc80987e 1222 if(((tmpFlag & SAI_xSR_FREQ) == SAI_xSR_FREQ) && ((tmpItSource & SAI_IT_FREQ) == SAI_IT_FREQ))
mbed_official 610:813dcc80987e 1223 {
mbed_official 610:813dcc80987e 1224 hsai->InterruptServiceRoutine(hsai);
mbed_official 610:813dcc80987e 1225 goto exit;
mbed_official 610:813dcc80987e 1226 }
mbed_official 610:813dcc80987e 1227
mbed_official 610:813dcc80987e 1228 /* check the flag only if one of them is set */
mbed_official 610:813dcc80987e 1229 if(tmpFlag != 0x00000000)
mbed_official 610:813dcc80987e 1230 {
mbed_official 610:813dcc80987e 1231 /* SAI Overrun error interrupt occurred ----------------------------------*/
mbed_official 610:813dcc80987e 1232 if(((tmpFlag & SAI_FLAG_OVRUDR) == SAI_FLAG_OVRUDR) && ((tmpItSource & SAI_IT_OVRUDR) == SAI_IT_OVRUDR))
mbed_official 610:813dcc80987e 1233 {
mbed_official 610:813dcc80987e 1234 /* Clear the SAI Overrun flag */
mbed_official 610:813dcc80987e 1235 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
mbed_official 610:813dcc80987e 1236 /* Change the SAI error code */
mbed_official 610:813dcc80987e 1237 hsai->ErrorCode = ((hsai->State == HAL_SAI_STATE_BUSY_RX) ? HAL_SAI_ERROR_OVR : HAL_SAI_ERROR_UDR);
mbed_official 610:813dcc80987e 1238 /* the transfer is not stopped, we will forward the information to the user and we let the user decide what needs to be done */
mbed_official 610:813dcc80987e 1239 HAL_SAI_ErrorCallback(hsai);
mbed_official 610:813dcc80987e 1240 goto exit;
mbed_official 610:813dcc80987e 1241 }
mbed_official 610:813dcc80987e 1242
mbed_official 610:813dcc80987e 1243 /* SAI mutedet interrupt occurred ----------------------------------*/
mbed_official 610:813dcc80987e 1244 if(((tmpFlag & SAI_FLAG_MUTEDET) == SAI_FLAG_MUTEDET) && ((tmpItSource & SAI_IT_MUTEDET) == SAI_IT_MUTEDET))
mbed_official 610:813dcc80987e 1245 {
mbed_official 610:813dcc80987e 1246 /* Clear the SAI mutedet flag */
mbed_official 610:813dcc80987e 1247 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_MUTEDET);
mbed_official 610:813dcc80987e 1248 /* call the call back function */
mbed_official 610:813dcc80987e 1249 if(hsai->mutecallback != (SAIcallback)NULL)
mbed_official 610:813dcc80987e 1250 {
mbed_official 610:813dcc80987e 1251 /* inform the user that an RX mute event has been detected */
mbed_official 610:813dcc80987e 1252 hsai->mutecallback();
mbed_official 610:813dcc80987e 1253 }
mbed_official 610:813dcc80987e 1254 goto exit;
mbed_official 610:813dcc80987e 1255 }
mbed_official 610:813dcc80987e 1256
mbed_official 610:813dcc80987e 1257 /* SAI AFSDET interrupt occurred ----------------------------------*/
mbed_official 610:813dcc80987e 1258 if(((tmpFlag & SAI_FLAG_AFSDET) == SAI_FLAG_AFSDET) && ((tmpItSource & SAI_IT_AFSDET) == SAI_IT_AFSDET))
mbed_official 610:813dcc80987e 1259 {
mbed_official 610:813dcc80987e 1260 /* Change the SAI error code */
mbed_official 610:813dcc80987e 1261 hsai->ErrorCode = HAL_SAI_ERROR_AFSDET;
mbed_official 610:813dcc80987e 1262 goto error;
mbed_official 610:813dcc80987e 1263 }
mbed_official 610:813dcc80987e 1264
mbed_official 610:813dcc80987e 1265 /* SAI LFSDET interrupt occurred ----------------------------------*/
mbed_official 610:813dcc80987e 1266 if(((tmpFlag & SAI_FLAG_LFSDET) == SAI_FLAG_LFSDET) && ((tmpItSource & SAI_IT_LFSDET) == SAI_IT_LFSDET))
mbed_official 610:813dcc80987e 1267 {
mbed_official 610:813dcc80987e 1268 /* Change the SAI error code */
mbed_official 610:813dcc80987e 1269 hsai->ErrorCode = HAL_SAI_ERROR_LFSDET;
mbed_official 610:813dcc80987e 1270 goto error;
mbed_official 610:813dcc80987e 1271 }
mbed_official 610:813dcc80987e 1272
mbed_official 610:813dcc80987e 1273 /* SAI WCKCFG interrupt occurred ----------------------------------*/
mbed_official 610:813dcc80987e 1274 if(((tmpFlag & SAI_FLAG_WCKCFG) == SAI_FLAG_WCKCFG) && ((tmpItSource & SAI_IT_WCKCFG) == SAI_IT_WCKCFG))
mbed_official 610:813dcc80987e 1275 {
mbed_official 610:813dcc80987e 1276 /* Change the SAI error code */
mbed_official 610:813dcc80987e 1277 hsai->ErrorCode = HAL_SAI_ERROR_WCKCFG;
mbed_official 610:813dcc80987e 1278 goto error;
mbed_official 610:813dcc80987e 1279 }
mbed_official 610:813dcc80987e 1280 }
mbed_official 610:813dcc80987e 1281 }
mbed_official 610:813dcc80987e 1282
mbed_official 610:813dcc80987e 1283 exit :
mbed_official 610:813dcc80987e 1284 return;
mbed_official 610:813dcc80987e 1285 error :
mbed_official 610:813dcc80987e 1286 /* Abort the current communication, disable the SAI block, and clear all the flags */
mbed_official 610:813dcc80987e 1287 HAL_SAI_Abort(hsai);
mbed_official 610:813dcc80987e 1288 HAL_SAI_ErrorCallback(hsai);
mbed_official 610:813dcc80987e 1289 return;
mbed_official 610:813dcc80987e 1290 }
mbed_official 610:813dcc80987e 1291
mbed_official 610:813dcc80987e 1292 /**
mbed_official 610:813dcc80987e 1293 * @brief Tx Transfer completed callback.
mbed_official 610:813dcc80987e 1294 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1295 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1296 * @retval None
mbed_official 610:813dcc80987e 1297 */
mbed_official 610:813dcc80987e 1298 __weak void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1299 {
mbed_official 610:813dcc80987e 1300 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 610:813dcc80987e 1301 the HAL_SAI_TxCpltCallback could be implemented in the user file
mbed_official 610:813dcc80987e 1302 */
mbed_official 610:813dcc80987e 1303 }
mbed_official 610:813dcc80987e 1304
mbed_official 610:813dcc80987e 1305 /**
mbed_official 610:813dcc80987e 1306 * @brief Tx Transfer Half completed callback.
mbed_official 610:813dcc80987e 1307 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1308 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1309 * @retval None
mbed_official 610:813dcc80987e 1310 */
mbed_official 610:813dcc80987e 1311 __weak void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1312 {
mbed_official 610:813dcc80987e 1313 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 610:813dcc80987e 1314 the HAL_SAI_TxHalfCpltCallback could be implemented in the user file
mbed_official 610:813dcc80987e 1315 */
mbed_official 610:813dcc80987e 1316 }
mbed_official 610:813dcc80987e 1317
mbed_official 610:813dcc80987e 1318 /**
mbed_official 610:813dcc80987e 1319 * @brief Rx Transfer completed callback.
mbed_official 610:813dcc80987e 1320 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1321 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1322 * @retval None
mbed_official 610:813dcc80987e 1323 */
mbed_official 610:813dcc80987e 1324 __weak void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1325 {
mbed_official 610:813dcc80987e 1326 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 610:813dcc80987e 1327 the HAL_SAI_RxCpltCallback could be implemented in the user file
mbed_official 610:813dcc80987e 1328 */
mbed_official 610:813dcc80987e 1329 }
mbed_official 610:813dcc80987e 1330
mbed_official 610:813dcc80987e 1331 /**
mbed_official 610:813dcc80987e 1332 * @brief Rx Transfer half completed callback.
mbed_official 610:813dcc80987e 1333 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1334 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1335 * @retval None
mbed_official 610:813dcc80987e 1336 */
mbed_official 610:813dcc80987e 1337 __weak void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1338 {
mbed_official 610:813dcc80987e 1339 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 610:813dcc80987e 1340 the HAL_SAI_RxCpltCallback could be implemented in the user file
mbed_official 610:813dcc80987e 1341 */
mbed_official 610:813dcc80987e 1342 }
mbed_official 610:813dcc80987e 1343
mbed_official 610:813dcc80987e 1344 /**
mbed_official 610:813dcc80987e 1345 * @brief SAI error callback.
mbed_official 610:813dcc80987e 1346 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1347 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1348 * @retval None
mbed_official 610:813dcc80987e 1349 */
mbed_official 610:813dcc80987e 1350 __weak void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1351 {
mbed_official 610:813dcc80987e 1352 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 610:813dcc80987e 1353 the HAL_SAI_ErrorCallback could be implemented in the user file
mbed_official 610:813dcc80987e 1354 */
mbed_official 610:813dcc80987e 1355 }
mbed_official 610:813dcc80987e 1356
mbed_official 610:813dcc80987e 1357 /**
mbed_official 610:813dcc80987e 1358 * @}
mbed_official 610:813dcc80987e 1359 */
mbed_official 610:813dcc80987e 1360
mbed_official 610:813dcc80987e 1361
mbed_official 610:813dcc80987e 1362 /** @defgroup SAI_Exported_Functions_Group3 Peripheral State functions
mbed_official 610:813dcc80987e 1363 * @brief Peripheral State functions
mbed_official 610:813dcc80987e 1364 *
mbed_official 610:813dcc80987e 1365 @verbatim
mbed_official 610:813dcc80987e 1366 ===============================================================================
mbed_official 610:813dcc80987e 1367 ##### Peripheral State and Errors functions #####
mbed_official 610:813dcc80987e 1368 ===============================================================================
mbed_official 610:813dcc80987e 1369 [..]
mbed_official 610:813dcc80987e 1370 This subsection permits to get in run-time the status of the peripheral
mbed_official 610:813dcc80987e 1371 and the data flow.
mbed_official 610:813dcc80987e 1372
mbed_official 610:813dcc80987e 1373 @endverbatim
mbed_official 610:813dcc80987e 1374 * @{
mbed_official 610:813dcc80987e 1375 */
mbed_official 610:813dcc80987e 1376
mbed_official 610:813dcc80987e 1377 /**
mbed_official 610:813dcc80987e 1378 * @brief Return the SAI handle state.
mbed_official 610:813dcc80987e 1379 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1380 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1381 * @retval HAL state
mbed_official 610:813dcc80987e 1382 */
mbed_official 610:813dcc80987e 1383 HAL_SAI_StateTypeDef HAL_SAI_GetState(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1384 {
mbed_official 610:813dcc80987e 1385 /* Return SAI handle state */
mbed_official 610:813dcc80987e 1386 return hsai->State;
mbed_official 610:813dcc80987e 1387 }
mbed_official 610:813dcc80987e 1388
mbed_official 610:813dcc80987e 1389 /**
mbed_official 610:813dcc80987e 1390 * @brief Return the SAI error code.
mbed_official 610:813dcc80987e 1391 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1392 * the configuration information for the specified SAI Block.
mbed_official 610:813dcc80987e 1393 * @retval SAI Error Code
mbed_official 610:813dcc80987e 1394 */
mbed_official 610:813dcc80987e 1395 uint32_t HAL_SAI_GetError(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1396 {
mbed_official 610:813dcc80987e 1397 return hsai->ErrorCode;
mbed_official 610:813dcc80987e 1398 }
mbed_official 610:813dcc80987e 1399 /**
mbed_official 610:813dcc80987e 1400 * @}
mbed_official 610:813dcc80987e 1401 */
mbed_official 610:813dcc80987e 1402
mbed_official 610:813dcc80987e 1403 /**
mbed_official 610:813dcc80987e 1404 * @}
mbed_official 610:813dcc80987e 1405 */
mbed_official 610:813dcc80987e 1406
mbed_official 610:813dcc80987e 1407 /** @addtogroup SAI_Private_Functions
mbed_official 610:813dcc80987e 1408 * @brief Private functions
mbed_official 610:813dcc80987e 1409 * @{
mbed_official 610:813dcc80987e 1410 */
mbed_official 610:813dcc80987e 1411 /**
mbed_official 610:813dcc80987e 1412 * @brief Initialize the SAI I2S protocol according to the specified parameters
mbed_official 610:813dcc80987e 1413 * in the SAI_InitTypeDef and create the associated handle.
mbed_official 610:813dcc80987e 1414 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1415 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1416 * @param protocol: one of the supported protocol
mbed_official 610:813dcc80987e 1417 * @param datasize: one of the supported datasize @ref SAI_Protocol_DataSize
mbed_official 610:813dcc80987e 1418 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1419 * @param nbslot: number of slot minimum value is 2 and max is 16.
mbed_official 610:813dcc80987e 1420 * the value must be a multiple of 2.
mbed_official 610:813dcc80987e 1421 * @retval HAL status
mbed_official 610:813dcc80987e 1422 */
mbed_official 610:813dcc80987e 1423 static HAL_StatusTypeDef SAI_InitI2S(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
mbed_official 610:813dcc80987e 1424 {
mbed_official 610:813dcc80987e 1425 hsai->Init.Protocol = SAI_FREE_PROTOCOL;
mbed_official 610:813dcc80987e 1426 hsai->Init.FirstBit = SAI_FIRSTBIT_MSB;
mbed_official 610:813dcc80987e 1427 hsai->Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE;
mbed_official 610:813dcc80987e 1428 hsai->FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION;
mbed_official 610:813dcc80987e 1429 hsai->SlotInit.SlotActive = SAI_SLOTACTIVE_ALL;
mbed_official 610:813dcc80987e 1430 hsai->SlotInit.FirstBitOffset = 0;
mbed_official 610:813dcc80987e 1431 hsai->SlotInit.SlotNumber = nbslot;
mbed_official 610:813dcc80987e 1432
mbed_official 610:813dcc80987e 1433 /* in IS2 the number of slot must be even */
mbed_official 610:813dcc80987e 1434 if((nbslot & 0x1) != 0 )
mbed_official 610:813dcc80987e 1435 {
mbed_official 610:813dcc80987e 1436 return HAL_ERROR;
mbed_official 610:813dcc80987e 1437 }
mbed_official 610:813dcc80987e 1438
mbed_official 610:813dcc80987e 1439 switch(protocol)
mbed_official 610:813dcc80987e 1440 {
mbed_official 610:813dcc80987e 1441 case SAI_I2S_STANDARD :
mbed_official 610:813dcc80987e 1442 hsai->FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW;
mbed_official 610:813dcc80987e 1443 hsai->FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
mbed_official 610:813dcc80987e 1444 break;
mbed_official 610:813dcc80987e 1445 case SAI_I2S_MSBJUSTIFIED :
mbed_official 610:813dcc80987e 1446 case SAI_I2S_LSBJUSTIFIED :
mbed_official 610:813dcc80987e 1447 hsai->FrameInit.FSPolarity = SAI_FS_ACTIVE_HIGH;
mbed_official 610:813dcc80987e 1448 hsai->FrameInit.FSOffset = SAI_FS_FIRSTBIT;
mbed_official 610:813dcc80987e 1449 break;
mbed_official 610:813dcc80987e 1450 default :
mbed_official 610:813dcc80987e 1451 return HAL_ERROR;
mbed_official 610:813dcc80987e 1452 }
mbed_official 610:813dcc80987e 1453
mbed_official 610:813dcc80987e 1454 /* Frame definition */
mbed_official 610:813dcc80987e 1455 hsai->Init.DataSize = 0xFFFFFFFF;
mbed_official 610:813dcc80987e 1456 switch(datasize)
mbed_official 610:813dcc80987e 1457 {
mbed_official 610:813dcc80987e 1458 case SAI_PROTOCOL_DATASIZE_16BIT:
mbed_official 610:813dcc80987e 1459 hsai->Init.DataSize = SAI_DATASIZE_16;
mbed_official 610:813dcc80987e 1460 hsai->FrameInit.FrameLength = 32*(nbslot/2);
mbed_official 610:813dcc80987e 1461 hsai->FrameInit.ActiveFrameLength = 16*(nbslot/2);
mbed_official 610:813dcc80987e 1462 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_16B;
mbed_official 610:813dcc80987e 1463 break;
mbed_official 610:813dcc80987e 1464 case SAI_PROTOCOL_DATASIZE_16BITEXTENDED :
mbed_official 610:813dcc80987e 1465 if (hsai->Init.DataSize == 0xFFFFFFFF)
mbed_official 610:813dcc80987e 1466 {
mbed_official 610:813dcc80987e 1467 hsai->Init.DataSize = SAI_DATASIZE_16;
mbed_official 610:813dcc80987e 1468 }
mbed_official 610:813dcc80987e 1469 /* Fall thru next statement */
mbed_official 610:813dcc80987e 1470 case SAI_PROTOCOL_DATASIZE_24BIT:
mbed_official 610:813dcc80987e 1471 if (hsai->Init.DataSize == 0xFFFFFFFF)
mbed_official 610:813dcc80987e 1472 {
mbed_official 610:813dcc80987e 1473 hsai->Init.DataSize = SAI_DATASIZE_24;
mbed_official 610:813dcc80987e 1474 }
mbed_official 610:813dcc80987e 1475 /* Fall thru next statement */
mbed_official 610:813dcc80987e 1476 case SAI_PROTOCOL_DATASIZE_32BIT:
mbed_official 610:813dcc80987e 1477 if (hsai->Init.DataSize == 0xFFFFFFFF)
mbed_official 610:813dcc80987e 1478 {
mbed_official 610:813dcc80987e 1479 hsai->Init.DataSize = SAI_DATASIZE_32;
mbed_official 610:813dcc80987e 1480 }
mbed_official 610:813dcc80987e 1481
mbed_official 610:813dcc80987e 1482 hsai->FrameInit.FrameLength = 64*(nbslot/2);
mbed_official 610:813dcc80987e 1483 hsai->FrameInit.ActiveFrameLength = 32*(nbslot/2);
mbed_official 610:813dcc80987e 1484 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_32B;
mbed_official 610:813dcc80987e 1485
mbed_official 610:813dcc80987e 1486 if(protocol == SAI_I2S_LSBJUSTIFIED)
mbed_official 610:813dcc80987e 1487 {
mbed_official 610:813dcc80987e 1488 if (datasize == SAI_PROTOCOL_DATASIZE_16BITEXTENDED)
mbed_official 610:813dcc80987e 1489 {
mbed_official 610:813dcc80987e 1490 hsai->SlotInit.FirstBitOffset = 16;
mbed_official 610:813dcc80987e 1491 }
mbed_official 610:813dcc80987e 1492 if (datasize == SAI_PROTOCOL_DATASIZE_24BIT)
mbed_official 610:813dcc80987e 1493 {
mbed_official 610:813dcc80987e 1494 hsai->SlotInit.FirstBitOffset = 8;
mbed_official 610:813dcc80987e 1495 }
mbed_official 610:813dcc80987e 1496 }
mbed_official 610:813dcc80987e 1497 break;
mbed_official 610:813dcc80987e 1498 default :
mbed_official 610:813dcc80987e 1499 return HAL_ERROR;
mbed_official 610:813dcc80987e 1500 }
mbed_official 610:813dcc80987e 1501
mbed_official 610:813dcc80987e 1502 return HAL_OK;
mbed_official 610:813dcc80987e 1503 }
mbed_official 610:813dcc80987e 1504
mbed_official 610:813dcc80987e 1505 /**
mbed_official 610:813dcc80987e 1506 * @brief Initialize the SAI PCM protocol according to the specified parameters
mbed_official 610:813dcc80987e 1507 * in the SAI_InitTypeDef and create the associated handle.
mbed_official 610:813dcc80987e 1508 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1509 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1510 * @param protocol: one of the supported protocol
mbed_official 610:813dcc80987e 1511 * @param datasize: one of the supported datasize @ref SAI_Protocol_DataSize
mbed_official 610:813dcc80987e 1512 * @param nbslot: number of slot minimum value is 1 and the max is 16.
mbed_official 610:813dcc80987e 1513 * @retval HAL status
mbed_official 610:813dcc80987e 1514 */
mbed_official 610:813dcc80987e 1515 static HAL_StatusTypeDef SAI_InitPCM(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
mbed_official 610:813dcc80987e 1516 {
mbed_official 610:813dcc80987e 1517 hsai->Init.Protocol = SAI_FREE_PROTOCOL;
mbed_official 610:813dcc80987e 1518 hsai->Init.FirstBit = SAI_FIRSTBIT_MSB;
mbed_official 610:813dcc80987e 1519 hsai->Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE;
mbed_official 610:813dcc80987e 1520 hsai->FrameInit.FSDefinition = SAI_FS_STARTFRAME;
mbed_official 610:813dcc80987e 1521 hsai->FrameInit.FSPolarity = SAI_FS_ACTIVE_HIGH;
mbed_official 610:813dcc80987e 1522 hsai->FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
mbed_official 610:813dcc80987e 1523 hsai->SlotInit.FirstBitOffset = 0;
mbed_official 610:813dcc80987e 1524 hsai->SlotInit.SlotNumber = nbslot;
mbed_official 610:813dcc80987e 1525 hsai->SlotInit.SlotActive = SAI_SLOTACTIVE_ALL;
mbed_official 610:813dcc80987e 1526
mbed_official 610:813dcc80987e 1527 switch(protocol)
mbed_official 610:813dcc80987e 1528 {
mbed_official 610:813dcc80987e 1529 case SAI_PCM_SHORT :
mbed_official 610:813dcc80987e 1530 hsai->FrameInit.ActiveFrameLength = 1;
mbed_official 610:813dcc80987e 1531 break;
mbed_official 610:813dcc80987e 1532 case SAI_PCM_LONG :
mbed_official 610:813dcc80987e 1533 hsai->FrameInit.ActiveFrameLength = 13;
mbed_official 610:813dcc80987e 1534 break;
mbed_official 610:813dcc80987e 1535 default :
mbed_official 610:813dcc80987e 1536 return HAL_ERROR;
mbed_official 610:813dcc80987e 1537 }
mbed_official 610:813dcc80987e 1538
mbed_official 610:813dcc80987e 1539 switch(datasize)
mbed_official 610:813dcc80987e 1540 {
mbed_official 610:813dcc80987e 1541 case SAI_PROTOCOL_DATASIZE_16BIT:
mbed_official 610:813dcc80987e 1542 hsai->Init.DataSize = SAI_DATASIZE_16;
mbed_official 610:813dcc80987e 1543 hsai->FrameInit.FrameLength = 16 * nbslot;
mbed_official 610:813dcc80987e 1544 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_16B;
mbed_official 610:813dcc80987e 1545 break;
mbed_official 610:813dcc80987e 1546 case SAI_PROTOCOL_DATASIZE_16BITEXTENDED :
mbed_official 610:813dcc80987e 1547 hsai->Init.DataSize = SAI_DATASIZE_16;
mbed_official 610:813dcc80987e 1548 hsai->FrameInit.FrameLength = 32 * nbslot;
mbed_official 610:813dcc80987e 1549 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_32B;
mbed_official 610:813dcc80987e 1550 break;
mbed_official 610:813dcc80987e 1551
mbed_official 610:813dcc80987e 1552 case SAI_PROTOCOL_DATASIZE_32BIT:
mbed_official 610:813dcc80987e 1553 hsai->Init.DataSize = SAI_DATASIZE_32;
mbed_official 610:813dcc80987e 1554 hsai->FrameInit.FrameLength = 32 * nbslot;
mbed_official 610:813dcc80987e 1555 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_32B;
mbed_official 610:813dcc80987e 1556 break;
mbed_official 610:813dcc80987e 1557 default :
mbed_official 610:813dcc80987e 1558 return HAL_ERROR;
mbed_official 610:813dcc80987e 1559 }
mbed_official 610:813dcc80987e 1560
mbed_official 610:813dcc80987e 1561 return HAL_OK;
mbed_official 610:813dcc80987e 1562 }
mbed_official 610:813dcc80987e 1563
mbed_official 610:813dcc80987e 1564 /**
mbed_official 610:813dcc80987e 1565 * @brief Fill the fifo.
mbed_official 610:813dcc80987e 1566 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1567 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1568 * @retval None
mbed_official 610:813dcc80987e 1569 */
mbed_official 610:813dcc80987e 1570 static void SAI_FillFifo(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1571 {
mbed_official 610:813dcc80987e 1572 /* fill the fifo with data before to enabled the SAI */
mbed_official 610:813dcc80987e 1573 while((hsai->Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_FULL)
mbed_official 610:813dcc80987e 1574 {
mbed_official 610:813dcc80987e 1575 if((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
mbed_official 610:813dcc80987e 1576 {
mbed_official 610:813dcc80987e 1577 hsai->Instance->DR = (*hsai->pBuffPtr++);
mbed_official 610:813dcc80987e 1578 }
mbed_official 610:813dcc80987e 1579 else if(hsai->Init.DataSize <= SAI_DATASIZE_16)
mbed_official 610:813dcc80987e 1580 {
mbed_official 610:813dcc80987e 1581 hsai->Instance->DR = *((uint32_t *)hsai->pBuffPtr);
mbed_official 610:813dcc80987e 1582 hsai->pBuffPtr+= 2;
mbed_official 610:813dcc80987e 1583 }
mbed_official 610:813dcc80987e 1584 else
mbed_official 610:813dcc80987e 1585 {
mbed_official 610:813dcc80987e 1586 hsai->Instance->DR = *((uint32_t *)hsai->pBuffPtr);
mbed_official 610:813dcc80987e 1587 hsai->pBuffPtr+= 4;
mbed_official 610:813dcc80987e 1588 }
mbed_official 610:813dcc80987e 1589 hsai->XferCount--;
mbed_official 610:813dcc80987e 1590 }
mbed_official 610:813dcc80987e 1591 }
mbed_official 610:813dcc80987e 1592
mbed_official 610:813dcc80987e 1593 /**
mbed_official 610:813dcc80987e 1594 * @brief Return the interrupt flag to set according the SAI setup.
mbed_official 610:813dcc80987e 1595 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1596 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1597 * @param mode: SAI_MODE_DMA or SAI_MODE_IT
mbed_official 610:813dcc80987e 1598 * @retval the list of the IT flag to enable
mbed_official 610:813dcc80987e 1599 */
mbed_official 610:813dcc80987e 1600 static int32_t SAI_InterruptFlag(SAI_HandleTypeDef *hsai, uint32_t mode)
mbed_official 610:813dcc80987e 1601 {
mbed_official 610:813dcc80987e 1602 int32_t tmpIT = SAI_IT_OVRUDR;
mbed_official 610:813dcc80987e 1603
mbed_official 610:813dcc80987e 1604 if(mode == SAI_MODE_IT)
mbed_official 610:813dcc80987e 1605 {
mbed_official 610:813dcc80987e 1606 tmpIT|= SAI_IT_FREQ;
mbed_official 610:813dcc80987e 1607 }
mbed_official 610:813dcc80987e 1608
mbed_official 610:813dcc80987e 1609 if((hsai->Init.AudioMode == SAI_MODESLAVE_RX) || (hsai->Init.AudioMode == SAI_MODESLAVE_TX))
mbed_official 610:813dcc80987e 1610 {
mbed_official 610:813dcc80987e 1611 tmpIT|= SAI_IT_AFSDET | SAI_IT_LFSDET;
mbed_official 610:813dcc80987e 1612 }
mbed_official 610:813dcc80987e 1613 else
mbed_official 610:813dcc80987e 1614 {
mbed_official 610:813dcc80987e 1615 /* hsai has been configured in master mode */
mbed_official 610:813dcc80987e 1616 tmpIT|= SAI_IT_WCKCFG;
mbed_official 610:813dcc80987e 1617 }
mbed_official 610:813dcc80987e 1618 return tmpIT;
mbed_official 610:813dcc80987e 1619 }
mbed_official 610:813dcc80987e 1620
mbed_official 610:813dcc80987e 1621 /**
mbed_official 610:813dcc80987e 1622 * @brief Disable the SAI and wait for the disabling.
mbed_official 610:813dcc80987e 1623 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1624 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1625 * @retval None
mbed_official 610:813dcc80987e 1626 */
mbed_official 610:813dcc80987e 1627 static HAL_StatusTypeDef SAI_Disable(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1628 {
mbed_official 610:813dcc80987e 1629 uint32_t tickstart = HAL_GetTick();
mbed_official 610:813dcc80987e 1630 HAL_StatusTypeDef errorcode = HAL_OK;
mbed_official 610:813dcc80987e 1631
mbed_official 610:813dcc80987e 1632 __HAL_SAI_DISABLE(hsai);
mbed_official 610:813dcc80987e 1633 while((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != RESET)
mbed_official 610:813dcc80987e 1634 {
mbed_official 610:813dcc80987e 1635 /* Check for the Timeout */
mbed_official 610:813dcc80987e 1636 if((HAL_GetTick() - tickstart) > SAI_DEFAULT_TIMEOUT)
mbed_official 610:813dcc80987e 1637 {
mbed_official 610:813dcc80987e 1638 errorcode = HAL_TIMEOUT;
mbed_official 610:813dcc80987e 1639 goto error;
mbed_official 610:813dcc80987e 1640 }
mbed_official 610:813dcc80987e 1641 }
mbed_official 610:813dcc80987e 1642 error:
mbed_official 610:813dcc80987e 1643 return errorcode;
mbed_official 610:813dcc80987e 1644 }
mbed_official 610:813dcc80987e 1645
mbed_official 610:813dcc80987e 1646 /**
mbed_official 610:813dcc80987e 1647 * @brief Tx Handler for Transmit in Interrupt mode 8-bit transfer.
mbed_official 610:813dcc80987e 1648 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1649 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1650 * @retval None
mbed_official 610:813dcc80987e 1651 */
mbed_official 610:813dcc80987e 1652 static void SAI_Transmit_IT8Bit(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1653 {
mbed_official 610:813dcc80987e 1654 /* Write data on DR register */
mbed_official 610:813dcc80987e 1655 hsai->Instance->DR = (*hsai->pBuffPtr++);
mbed_official 610:813dcc80987e 1656 hsai->XferCount--;
mbed_official 610:813dcc80987e 1657
mbed_official 610:813dcc80987e 1658 /* Handle the end of the transmission */
mbed_official 610:813dcc80987e 1659 if(hsai->XferCount == 0)
mbed_official 610:813dcc80987e 1660 {
mbed_official 610:813dcc80987e 1661 /* Disable FREQ and OVRUDR interrupts */
mbed_official 610:813dcc80987e 1662 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
mbed_official 610:813dcc80987e 1663 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 1664 HAL_SAI_TxCpltCallback(hsai);
mbed_official 610:813dcc80987e 1665 }
mbed_official 610:813dcc80987e 1666 }
mbed_official 610:813dcc80987e 1667
mbed_official 610:813dcc80987e 1668 /**
mbed_official 610:813dcc80987e 1669 * @brief Tx Handler for Transmit in Interrupt mode for 16-bit transfer.
mbed_official 610:813dcc80987e 1670 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1671 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1672 * @retval None
mbed_official 610:813dcc80987e 1673 */
mbed_official 610:813dcc80987e 1674 static void SAI_Transmit_IT16Bit(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1675 {
mbed_official 610:813dcc80987e 1676 /* Write data on DR register */
mbed_official 610:813dcc80987e 1677 hsai->Instance->DR = *(uint16_t *)hsai->pBuffPtr;
mbed_official 610:813dcc80987e 1678 hsai->pBuffPtr+=2;
mbed_official 610:813dcc80987e 1679 hsai->XferCount--;
mbed_official 610:813dcc80987e 1680
mbed_official 610:813dcc80987e 1681 /* Handle the end of the transmission */
mbed_official 610:813dcc80987e 1682 if(hsai->XferCount == 0)
mbed_official 610:813dcc80987e 1683 {
mbed_official 610:813dcc80987e 1684 /* Disable FREQ and OVRUDR interrupts */
mbed_official 610:813dcc80987e 1685 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
mbed_official 610:813dcc80987e 1686 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 1687 HAL_SAI_TxCpltCallback(hsai);
mbed_official 610:813dcc80987e 1688 }
mbed_official 610:813dcc80987e 1689 }
mbed_official 610:813dcc80987e 1690
mbed_official 610:813dcc80987e 1691 /**
mbed_official 610:813dcc80987e 1692 * @brief Tx Handler for Transmit in Interrupt mode for 32-bit transfer.
mbed_official 610:813dcc80987e 1693 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1694 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1695 * @retval None
mbed_official 610:813dcc80987e 1696 */
mbed_official 610:813dcc80987e 1697 static void SAI_Transmit_IT32Bit(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1698 {
mbed_official 610:813dcc80987e 1699 /* Write data on DR register */
mbed_official 610:813dcc80987e 1700 hsai->Instance->DR = *(uint32_t *)hsai->pBuffPtr;
mbed_official 610:813dcc80987e 1701 hsai->pBuffPtr+=4;
mbed_official 610:813dcc80987e 1702 hsai->XferCount--;
mbed_official 610:813dcc80987e 1703
mbed_official 610:813dcc80987e 1704 /* Handle the end of the transmission */
mbed_official 610:813dcc80987e 1705 if(hsai->XferCount == 0)
mbed_official 610:813dcc80987e 1706 {
mbed_official 610:813dcc80987e 1707 /* Disable FREQ and OVRUDR interrupts */
mbed_official 610:813dcc80987e 1708 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
mbed_official 610:813dcc80987e 1709 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 1710 HAL_SAI_TxCpltCallback(hsai);
mbed_official 610:813dcc80987e 1711 }
mbed_official 610:813dcc80987e 1712 }
mbed_official 610:813dcc80987e 1713
mbed_official 610:813dcc80987e 1714 /**
mbed_official 610:813dcc80987e 1715 * @brief Rx Handler for Receive in Interrupt mode 8-bit transfer.
mbed_official 610:813dcc80987e 1716 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1717 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1718 * @retval None
mbed_official 610:813dcc80987e 1719 */
mbed_official 610:813dcc80987e 1720 static void SAI_Receive_IT8Bit(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1721 {
mbed_official 610:813dcc80987e 1722 /* Receive data */
mbed_official 610:813dcc80987e 1723 (*hsai->pBuffPtr++) = hsai->Instance->DR;
mbed_official 610:813dcc80987e 1724 hsai->XferCount--;
mbed_official 610:813dcc80987e 1725
mbed_official 610:813dcc80987e 1726 /* Check end of the transfer */
mbed_official 610:813dcc80987e 1727 if(hsai->XferCount == 0)
mbed_official 610:813dcc80987e 1728 {
mbed_official 610:813dcc80987e 1729 /* Disable TXE and OVRUDR interrupts */
mbed_official 610:813dcc80987e 1730 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
mbed_official 610:813dcc80987e 1731
mbed_official 610:813dcc80987e 1732 /* Clear the SAI Overrun flag */
mbed_official 610:813dcc80987e 1733 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
mbed_official 610:813dcc80987e 1734
mbed_official 610:813dcc80987e 1735 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 1736 HAL_SAI_RxCpltCallback(hsai);
mbed_official 610:813dcc80987e 1737 }
mbed_official 610:813dcc80987e 1738 }
mbed_official 610:813dcc80987e 1739
mbed_official 610:813dcc80987e 1740 /**
mbed_official 610:813dcc80987e 1741 * @brief Rx Handler for Receive in Interrupt mode for 16-bit transfer.
mbed_official 610:813dcc80987e 1742 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1743 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1744 * @retval None
mbed_official 610:813dcc80987e 1745 */
mbed_official 610:813dcc80987e 1746 static void SAI_Receive_IT16Bit(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1747 {
mbed_official 610:813dcc80987e 1748 /* Receive data */
mbed_official 610:813dcc80987e 1749 *(uint16_t*)hsai->pBuffPtr = hsai->Instance->DR;
mbed_official 610:813dcc80987e 1750 hsai->pBuffPtr+=2;
mbed_official 610:813dcc80987e 1751 hsai->XferCount--;
mbed_official 610:813dcc80987e 1752
mbed_official 610:813dcc80987e 1753 /* Check end of the transfer */
mbed_official 610:813dcc80987e 1754 if(hsai->XferCount == 0)
mbed_official 610:813dcc80987e 1755 {
mbed_official 610:813dcc80987e 1756 /* Disable TXE and OVRUDR interrupts */
mbed_official 610:813dcc80987e 1757 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
mbed_official 610:813dcc80987e 1758
mbed_official 610:813dcc80987e 1759 /* Clear the SAI Overrun flag */
mbed_official 610:813dcc80987e 1760 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
mbed_official 610:813dcc80987e 1761
mbed_official 610:813dcc80987e 1762 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 1763 HAL_SAI_RxCpltCallback(hsai);
mbed_official 610:813dcc80987e 1764 }
mbed_official 610:813dcc80987e 1765 }
mbed_official 610:813dcc80987e 1766 /**
mbed_official 610:813dcc80987e 1767 * @brief Rx Handler for Receive in Interrupt mode for 32-bit transfer.
mbed_official 610:813dcc80987e 1768 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1769 * the configuration information for SAI module.
mbed_official 610:813dcc80987e 1770 * @retval None
mbed_official 610:813dcc80987e 1771 */
mbed_official 610:813dcc80987e 1772 static void SAI_Receive_IT32Bit(SAI_HandleTypeDef *hsai)
mbed_official 610:813dcc80987e 1773 {
mbed_official 610:813dcc80987e 1774 /* Receive data */
mbed_official 610:813dcc80987e 1775 *(uint32_t*)hsai->pBuffPtr = hsai->Instance->DR;
mbed_official 610:813dcc80987e 1776 hsai->pBuffPtr+=4;
mbed_official 610:813dcc80987e 1777 hsai->XferCount--;
mbed_official 610:813dcc80987e 1778
mbed_official 610:813dcc80987e 1779 /* Check end of the transfer */
mbed_official 610:813dcc80987e 1780 if(hsai->XferCount == 0)
mbed_official 610:813dcc80987e 1781 {
mbed_official 610:813dcc80987e 1782 /* Disable TXE and OVRUDR interrupts */
mbed_official 610:813dcc80987e 1783 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
mbed_official 610:813dcc80987e 1784
mbed_official 610:813dcc80987e 1785 /* Clear the SAI Overrun flag */
mbed_official 610:813dcc80987e 1786 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
mbed_official 610:813dcc80987e 1787
mbed_official 610:813dcc80987e 1788 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 1789 HAL_SAI_RxCpltCallback(hsai);
mbed_official 610:813dcc80987e 1790 }
mbed_official 610:813dcc80987e 1791 }
mbed_official 610:813dcc80987e 1792 /**
mbed_official 610:813dcc80987e 1793 * @brief DMA SAI transmit process complete callback.
mbed_official 610:813dcc80987e 1794 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1795 * the configuration information for the specified DMA module.
mbed_official 610:813dcc80987e 1796 * @retval None
mbed_official 610:813dcc80987e 1797 */
mbed_official 610:813dcc80987e 1798 static void SAI_DMATxCplt(DMA_HandleTypeDef *hdma)
mbed_official 610:813dcc80987e 1799 {
mbed_official 610:813dcc80987e 1800 SAI_HandleTypeDef* hsai = (SAI_HandleTypeDef*)((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 610:813dcc80987e 1801
mbed_official 610:813dcc80987e 1802 if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0)
mbed_official 610:813dcc80987e 1803 {
mbed_official 610:813dcc80987e 1804 hsai->XferCount = 0;
mbed_official 610:813dcc80987e 1805
mbed_official 610:813dcc80987e 1806 /* Disable SAI Tx DMA Request */
mbed_official 610:813dcc80987e 1807 hsai->Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
mbed_official 610:813dcc80987e 1808
mbed_official 610:813dcc80987e 1809 /* Stop the interrupts error handling */
mbed_official 610:813dcc80987e 1810 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
mbed_official 610:813dcc80987e 1811
mbed_official 610:813dcc80987e 1812 hsai->State= HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 1813 }
mbed_official 610:813dcc80987e 1814 HAL_SAI_TxCpltCallback(hsai);
mbed_official 610:813dcc80987e 1815 }
mbed_official 610:813dcc80987e 1816
mbed_official 610:813dcc80987e 1817 /**
mbed_official 610:813dcc80987e 1818 * @brief DMA SAI transmit process half complete callback.
mbed_official 610:813dcc80987e 1819 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1820 * the configuration information for the specified DMA module.
mbed_official 610:813dcc80987e 1821 * @retval None
mbed_official 610:813dcc80987e 1822 */
mbed_official 610:813dcc80987e 1823 static void SAI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 610:813dcc80987e 1824 {
mbed_official 610:813dcc80987e 1825 SAI_HandleTypeDef* hsai = (SAI_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 610:813dcc80987e 1826
mbed_official 610:813dcc80987e 1827 HAL_SAI_TxHalfCpltCallback(hsai);
mbed_official 610:813dcc80987e 1828 }
mbed_official 610:813dcc80987e 1829
mbed_official 610:813dcc80987e 1830 /**
mbed_official 610:813dcc80987e 1831 * @brief DMA SAI receive process complete callback.
mbed_official 610:813dcc80987e 1832 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1833 * the configuration information for the specified DMA module.
mbed_official 610:813dcc80987e 1834 * @retval None
mbed_official 610:813dcc80987e 1835 */
mbed_official 610:813dcc80987e 1836 static void SAI_DMARxCplt(DMA_HandleTypeDef *hdma)
mbed_official 610:813dcc80987e 1837 {
mbed_official 610:813dcc80987e 1838 SAI_HandleTypeDef* hsai = ( SAI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 610:813dcc80987e 1839 if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0)
mbed_official 610:813dcc80987e 1840 {
mbed_official 610:813dcc80987e 1841 /* Disable Rx DMA Request */
mbed_official 610:813dcc80987e 1842 hsai->Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
mbed_official 610:813dcc80987e 1843 hsai->XferCount = 0;
mbed_official 610:813dcc80987e 1844
mbed_official 610:813dcc80987e 1845 /* Stop the interrupts error handling */
mbed_official 610:813dcc80987e 1846 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
mbed_official 610:813dcc80987e 1847
mbed_official 610:813dcc80987e 1848 hsai->State = HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 1849 }
mbed_official 610:813dcc80987e 1850 HAL_SAI_RxCpltCallback(hsai);
mbed_official 610:813dcc80987e 1851 }
mbed_official 610:813dcc80987e 1852
mbed_official 610:813dcc80987e 1853 /**
mbed_official 610:813dcc80987e 1854 * @brief DMA SAI receive process half complete callback.
mbed_official 610:813dcc80987e 1855 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1856 * the configuration information for the specified DMA module.
mbed_official 610:813dcc80987e 1857 * @retval None
mbed_official 610:813dcc80987e 1858 */
mbed_official 610:813dcc80987e 1859 static void SAI_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 610:813dcc80987e 1860 {
mbed_official 610:813dcc80987e 1861 SAI_HandleTypeDef* hsai = (SAI_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 610:813dcc80987e 1862
mbed_official 610:813dcc80987e 1863 HAL_SAI_RxHalfCpltCallback(hsai);
mbed_official 610:813dcc80987e 1864 }
mbed_official 610:813dcc80987e 1865 /**
mbed_official 610:813dcc80987e 1866 * @brief DMA SAI communication error callback.
mbed_official 610:813dcc80987e 1867 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 610:813dcc80987e 1868 * the configuration information for the specified DMA module.
mbed_official 610:813dcc80987e 1869 * @retval None
mbed_official 610:813dcc80987e 1870 */
mbed_official 610:813dcc80987e 1871 static void SAI_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 610:813dcc80987e 1872 {
mbed_official 610:813dcc80987e 1873 SAI_HandleTypeDef* hsai = ( SAI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 610:813dcc80987e 1874
mbed_official 610:813dcc80987e 1875 /* Stop the DMA transfer */
mbed_official 610:813dcc80987e 1876 HAL_SAI_DMAStop(hsai);
mbed_official 610:813dcc80987e 1877
mbed_official 610:813dcc80987e 1878 /* Set the SAI state ready to be able to start again the process */
mbed_official 610:813dcc80987e 1879 hsai->State= HAL_SAI_STATE_READY;
mbed_official 610:813dcc80987e 1880 HAL_SAI_ErrorCallback(hsai);
mbed_official 610:813dcc80987e 1881 hsai->XferCount = 0;
mbed_official 610:813dcc80987e 1882 }
mbed_official 610:813dcc80987e 1883
mbed_official 610:813dcc80987e 1884 /**
mbed_official 610:813dcc80987e 1885 * @}
mbed_official 610:813dcc80987e 1886 */
mbed_official 610:813dcc80987e 1887
mbed_official 610:813dcc80987e 1888 #endif /* HAL_SAI_MODULE_ENABLED */
mbed_official 610:813dcc80987e 1889 /**
mbed_official 610:813dcc80987e 1890 * @}
mbed_official 610:813dcc80987e 1891 */
mbed_official 610:813dcc80987e 1892
mbed_official 610:813dcc80987e 1893 /**
mbed_official 610:813dcc80987e 1894 * @}
mbed_official 610:813dcc80987e 1895 */
mbed_official 610:813dcc80987e 1896
mbed_official 610:813dcc80987e 1897 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/