mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

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****/