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