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:
Mon Oct 27 09:45:07 2014 +0000
Revision:
369:2e96f1b71984
Parent:
226:b062af740e40
Synchronized with git revision 2d1f64de28cfb25c0e602532e3ce5ad1d9accbed

Full URL: https://github.com/mbedmicro/mbed/commit/2d1f64de28cfb25c0e602532e3ce5ad1d9accbed/

CMSIS: NUCLEO_F401RE - Update STM32Cube driver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 87:085cde657901 1 /**
mbed_official 87:085cde657901 2 ******************************************************************************
mbed_official 87:085cde657901 3 * @file stm32f4xx_hal_sai.c
mbed_official 87:085cde657901 4 * @author MCD Application Team
mbed_official 369:2e96f1b71984 5 * @version V1.1.0
mbed_official 369:2e96f1b71984 6 * @date 19-June-2014
mbed_official 87:085cde657901 7 * @brief SAI HAL module driver.
mbed_official 87:085cde657901 8 * This file provides firmware functions to manage the following
mbed_official 87:085cde657901 9 * functionalities of the Serial Audio Interface (SAI) peripheral:
mbed_official 87:085cde657901 10 * + Initialization/de-initialization functions
mbed_official 87:085cde657901 11 * + I/O operation functions
mbed_official 87:085cde657901 12 * + Peripheral Control functions
mbed_official 87:085cde657901 13 * + Peripheral State functions
mbed_official 87:085cde657901 14 *
mbed_official 87:085cde657901 15 @verbatim
mbed_official 87:085cde657901 16 ==============================================================================
mbed_official 87:085cde657901 17 ##### How to use this driver #####
mbed_official 87:085cde657901 18 ==============================================================================
mbed_official 87:085cde657901 19
mbed_official 87:085cde657901 20 [..]
mbed_official 226:b062af740e40 21 The SAI HAL driver can be used as follows:
mbed_official 87:085cde657901 22
mbed_official 87:085cde657901 23 (#) Declare a SAI_HandleTypeDef handle structure.
mbed_official 226:b062af740e40 24 (#) Initialize the SAI low level resources by implementing the HAL_SAI_MspInit() API:
mbed_official 87:085cde657901 25 (##) Enable the SAI interface clock.
mbed_official 87:085cde657901 26 (##) SAI pins configuration:
mbed_official 87:085cde657901 27 (+++) Enable the clock for the SAI GPIOs.
mbed_official 87:085cde657901 28 (+++) Configure these SAI pins as alternate function pull-up.
mbed_official 87:085cde657901 29 (##) NVIC configuration if you need to use interrupt process (HAL_SAI_Transmit_IT()
mbed_official 87:085cde657901 30 and HAL_SAI_Receive_IT() APIs):
mbed_official 87:085cde657901 31 (+++) Configure the SAI interrupt priority.
mbed_official 87:085cde657901 32 (+++) Enable the NVIC SAI IRQ handle.
mbed_official 87:085cde657901 33
mbed_official 87:085cde657901 34 (##) DMA Configuration if you need to use DMA process (HAL_SAI_Transmit_DMA()
mbed_official 87:085cde657901 35 and HAL_SAI_Receive_DMA() APIs):
mbed_official 87:085cde657901 36 (+++) Declare a DMA handle structure for the Tx/Rx stream.
mbed_official 87:085cde657901 37 (+++) Enable the DMAx interface clock.
mbed_official 87:085cde657901 38 (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
mbed_official 87:085cde657901 39 (+++) Configure the DMA Tx/Rx Stream.
mbed_official 87:085cde657901 40 (+++) Associate the initialized DMA handle to the SAI DMA Tx/Rx handle.
mbed_official 87:085cde657901 41 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the
mbed_official 87:085cde657901 42 DMA Tx/Rx Stream.
mbed_official 87:085cde657901 43
mbed_official 87:085cde657901 44 (#) Program the SAI Mode, Standard, Data Format, MCLK Output, Audio frequency and Polarity
mbed_official 87:085cde657901 45 using HAL_SAI_Init() function.
mbed_official 87:085cde657901 46
mbed_official 87:085cde657901 47 -@- The specific SAI interrupts (FIFO request and Overrun underrun interrupt)
mbed_official 87:085cde657901 48 will be managed using the macros __SAI_ENABLE_IT() and __SAI_DISABLE_IT()
mbed_official 87:085cde657901 49 inside the transmit and receive process.
mbed_official 87:085cde657901 50
mbed_official 87:085cde657901 51 [..]
mbed_official 87:085cde657901 52 (@) Make sure that either:
mbed_official 87:085cde657901 53 (+@) I2S PLL is configured or
mbed_official 87:085cde657901 54 (+@) SAI PLL is configured or
mbed_official 87:085cde657901 55 (+@) External clock source is configured after setting correctly
mbed_official 87:085cde657901 56 the define constant EXTERNAL_CLOCK_VALUE in the stm32f4xx_hal_conf.h file.
mbed_official 87:085cde657901 57
mbed_official 87:085cde657901 58 [..]
mbed_official 226:b062af740e40 59 (@) In master Tx mode: enabling the audio block immediately generates the bit clock
mbed_official 87:085cde657901 60 for the external slaves even if there is no data in the FIFO, However FS signal
mbed_official 87:085cde657901 61 generation is conditioned by the presence of data in the FIFO.
mbed_official 87:085cde657901 62
mbed_official 87:085cde657901 63 [..]
mbed_official 226:b062af740e40 64 (@) In master Rx mode: enabling the audio block immediately generates the bit clock
mbed_official 87:085cde657901 65 and FS signal for the external slaves.
mbed_official 87:085cde657901 66
mbed_official 87:085cde657901 67 [..]
mbed_official 87:085cde657901 68 (@) It is mandatory to respect the following conditions in order to avoid bad SAI behavior:
mbed_official 87:085cde657901 69 (+@) First bit Offset <= (SLOT size - Data size)
mbed_official 87:085cde657901 70 (+@) Data size <= SLOT size
mbed_official 87:085cde657901 71 (+@) Number of SLOT x SLOT size = Frame length
mbed_official 87:085cde657901 72 (+@) The number of slots should be even when SAI_FS_CHANNEL_IDENTIFICATION is selected.
mbed_official 87:085cde657901 73
mbed_official 87:085cde657901 74 [..]
mbed_official 226:b062af740e40 75 Three operation modes are available within this driver :
mbed_official 87:085cde657901 76
mbed_official 87:085cde657901 77 *** Polling mode IO operation ***
mbed_official 87:085cde657901 78 =================================
mbed_official 87:085cde657901 79 [..]
mbed_official 87:085cde657901 80 (+) Send an amount of data in blocking mode using HAL_SAI_Transmit()
mbed_official 87:085cde657901 81 (+) Receive an amount of data in blocking mode using HAL_SAI_Receive()
mbed_official 87:085cde657901 82
mbed_official 87:085cde657901 83 *** Interrupt mode IO operation ***
mbed_official 87:085cde657901 84 ===================================
mbed_official 87:085cde657901 85 [..]
mbed_official 87:085cde657901 86 (+) Send an amount of data in non blocking mode using HAL_SAI_Transmit_IT()
mbed_official 87:085cde657901 87 (+) At transmission end of transfer HAL_SAI_TxCpltCallback is executed and user can
mbed_official 87:085cde657901 88 add his own code by customization of function pointer HAL_SAI_TxCpltCallback
mbed_official 87:085cde657901 89 (+) Receive an amount of data in non blocking mode using HAL_SAI_Receive_IT()
mbed_official 87:085cde657901 90 (+) At reception end of transfer HAL_SAI_RxCpltCallback is executed and user can
mbed_official 87:085cde657901 91 add his own code by customization of function pointer HAL_SAI_RxCpltCallback
mbed_official 87:085cde657901 92 (+) In case of transfer Error, HAL_SAI_ErrorCallback() function is executed and user can
mbed_official 87:085cde657901 93 add his own code by customization of function pointer HAL_SAI_ErrorCallback
mbed_official 87:085cde657901 94
mbed_official 87:085cde657901 95 *** DMA mode IO operation ***
mbed_official 87:085cde657901 96 ==============================
mbed_official 87:085cde657901 97 [..]
mbed_official 87:085cde657901 98 (+) Send an amount of data in non blocking mode (DMA) using HAL_SAI_Transmit_DMA()
mbed_official 87:085cde657901 99 (+) At transmission end of transfer HAL_SAI_TxCpltCallback is executed and user can
mbed_official 87:085cde657901 100 add his own code by customization of function pointer HAL_SAI_TxCpltCallback
mbed_official 87:085cde657901 101 (+) Receive an amount of data in non blocking mode (DMA) using HAL_SAI_Receive_DMA()
mbed_official 87:085cde657901 102 (+) At reception end of transfer HAL_SAI_RxCpltCallback is executed and user can
mbed_official 87:085cde657901 103 add his own code by customization of function pointer HAL_SAI_RxCpltCallback
mbed_official 87:085cde657901 104 (+) In case of transfer Error, HAL_SAI_ErrorCallback() function is executed and user can
mbed_official 87:085cde657901 105 add his own code by customization of function pointer HAL_SAI_ErrorCallback
mbed_official 87:085cde657901 106 (+) Pause the DMA Transfer using HAL_SAI_DMAPause()
mbed_official 87:085cde657901 107 (+) Resume the DMA Transfer using HAL_SAI_DMAResume()
mbed_official 87:085cde657901 108 (+) Stop the DMA Transfer using HAL_SAI_DMAStop()
mbed_official 87:085cde657901 109
mbed_official 87:085cde657901 110 *** SAI HAL driver macros list ***
mbed_official 87:085cde657901 111 =============================================
mbed_official 87:085cde657901 112 [..]
mbed_official 226:b062af740e40 113 Below the list of most used macros in USART HAL driver :
mbed_official 87:085cde657901 114
mbed_official 87:085cde657901 115 (+) __HAL_SAI_ENABLE: Enable the SAI peripheral
mbed_official 87:085cde657901 116 (+) __HAL_SAI_DISABLE: Disable the SAI peripheral
mbed_official 87:085cde657901 117 (+) __HAL_SAI_ENABLE_IT : Enable the specified SAI interrupts
mbed_official 87:085cde657901 118 (+) __HAL_SAI_DISABLE_IT : Disable the specified SAI interrupts
mbed_official 87:085cde657901 119 (+) __HAL_SAI_GET_IT_SOURCE: Check if the specified SAI interrupt source is
mbed_official 87:085cde657901 120 enabled or disabled
mbed_official 87:085cde657901 121 (+) __HAL_SAI_GET_FLAG: Check whether the specified SAI flag is set or not
mbed_official 87:085cde657901 122
mbed_official 87:085cde657901 123 @endverbatim
mbed_official 87:085cde657901 124 ******************************************************************************
mbed_official 87:085cde657901 125 * @attention
mbed_official 87:085cde657901 126 *
mbed_official 87:085cde657901 127 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 87:085cde657901 128 *
mbed_official 87:085cde657901 129 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 87:085cde657901 130 * are permitted provided that the following conditions are met:
mbed_official 87:085cde657901 131 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 87:085cde657901 132 * this list of conditions and the following disclaimer.
mbed_official 87:085cde657901 133 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 87:085cde657901 134 * this list of conditions and the following disclaimer in the documentation
mbed_official 87:085cde657901 135 * and/or other materials provided with the distribution.
mbed_official 87:085cde657901 136 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 87:085cde657901 137 * may be used to endorse or promote products derived from this software
mbed_official 87:085cde657901 138 * without specific prior written permission.
mbed_official 87:085cde657901 139 *
mbed_official 87:085cde657901 140 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 87:085cde657901 141 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 87:085cde657901 142 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 87:085cde657901 143 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 87:085cde657901 144 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 87:085cde657901 145 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 87:085cde657901 146 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 87:085cde657901 147 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 87:085cde657901 148 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 87:085cde657901 149 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 87:085cde657901 150 *
mbed_official 87:085cde657901 151 ******************************************************************************
mbed_official 87:085cde657901 152 */
mbed_official 87:085cde657901 153
mbed_official 87:085cde657901 154 /* Includes ------------------------------------------------------------------*/
mbed_official 87:085cde657901 155 #include "stm32f4xx_hal.h"
mbed_official 87:085cde657901 156
mbed_official 87:085cde657901 157 /** @addtogroup STM32F4xx_HAL_Driver
mbed_official 87:085cde657901 158 * @{
mbed_official 87:085cde657901 159 */
mbed_official 87:085cde657901 160
mbed_official 87:085cde657901 161 /** @defgroup SAI
mbed_official 87:085cde657901 162 * @brief SAI HAL module driver
mbed_official 87:085cde657901 163 * @{
mbed_official 87:085cde657901 164 */
mbed_official 87:085cde657901 165
mbed_official 87:085cde657901 166 #ifdef HAL_SAI_MODULE_ENABLED
mbed_official 87:085cde657901 167
mbed_official 87:085cde657901 168 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
mbed_official 87:085cde657901 169
mbed_official 87:085cde657901 170 /* Private typedef -----------------------------------------------------------*/
mbed_official 87:085cde657901 171 /* Private define ------------------------------------------------------------*/
mbed_official 87:085cde657901 172 /* SAI registers Masks */
mbed_official 87:085cde657901 173 #define CR1_CLEAR_MASK ((uint32_t)0xFF07C010)
mbed_official 87:085cde657901 174 #define FRCR_CLEAR_MASK ((uint32_t)0xFFF88000)
mbed_official 87:085cde657901 175 #define SLOTR_CLEAR_MASK ((uint32_t)0x0000F020)
mbed_official 87:085cde657901 176
mbed_official 369:2e96f1b71984 177 #define SAI_TIMEOUT_VALUE 10
mbed_official 87:085cde657901 178 /* Private macro -------------------------------------------------------------*/
mbed_official 87:085cde657901 179 /* Private variables ---------------------------------------------------------*/
mbed_official 87:085cde657901 180 /* Private function prototypes -----------------------------------------------*/
mbed_official 87:085cde657901 181 static void SAI_DMATxCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 182 static void SAI_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 183 static void SAI_DMARxCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 184 static void SAI_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 185 static void SAI_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 186
mbed_official 87:085cde657901 187 /* Private functions ---------------------------------------------------------*/
mbed_official 87:085cde657901 188
mbed_official 87:085cde657901 189 /** @defgroup SAI_Private_Functions
mbed_official 87:085cde657901 190 * @{
mbed_official 87:085cde657901 191 */
mbed_official 87:085cde657901 192
mbed_official 87:085cde657901 193 /** @defgroup SAI_Group1 Initialization and de-initialization functions
mbed_official 87:085cde657901 194 * @brief Initialization and Configuration functions
mbed_official 87:085cde657901 195 *
mbed_official 87:085cde657901 196 @verbatim
mbed_official 87:085cde657901 197 ===============================================================================
mbed_official 87:085cde657901 198 ##### Initialization and de-initialization functions #####
mbed_official 87:085cde657901 199 ===============================================================================
mbed_official 87:085cde657901 200 [..] This subsection provides a set of functions allowing to initialize and
mbed_official 87:085cde657901 201 de-initialize the SAIx peripheral:
mbed_official 87:085cde657901 202
mbed_official 226:b062af740e40 203 (+) User must implement HAL_SAI_MspInit() function in which he configures
mbed_official 87:085cde657901 204 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).
mbed_official 87:085cde657901 205
mbed_official 87:085cde657901 206 (+) Call the function HAL_SAI_Init() to configure the selected device with
mbed_official 87:085cde657901 207 the selected configuration:
mbed_official 87:085cde657901 208 (++) Mode (Master/slave TX/RX)
mbed_official 87:085cde657901 209 (++) Protocol
mbed_official 87:085cde657901 210 (++) Data Size
mbed_official 87:085cde657901 211 (++) MCLK Output
mbed_official 87:085cde657901 212 (++) Audio frequency
mbed_official 87:085cde657901 213 (++) FIFO Threshold
mbed_official 87:085cde657901 214 (++) Frame Config
mbed_official 87:085cde657901 215 (++) Slot Config
mbed_official 87:085cde657901 216
mbed_official 87:085cde657901 217 (+) Call the function HAL_SAI_DeInit() to restore the default configuration
mbed_official 87:085cde657901 218 of the selected SAI peripheral.
mbed_official 87:085cde657901 219
mbed_official 87:085cde657901 220 @endverbatim
mbed_official 87:085cde657901 221 * @{
mbed_official 87:085cde657901 222 */
mbed_official 87:085cde657901 223
mbed_official 87:085cde657901 224 /**
mbed_official 87:085cde657901 225 * @brief Initializes the SAI according to the specified parameters
mbed_official 87:085cde657901 226 * in the SAI_InitTypeDef and create the associated handle.
mbed_official 226:b062af740e40 227 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 228 * the configuration information for SAI module.
mbed_official 87:085cde657901 229 * @retval HAL status
mbed_official 87:085cde657901 230 */
mbed_official 87:085cde657901 231 HAL_StatusTypeDef HAL_SAI_Init(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 232 {
mbed_official 87:085cde657901 233 uint32_t tmpreg = 0;
mbed_official 87:085cde657901 234 uint32_t tmpclock = 0, tmp2clock = 0;
mbed_official 87:085cde657901 235 /* This variable used to store the VCO Input (value in Hz) */
mbed_official 87:085cde657901 236 uint32_t vcoinput = 0;
mbed_official 87:085cde657901 237 /* This variable used to store the SAI_CK_x (value in Hz) */
mbed_official 87:085cde657901 238 uint32_t saiclocksource = 0;
mbed_official 87:085cde657901 239
mbed_official 87:085cde657901 240 /* Check the SAI handle allocation */
mbed_official 87:085cde657901 241 if(hsai == NULL)
mbed_official 87:085cde657901 242 {
mbed_official 87:085cde657901 243 return HAL_ERROR;
mbed_official 87:085cde657901 244 }
mbed_official 87:085cde657901 245
mbed_official 87:085cde657901 246 /* Check the SAI Block parameters */
mbed_official 87:085cde657901 247 assert_param(IS_SAI_BLOCK_PROTOCOL(hsai->Init.Protocol));
mbed_official 87:085cde657901 248 assert_param(IS_SAI_BLOCK_MODE(hsai->Init.AudioMode));
mbed_official 87:085cde657901 249 assert_param(IS_SAI_BLOCK_DATASIZE(hsai->Init.DataSize));
mbed_official 87:085cde657901 250 assert_param(IS_SAI_BLOCK_FIRST_BIT(hsai->Init.FirstBit));
mbed_official 87:085cde657901 251 assert_param(IS_SAI_BLOCK_CLOCK_STROBING(hsai->Init.ClockStrobing));
mbed_official 87:085cde657901 252 assert_param(IS_SAI_BLOCK_SYNCHRO(hsai->Init.Synchro));
mbed_official 87:085cde657901 253 assert_param(IS_SAI_BLOCK_OUTPUT_DRIVE(hsai->Init.OutputDrive));
mbed_official 87:085cde657901 254 assert_param(IS_SAI_BLOCK_NODIVIDER(hsai->Init.NoDivider));
mbed_official 87:085cde657901 255 assert_param(IS_SAI_BLOCK_FIFO_THRESHOLD(hsai->Init.FIFOThreshold));
mbed_official 87:085cde657901 256 assert_param(IS_SAI_AUDIO_FREQUENCY(hsai->Init.AudioFrequency));
mbed_official 87:085cde657901 257
mbed_official 87:085cde657901 258 /* Check the SAI Block Frame parameters */
mbed_official 87:085cde657901 259 assert_param(IS_SAI_BLOCK_FRAME_LENGTH(hsai->FrameInit.FrameLength));
mbed_official 87:085cde657901 260 assert_param(IS_SAI_BLOCK_ACTIVE_FRAME(hsai->FrameInit.ActiveFrameLength));
mbed_official 87:085cde657901 261 assert_param(IS_SAI_BLOCK_FS_DEFINITION(hsai->FrameInit.FSDefinition));
mbed_official 87:085cde657901 262 assert_param(IS_SAI_BLOCK_FS_POLARITY(hsai->FrameInit.FSPolarity));
mbed_official 87:085cde657901 263 assert_param(IS_SAI_BLOCK_FS_OFFSET(hsai->FrameInit.FSOffset));
mbed_official 87:085cde657901 264
mbed_official 87:085cde657901 265 /* Check the SAI Block Slot parameters */
mbed_official 87:085cde657901 266 assert_param(IS_SAI_BLOCK_FIRSTBIT_OFFSET(hsai->SlotInit.FirstBitOffset));
mbed_official 87:085cde657901 267 assert_param(IS_SAI_BLOCK_SLOT_SIZE(hsai->SlotInit.SlotSize));
mbed_official 87:085cde657901 268 assert_param(IS_SAI_BLOCK_SLOT_NUMBER(hsai->SlotInit.SlotNumber));
mbed_official 87:085cde657901 269 assert_param(IS_SAI_SLOT_ACTIVE(hsai->SlotInit.SlotActive));
mbed_official 87:085cde657901 270
mbed_official 87:085cde657901 271 if(hsai->State == HAL_SAI_STATE_RESET)
mbed_official 87:085cde657901 272 {
mbed_official 87:085cde657901 273 /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
mbed_official 87:085cde657901 274 HAL_SAI_MspInit(hsai);
mbed_official 87:085cde657901 275 }
mbed_official 87:085cde657901 276
mbed_official 87:085cde657901 277 hsai->State = HAL_SAI_STATE_BUSY;
mbed_official 87:085cde657901 278
mbed_official 87:085cde657901 279 /* Disable the selected SAI peripheral */
mbed_official 87:085cde657901 280 __HAL_SAI_DISABLE(hsai);
mbed_official 87:085cde657901 281
mbed_official 87:085cde657901 282 /* SAI Block Configuration ------------------------------------------------------------*/
mbed_official 87:085cde657901 283 /* SAI Block_x CR1 Configuration */
mbed_official 87:085cde657901 284 /* Get the SAI Block_x CR1 value */
mbed_official 87:085cde657901 285 tmpreg = hsai->Instance->CR1;
mbed_official 87:085cde657901 286 /* Clear MODE, PRTCFG, DS, LSBFIRST, CKSTR, SYNCEN, OUTDRIV, NODIV, and MCKDIV bits */
mbed_official 87:085cde657901 287 tmpreg &= CR1_CLEAR_MASK;
mbed_official 87:085cde657901 288 /* Configure SAI_Block_x: Audio Protocol, Data Size, first transmitted bit, Clock strobing
mbed_official 87:085cde657901 289 edge, Synchronization mode, Output drive, Master Divider and FIFO level */
mbed_official 87:085cde657901 290 /* Set PRTCFG bits according to Protocol value */
mbed_official 87:085cde657901 291 /* Set DS bits according to DataSize value */
mbed_official 87:085cde657901 292 /* Set LSBFIRST bit according to FirstBit value */
mbed_official 87:085cde657901 293 /* Set CKSTR bit according to ClockStrobing value */
mbed_official 87:085cde657901 294 /* Set SYNCEN bit according to Synchro value */
mbed_official 87:085cde657901 295 /* Set OUTDRIV bit according to OutputDrive value */
mbed_official 87:085cde657901 296 /* Set NODIV bit according to NoDivider value */
mbed_official 87:085cde657901 297 tmpreg |= (uint32_t)(hsai->Init.Protocol |
mbed_official 87:085cde657901 298 hsai->Init.AudioMode |
mbed_official 87:085cde657901 299 hsai->Init.DataSize |
mbed_official 87:085cde657901 300 hsai->Init.FirstBit |
mbed_official 87:085cde657901 301 hsai->Init.ClockStrobing |
mbed_official 87:085cde657901 302 hsai->Init.Synchro |
mbed_official 87:085cde657901 303 hsai->Init.OutputDrive |
mbed_official 87:085cde657901 304 hsai->Init.NoDivider);
mbed_official 87:085cde657901 305 /* Write to SAI_Block_x CR1 */
mbed_official 87:085cde657901 306 hsai->Instance->CR1 = tmpreg;
mbed_official 87:085cde657901 307
mbed_official 87:085cde657901 308 /* SAI Block_x CR2 Configuration */
mbed_official 87:085cde657901 309 /* Get the SAIBlock_x CR2 value */
mbed_official 87:085cde657901 310 tmpreg = hsai->Instance->CR2;
mbed_official 87:085cde657901 311 /* Clear FTH bits */
mbed_official 87:085cde657901 312 tmpreg &= ~(SAI_xCR2_FTH);
mbed_official 87:085cde657901 313 /* Configure the FIFO Level */
mbed_official 87:085cde657901 314 /* Set FTH bits according to SAI_FIFOThreshold value */
mbed_official 87:085cde657901 315 tmpreg |= (uint32_t)(hsai->Init.FIFOThreshold);
mbed_official 87:085cde657901 316 /* Write to SAI_Block_x CR2 */
mbed_official 87:085cde657901 317 hsai->Instance->CR2 = tmpreg;
mbed_official 87:085cde657901 318
mbed_official 87:085cde657901 319 /* SAI Block_x Frame Configuration -----------------------------------------*/
mbed_official 87:085cde657901 320 /* Get the SAI Block_x FRCR value */
mbed_official 87:085cde657901 321 tmpreg = hsai->Instance->FRCR;
mbed_official 87:085cde657901 322 /* Clear FRL, FSALL, FSDEF, FSPOL, FSOFF bits */
mbed_official 87:085cde657901 323 tmpreg &= FRCR_CLEAR_MASK;
mbed_official 87:085cde657901 324 /* Configure SAI_Block_x Frame: Frame Length, Active Frame Length, Frame Synchronization
mbed_official 87:085cde657901 325 Definition, Frame Synchronization Polarity and Frame Synchronization Polarity */
mbed_official 87:085cde657901 326 /* Set FRL bits according to SAI_FrameLength value */
mbed_official 87:085cde657901 327 /* Set FSALL bits according to SAI_ActiveFrameLength value */
mbed_official 87:085cde657901 328 /* Set FSDEF bit according to SAI_FSDefinition value */
mbed_official 87:085cde657901 329 /* Set FSPOL bit according to SAI_FSPolarity value */
mbed_official 87:085cde657901 330 /* Set FSOFF bit according to SAI_FSOffset value */
mbed_official 87:085cde657901 331 tmpreg |= (uint32_t)((uint32_t)(hsai->FrameInit.FrameLength - 1) |
mbed_official 87:085cde657901 332 hsai->FrameInit.FSOffset |
mbed_official 87:085cde657901 333 hsai->FrameInit.FSDefinition |
mbed_official 87:085cde657901 334 hsai->FrameInit.FSPolarity |
mbed_official 87:085cde657901 335 (uint32_t)((hsai->FrameInit.ActiveFrameLength - 1) << 8));
mbed_official 87:085cde657901 336
mbed_official 87:085cde657901 337 /* Write to SAI_Block_x FRCR */
mbed_official 87:085cde657901 338 hsai->Instance->FRCR = tmpreg;
mbed_official 87:085cde657901 339
mbed_official 87:085cde657901 340 /* SAI Block_x SLOT Configuration ------------------------------------------*/
mbed_official 87:085cde657901 341 /* Get the SAI Block_x SLOTR value */
mbed_official 87:085cde657901 342 tmpreg = hsai->Instance->SLOTR;
mbed_official 87:085cde657901 343 /* Clear FBOFF, SLOTSZ, NBSLOT, SLOTEN bits */
mbed_official 87:085cde657901 344 tmpreg &= SLOTR_CLEAR_MASK;
mbed_official 87:085cde657901 345 /* Configure SAI_Block_x Slot: First bit offset, Slot size, Number of Slot in
mbed_official 87:085cde657901 346 audio frame and slots activated in audio frame */
mbed_official 87:085cde657901 347 /* Set FBOFF bits according to SAI_FirstBitOffset value */
mbed_official 87:085cde657901 348 /* Set SLOTSZ bits according to SAI_SlotSize value */
mbed_official 87:085cde657901 349 /* Set NBSLOT bits according to SAI_SlotNumber value */
mbed_official 87:085cde657901 350 /* Set SLOTEN bits according to SAI_SlotActive value */
mbed_official 87:085cde657901 351 tmpreg |= (uint32_t)(hsai->SlotInit.FirstBitOffset |
mbed_official 87:085cde657901 352 hsai->SlotInit.SlotSize |
mbed_official 87:085cde657901 353 hsai->SlotInit.SlotActive |
mbed_official 87:085cde657901 354 (uint32_t)((hsai->SlotInit.SlotNumber - 1) << 8));
mbed_official 87:085cde657901 355
mbed_official 87:085cde657901 356 /* Write to SAI_Block_x SLOTR */
mbed_official 87:085cde657901 357 hsai->Instance->SLOTR = tmpreg;
mbed_official 87:085cde657901 358
mbed_official 87:085cde657901 359 /* SAI Block_x Clock Configuration -----------------------------------------*/
mbed_official 87:085cde657901 360 /* Check the Clock parameters */
mbed_official 87:085cde657901 361 assert_param(IS_SAI_CLK_SOURCE(hsai->Init.ClockSource));
mbed_official 87:085cde657901 362
mbed_official 87:085cde657901 363 /* SAI Block clock source selection */
mbed_official 87:085cde657901 364 if(hsai->Instance == SAI1_Block_A)
mbed_official 87:085cde657901 365 {
mbed_official 87:085cde657901 366 __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(hsai->Init.ClockSource);
mbed_official 87:085cde657901 367 }
mbed_official 87:085cde657901 368 else
mbed_official 87:085cde657901 369 {
mbed_official 87:085cde657901 370 __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG((uint32_t)(hsai->Init.ClockSource << 2));
mbed_official 87:085cde657901 371 }
mbed_official 87:085cde657901 372
mbed_official 87:085cde657901 373 /* VCO Input Clock value calculation */
mbed_official 87:085cde657901 374 if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI)
mbed_official 87:085cde657901 375 {
mbed_official 87:085cde657901 376 /* In Case the PLL Source is HSI (Internal Clock) */
mbed_official 87:085cde657901 377 vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM));
mbed_official 87:085cde657901 378 }
mbed_official 87:085cde657901 379 else
mbed_official 87:085cde657901 380 {
mbed_official 87:085cde657901 381 /* In Case the PLL Source is HSE (External Clock) */
mbed_official 87:085cde657901 382 vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)));
mbed_official 87:085cde657901 383 }
mbed_official 87:085cde657901 384
mbed_official 87:085cde657901 385 /* SAI_CLK_x : SAI Block Clock configuration for different clock sources selected */
mbed_official 87:085cde657901 386 if(hsai->Init.ClockSource == SAI_CLKSOURCE_PLLSAI)
mbed_official 87:085cde657901 387 {
mbed_official 87:085cde657901 388 /* Configure the PLLI2S division factor */
mbed_official 87:085cde657901 389 /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */
mbed_official 87:085cde657901 390 /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */
mbed_official 87:085cde657901 391 /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */
mbed_official 87:085cde657901 392 tmpreg = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24;
mbed_official 87:085cde657901 393 saiclocksource = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6))/(tmpreg);
mbed_official 87:085cde657901 394
mbed_official 87:085cde657901 395 /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */
mbed_official 87:085cde657901 396 tmpreg = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8) + 1);
mbed_official 87:085cde657901 397 saiclocksource = saiclocksource/(tmpreg);
mbed_official 87:085cde657901 398
mbed_official 87:085cde657901 399 }
mbed_official 87:085cde657901 400 else if(hsai->Init.ClockSource == SAI_CLKSOURCE_PLLI2S)
mbed_official 87:085cde657901 401 {
mbed_official 87:085cde657901 402 /* Configure the PLLI2S division factor */
mbed_official 87:085cde657901 403 /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */
mbed_official 87:085cde657901 404 /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */
mbed_official 87:085cde657901 405 /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */
mbed_official 87:085cde657901 406 tmpreg = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24;
mbed_official 87:085cde657901 407 saiclocksource = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6))/(tmpreg);
mbed_official 87:085cde657901 408
mbed_official 87:085cde657901 409 /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */
mbed_official 87:085cde657901 410 tmpreg = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1);
mbed_official 87:085cde657901 411 saiclocksource = saiclocksource/(tmpreg);
mbed_official 87:085cde657901 412 }
mbed_official 87:085cde657901 413 else /* sConfig->ClockSource == SAI_CLKSource_Ext */
mbed_official 87:085cde657901 414 {
mbed_official 87:085cde657901 415 /* Enable the External Clock selection */
mbed_official 87:085cde657901 416 __HAL_RCC_I2SCLK(RCC_I2SCLKSOURCE_EXT);
mbed_official 87:085cde657901 417
mbed_official 87:085cde657901 418 saiclocksource = EXTERNAL_CLOCK_VALUE;
mbed_official 87:085cde657901 419 }
mbed_official 87:085cde657901 420
mbed_official 87:085cde657901 421 /* Configure Master Clock using the following formula :
mbed_official 87:085cde657901 422 MCLK_x = SAI_CK_x / (MCKDIV[3:0] * 2) with MCLK_x = 256 * FS
mbed_official 87:085cde657901 423 FS = SAI_CK_x / (MCKDIV[3:0] * 2) * 256
mbed_official 87:085cde657901 424 MCKDIV[3:0] = SAI_CK_x / FS * 512 */
mbed_official 87:085cde657901 425 if(hsai->Init.NoDivider == SAI_MASTERDIVIDER_ENABLED)
mbed_official 87:085cde657901 426 {
mbed_official 87:085cde657901 427 /* (saiclocksource x 10) to keep Significant digits */
mbed_official 87:085cde657901 428 tmpclock = (((saiclocksource * 10) / ((hsai->Init.AudioFrequency) * 512)));
mbed_official 87:085cde657901 429
mbed_official 87:085cde657901 430 /* Get the result of modulo division */
mbed_official 87:085cde657901 431 tmp2clock = (tmpclock % 10);
mbed_official 87:085cde657901 432
mbed_official 87:085cde657901 433 /* Round result to the nearest integer*/
mbed_official 87:085cde657901 434 if (tmp2clock > 8)
mbed_official 87:085cde657901 435 {
mbed_official 87:085cde657901 436 tmpclock = ((tmpclock / 10) + 1);
mbed_official 87:085cde657901 437 }
mbed_official 87:085cde657901 438 else
mbed_official 87:085cde657901 439 {
mbed_official 87:085cde657901 440 tmpclock = (tmpclock / 10);
mbed_official 87:085cde657901 441 }
mbed_official 87:085cde657901 442 /*Set MCKDIV value in CR1 register*/
mbed_official 87:085cde657901 443 hsai->Instance->CR1 |= (tmpclock << 20);
mbed_official 87:085cde657901 444
mbed_official 106:ced8cbb51063 445 }
mbed_official 87:085cde657901 446
mbed_official 87:085cde657901 447 /* Initialise the error code */
mbed_official 87:085cde657901 448 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
mbed_official 106:ced8cbb51063 449
mbed_official 87:085cde657901 450 /* Initialize the SAI state */
mbed_official 87:085cde657901 451 hsai->State= HAL_SAI_STATE_READY;
mbed_official 106:ced8cbb51063 452
mbed_official 87:085cde657901 453 return HAL_OK;
mbed_official 87:085cde657901 454 }
mbed_official 87:085cde657901 455
mbed_official 87:085cde657901 456 /**
mbed_official 87:085cde657901 457 * @brief DeInitializes the SAI peripheral.
mbed_official 226:b062af740e40 458 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 459 * the configuration information for SAI module.
mbed_official 87:085cde657901 460 * @retval HAL status
mbed_official 87:085cde657901 461 */
mbed_official 87:085cde657901 462 HAL_StatusTypeDef HAL_SAI_DeInit(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 463 {
mbed_official 87:085cde657901 464 /* Check the SAI handle allocation */
mbed_official 87:085cde657901 465 if(hsai == NULL)
mbed_official 87:085cde657901 466 {
mbed_official 87:085cde657901 467 return HAL_ERROR;
mbed_official 87:085cde657901 468 }
mbed_official 106:ced8cbb51063 469
mbed_official 87:085cde657901 470 hsai->State = HAL_SAI_STATE_BUSY;
mbed_official 106:ced8cbb51063 471
mbed_official 87:085cde657901 472 /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */
mbed_official 87:085cde657901 473 HAL_SAI_MspDeInit(hsai);
mbed_official 87:085cde657901 474
mbed_official 87:085cde657901 475 /* Initialize the error code */
mbed_official 87:085cde657901 476 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
mbed_official 87:085cde657901 477
mbed_official 87:085cde657901 478 /* Initialize the SAI state */
mbed_official 87:085cde657901 479 hsai->State = HAL_SAI_STATE_RESET;
mbed_official 106:ced8cbb51063 480
mbed_official 106:ced8cbb51063 481 /* Release Lock */
mbed_official 106:ced8cbb51063 482 __HAL_UNLOCK(hsai);
mbed_official 106:ced8cbb51063 483
mbed_official 87:085cde657901 484 return HAL_OK;
mbed_official 87:085cde657901 485 }
mbed_official 87:085cde657901 486
mbed_official 87:085cde657901 487 /**
mbed_official 87:085cde657901 488 * @brief SAI MSP Init.
mbed_official 226:b062af740e40 489 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 490 * the configuration information for SAI module.
mbed_official 87:085cde657901 491 * @retval None
mbed_official 87:085cde657901 492 */
mbed_official 87:085cde657901 493 __weak void HAL_SAI_MspInit(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 494 {
mbed_official 87:085cde657901 495 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 496 the HAL_SAI_MspInit could be implemented in the user file
mbed_official 87:085cde657901 497 */
mbed_official 87:085cde657901 498 }
mbed_official 87:085cde657901 499
mbed_official 87:085cde657901 500 /**
mbed_official 87:085cde657901 501 * @brief SAI MSP DeInit.
mbed_official 226:b062af740e40 502 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 503 * the configuration information for SAI module.
mbed_official 87:085cde657901 504 * @retval None
mbed_official 87:085cde657901 505 */
mbed_official 87:085cde657901 506 __weak void HAL_SAI_MspDeInit(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 507 {
mbed_official 87:085cde657901 508 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 509 the HAL_SAI_MspDeInit could be implemented in the user file
mbed_official 87:085cde657901 510 */
mbed_official 87:085cde657901 511 }
mbed_official 87:085cde657901 512
mbed_official 87:085cde657901 513 /**
mbed_official 87:085cde657901 514 * @}
mbed_official 87:085cde657901 515 */
mbed_official 87:085cde657901 516
mbed_official 87:085cde657901 517 /** @defgroup SAI_Group2 IO operation functions
mbed_official 87:085cde657901 518 * @brief Data transfers functions
mbed_official 87:085cde657901 519 *
mbed_official 87:085cde657901 520 @verbatim
mbed_official 87:085cde657901 521 ===============================================================================
mbed_official 87:085cde657901 522 ##### IO operation functions #####
mbed_official 87:085cde657901 523 ===============================================================================
mbed_official 87:085cde657901 524 [..]
mbed_official 87:085cde657901 525 This subsection provides a set of functions allowing to manage the SAI data
mbed_official 87:085cde657901 526 transfers.
mbed_official 87:085cde657901 527
mbed_official 226:b062af740e40 528 (+) There are two modes of transfer:
mbed_official 87:085cde657901 529 (++) Blocking mode : The communication is performed in the polling mode.
mbed_official 87:085cde657901 530 The status of all data processing is returned by the same function
mbed_official 87:085cde657901 531 after finishing transfer.
mbed_official 87:085cde657901 532 (++) No-Blocking mode : The communication is performed using Interrupts
mbed_official 87:085cde657901 533 or DMA. These functions return the status of the transfer startup.
mbed_official 87:085cde657901 534 The end of the data processing will be indicated through the
mbed_official 87:085cde657901 535 dedicated SAI IRQ when using Interrupt mode or the DMA IRQ when
mbed_official 87:085cde657901 536 using DMA mode.
mbed_official 87:085cde657901 537
mbed_official 87:085cde657901 538 (+) Blocking mode functions are :
mbed_official 87:085cde657901 539 (++) HAL_SAI_Transmit()
mbed_official 87:085cde657901 540 (++) HAL_SAI_Receive()
mbed_official 87:085cde657901 541 (++) HAL_SAI_TransmitReceive()
mbed_official 87:085cde657901 542
mbed_official 226:b062af740e40 543 (+) Non Blocking mode functions with Interrupt are :
mbed_official 87:085cde657901 544 (++) HAL_SAI_Transmit_IT()
mbed_official 87:085cde657901 545 (++) HAL_SAI_Receive_IT()
mbed_official 87:085cde657901 546 (++) HAL_SAI_TransmitReceive_IT()
mbed_official 87:085cde657901 547
mbed_official 226:b062af740e40 548 (+) Non Blocking mode functions with DMA are :
mbed_official 87:085cde657901 549 (++) HAL_SAI_Transmit_DMA()
mbed_official 87:085cde657901 550 (++) HAL_SAI_Receive_DMA()
mbed_official 87:085cde657901 551 (++) HAL_SAI_TransmitReceive_DMA()
mbed_official 87:085cde657901 552
mbed_official 226:b062af740e40 553 (+) A set of Transfer Complete Callbacks are provided in non Blocking mode:
mbed_official 87:085cde657901 554 (++) HAL_SAI_TxCpltCallback()
mbed_official 87:085cde657901 555 (++) HAL_SAI_RxCpltCallback()
mbed_official 87:085cde657901 556 (++) HAL_SAI_ErrorCallback()
mbed_official 87:085cde657901 557
mbed_official 87:085cde657901 558 @endverbatim
mbed_official 87:085cde657901 559 * @{
mbed_official 87:085cde657901 560 */
mbed_official 87:085cde657901 561
mbed_official 87:085cde657901 562 /**
mbed_official 87:085cde657901 563 * @brief Transmits an amount of data in blocking mode.
mbed_official 226:b062af740e40 564 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 565 * the configuration information for SAI module.
mbed_official 87:085cde657901 566 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 567 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 568 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 569 * @retval HAL status
mbed_official 87:085cde657901 570 */
mbed_official 87:085cde657901 571 HAL_StatusTypeDef HAL_SAI_Transmit(SAI_HandleTypeDef *hsai, uint16_t* pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 572 {
mbed_official 369:2e96f1b71984 573 uint32_t tickstart = 0;
mbed_official 87:085cde657901 574
mbed_official 87:085cde657901 575 if((pData == NULL ) || (Size == 0))
mbed_official 87:085cde657901 576 {
mbed_official 87:085cde657901 577 return HAL_ERROR;
mbed_official 87:085cde657901 578 }
mbed_official 87:085cde657901 579
mbed_official 87:085cde657901 580 if(hsai->State == HAL_SAI_STATE_READY)
mbed_official 87:085cde657901 581 {
mbed_official 87:085cde657901 582 /* Process Locked */
mbed_official 87:085cde657901 583 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 584
mbed_official 87:085cde657901 585 hsai->State = HAL_SAI_STATE_BUSY_TX;
mbed_official 87:085cde657901 586
mbed_official 87:085cde657901 587 /* Check if the SAI is already enabled */
mbed_official 87:085cde657901 588 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != SAI_xCR1_SAIEN)
mbed_official 87:085cde657901 589 {
mbed_official 87:085cde657901 590 /* Enable SAI peripheral */
mbed_official 87:085cde657901 591 __HAL_SAI_ENABLE(hsai);
mbed_official 87:085cde657901 592 }
mbed_official 87:085cde657901 593
mbed_official 87:085cde657901 594 while(Size > 0)
mbed_official 87:085cde657901 595 {
mbed_official 369:2e96f1b71984 596 /* Get tick */
mbed_official 369:2e96f1b71984 597 tickstart = HAL_GetTick();
mbed_official 369:2e96f1b71984 598
mbed_official 87:085cde657901 599 /* Wait the FIFO to be empty */
mbed_official 87:085cde657901 600 while(__HAL_SAI_GET_FLAG(hsai, SAI_xSR_FREQ) == RESET)
mbed_official 87:085cde657901 601 {
mbed_official 87:085cde657901 602 /* Check for the Timeout */
mbed_official 87:085cde657901 603 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 604 {
mbed_official 369:2e96f1b71984 605 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 369:2e96f1b71984 606 {
mbed_official 87:085cde657901 607 /* Update error code */
mbed_official 87:085cde657901 608 hsai->ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
mbed_official 87:085cde657901 609
mbed_official 87:085cde657901 610 /* Process Unlocked */
mbed_official 87:085cde657901 611 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 612
mbed_official 87:085cde657901 613 /* Change the SAI state */
mbed_official 87:085cde657901 614 hsai->State = HAL_SAI_STATE_TIMEOUT;
mbed_official 87:085cde657901 615
mbed_official 87:085cde657901 616 return HAL_TIMEOUT;
mbed_official 87:085cde657901 617 }
mbed_official 87:085cde657901 618 }
mbed_official 87:085cde657901 619 }
mbed_official 87:085cde657901 620 hsai->Instance->DR = (*pData++);
mbed_official 87:085cde657901 621 Size--;
mbed_official 87:085cde657901 622 }
mbed_official 87:085cde657901 623
mbed_official 87:085cde657901 624 hsai->State = HAL_SAI_STATE_READY;
mbed_official 87:085cde657901 625
mbed_official 87:085cde657901 626 /* Process Unlocked */
mbed_official 87:085cde657901 627 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 628
mbed_official 87:085cde657901 629 return HAL_OK;
mbed_official 87:085cde657901 630 }
mbed_official 87:085cde657901 631 else
mbed_official 87:085cde657901 632 {
mbed_official 87:085cde657901 633 return HAL_BUSY;
mbed_official 87:085cde657901 634 }
mbed_official 87:085cde657901 635 }
mbed_official 87:085cde657901 636
mbed_official 87:085cde657901 637 /**
mbed_official 87:085cde657901 638 * @brief Receives an amount of data in blocking mode.
mbed_official 226:b062af740e40 639 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 640 * the configuration information for SAI module.
mbed_official 87:085cde657901 641 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 642 * @param Size: Amount of data to be received
mbed_official 87:085cde657901 643 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 644 * @retval HAL status
mbed_official 87:085cde657901 645 */
mbed_official 87:085cde657901 646 HAL_StatusTypeDef HAL_SAI_Receive(SAI_HandleTypeDef *hsai, uint16_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 647 {
mbed_official 369:2e96f1b71984 648 uint32_t tickstart = 0;
mbed_official 87:085cde657901 649
mbed_official 87:085cde657901 650 if((pData == NULL ) || (Size == 0))
mbed_official 87:085cde657901 651 {
mbed_official 87:085cde657901 652 return HAL_ERROR;
mbed_official 87:085cde657901 653 }
mbed_official 87:085cde657901 654
mbed_official 87:085cde657901 655 if(hsai->State == HAL_SAI_STATE_READY)
mbed_official 87:085cde657901 656 {
mbed_official 87:085cde657901 657 /* Process Locked */
mbed_official 87:085cde657901 658 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 659
mbed_official 87:085cde657901 660 hsai->State = HAL_SAI_STATE_BUSY_RX;
mbed_official 87:085cde657901 661
mbed_official 87:085cde657901 662 /* Check if the SAI is already enabled */
mbed_official 87:085cde657901 663 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != SAI_xCR1_SAIEN)
mbed_official 87:085cde657901 664 {
mbed_official 87:085cde657901 665 /* Enable SAI peripheral */
mbed_official 87:085cde657901 666 __HAL_SAI_ENABLE(hsai);
mbed_official 87:085cde657901 667 }
mbed_official 87:085cde657901 668
mbed_official 87:085cde657901 669 /* Receive data */
mbed_official 87:085cde657901 670 while(Size > 0)
mbed_official 87:085cde657901 671 {
mbed_official 369:2e96f1b71984 672 /* Get tick */
mbed_official 369:2e96f1b71984 673 tickstart = HAL_GetTick();
mbed_official 369:2e96f1b71984 674
mbed_official 87:085cde657901 675 /* Wait until RXNE flag is set */
mbed_official 87:085cde657901 676 while(__HAL_SAI_GET_FLAG(hsai, SAI_xSR_FREQ) == RESET)
mbed_official 87:085cde657901 677 {
mbed_official 87:085cde657901 678 /* Check for the Timeout */
mbed_official 87:085cde657901 679 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 680 {
mbed_official 369:2e96f1b71984 681 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 369:2e96f1b71984 682 {
mbed_official 87:085cde657901 683 /* Update error code */
mbed_official 87:085cde657901 684 hsai->ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
mbed_official 87:085cde657901 685
mbed_official 87:085cde657901 686 /* Process Unlocked */
mbed_official 87:085cde657901 687 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 688
mbed_official 87:085cde657901 689 /* Change the SAI state */
mbed_official 87:085cde657901 690 hsai->State = HAL_SAI_STATE_TIMEOUT;
mbed_official 87:085cde657901 691
mbed_official 87:085cde657901 692 return HAL_TIMEOUT;
mbed_official 87:085cde657901 693 }
mbed_official 87:085cde657901 694 }
mbed_official 87:085cde657901 695 }
mbed_official 87:085cde657901 696
mbed_official 87:085cde657901 697 (*pData++) = hsai->Instance->DR;
mbed_official 87:085cde657901 698 Size--;
mbed_official 87:085cde657901 699 }
mbed_official 87:085cde657901 700
mbed_official 87:085cde657901 701 hsai->State = HAL_SAI_STATE_READY;
mbed_official 87:085cde657901 702
mbed_official 87:085cde657901 703 /* Process Unlocked */
mbed_official 87:085cde657901 704 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 705
mbed_official 87:085cde657901 706 return HAL_OK;
mbed_official 87:085cde657901 707 }
mbed_official 87:085cde657901 708 else
mbed_official 87:085cde657901 709 {
mbed_official 87:085cde657901 710 return HAL_BUSY;
mbed_official 87:085cde657901 711 }
mbed_official 87:085cde657901 712 }
mbed_official 87:085cde657901 713
mbed_official 87:085cde657901 714 /**
mbed_official 87:085cde657901 715 * @brief Transmits an amount of data in no-blocking mode with Interrupt.
mbed_official 226:b062af740e40 716 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 717 * the configuration information for SAI module.
mbed_official 87:085cde657901 718 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 719 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 720 * @retval HAL status
mbed_official 87:085cde657901 721 */
mbed_official 87:085cde657901 722 HAL_StatusTypeDef HAL_SAI_Transmit_IT(SAI_HandleTypeDef *hsai, uint16_t *pData, uint16_t Size)
mbed_official 87:085cde657901 723 {
mbed_official 87:085cde657901 724 if(hsai->State == HAL_SAI_STATE_READY)
mbed_official 87:085cde657901 725 {
mbed_official 87:085cde657901 726 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 727 {
mbed_official 87:085cde657901 728 return HAL_ERROR;
mbed_official 87:085cde657901 729 }
mbed_official 87:085cde657901 730
mbed_official 87:085cde657901 731 hsai->pTxBuffPtr = pData;
mbed_official 87:085cde657901 732 hsai->TxXferSize = Size;
mbed_official 87:085cde657901 733 hsai->TxXferCount = Size;
mbed_official 87:085cde657901 734
mbed_official 87:085cde657901 735 /* Process Locked */
mbed_official 87:085cde657901 736 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 737
mbed_official 87:085cde657901 738 hsai->State = HAL_SAI_STATE_BUSY_TX;
mbed_official 87:085cde657901 739
mbed_official 87:085cde657901 740 /* Transmit data */
mbed_official 87:085cde657901 741 hsai->Instance->DR = (*hsai->pTxBuffPtr++);
mbed_official 87:085cde657901 742 hsai->TxXferCount--;
mbed_official 87:085cde657901 743
mbed_official 87:085cde657901 744 /* Process Unlocked */
mbed_official 87:085cde657901 745 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 746
mbed_official 87:085cde657901 747 /* Enable FRQ and OVRUDR interrupts */
mbed_official 87:085cde657901 748 __HAL_SAI_ENABLE_IT(hsai, (SAI_IT_FREQ | SAI_IT_OVRUDR));
mbed_official 87:085cde657901 749
mbed_official 87:085cde657901 750 /* Check if the SAI is already enabled */
mbed_official 87:085cde657901 751 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != SAI_xCR1_SAIEN)
mbed_official 87:085cde657901 752 {
mbed_official 87:085cde657901 753 /* Enable SAI peripheral */
mbed_official 87:085cde657901 754 __HAL_SAI_ENABLE(hsai);
mbed_official 87:085cde657901 755 }
mbed_official 87:085cde657901 756
mbed_official 87:085cde657901 757
mbed_official 87:085cde657901 758 return HAL_OK;
mbed_official 87:085cde657901 759 }
mbed_official 87:085cde657901 760 else if(hsai->State == HAL_SAI_STATE_BUSY_TX)
mbed_official 87:085cde657901 761 {
mbed_official 87:085cde657901 762 /* Process Locked */
mbed_official 87:085cde657901 763 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 764
mbed_official 87:085cde657901 765 /* Transmit data */
mbed_official 87:085cde657901 766 hsai->Instance->DR = (*hsai->pTxBuffPtr++);
mbed_official 87:085cde657901 767
mbed_official 87:085cde657901 768 hsai->TxXferCount--;
mbed_official 87:085cde657901 769
mbed_official 87:085cde657901 770 if(hsai->TxXferCount == 0)
mbed_official 87:085cde657901 771 {
mbed_official 87:085cde657901 772 /* Disable FREQ and OVRUDR interrupts */
mbed_official 87:085cde657901 773 __HAL_SAI_DISABLE_IT(hsai, (SAI_IT_FREQ | SAI_IT_OVRUDR));
mbed_official 87:085cde657901 774
mbed_official 87:085cde657901 775 hsai->State = HAL_SAI_STATE_READY;
mbed_official 87:085cde657901 776
mbed_official 87:085cde657901 777 HAL_SAI_TxCpltCallback(hsai);
mbed_official 87:085cde657901 778 }
mbed_official 87:085cde657901 779
mbed_official 87:085cde657901 780 /* Process Unlocked */
mbed_official 87:085cde657901 781 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 782
mbed_official 87:085cde657901 783 return HAL_OK;
mbed_official 87:085cde657901 784 }
mbed_official 87:085cde657901 785
mbed_official 87:085cde657901 786 else
mbed_official 87:085cde657901 787 {
mbed_official 87:085cde657901 788 return HAL_BUSY;
mbed_official 87:085cde657901 789 }
mbed_official 87:085cde657901 790 }
mbed_official 87:085cde657901 791
mbed_official 87:085cde657901 792 /**
mbed_official 87:085cde657901 793 * @brief Receives an amount of data in no-blocking mode with Interrupt.
mbed_official 226:b062af740e40 794 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 795 * the configuration information for SAI module.
mbed_official 87:085cde657901 796 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 797 * @param Size: Amount of data to be received
mbed_official 87:085cde657901 798 * @retval HAL status
mbed_official 87:085cde657901 799 */
mbed_official 87:085cde657901 800 HAL_StatusTypeDef HAL_SAI_Receive_IT(SAI_HandleTypeDef *hsai, uint16_t *pData, uint16_t Size)
mbed_official 87:085cde657901 801 {
mbed_official 87:085cde657901 802 if(hsai->State == HAL_SAI_STATE_READY)
mbed_official 87:085cde657901 803 {
mbed_official 87:085cde657901 804 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 805 {
mbed_official 87:085cde657901 806 return HAL_ERROR;
mbed_official 87:085cde657901 807 }
mbed_official 87:085cde657901 808
mbed_official 87:085cde657901 809 hsai->pRxBuffPtr = pData;
mbed_official 87:085cde657901 810 hsai->RxXferSize = Size;
mbed_official 87:085cde657901 811 hsai->RxXferCount = Size;
mbed_official 87:085cde657901 812
mbed_official 87:085cde657901 813 /* Process Locked */
mbed_official 87:085cde657901 814 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 815
mbed_official 87:085cde657901 816 hsai->State = HAL_SAI_STATE_BUSY_RX;
mbed_official 87:085cde657901 817
mbed_official 87:085cde657901 818 /* Enable TXE and OVRUDR interrupts */
mbed_official 87:085cde657901 819 __HAL_SAI_ENABLE_IT(hsai, (SAI_IT_FREQ | SAI_IT_OVRUDR));
mbed_official 87:085cde657901 820
mbed_official 87:085cde657901 821 /* Check if the SAI is already enabled */
mbed_official 87:085cde657901 822 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != SAI_xCR1_SAIEN)
mbed_official 87:085cde657901 823 {
mbed_official 87:085cde657901 824 /* Enable SAI peripheral */
mbed_official 87:085cde657901 825 __HAL_SAI_ENABLE(hsai);
mbed_official 87:085cde657901 826 }
mbed_official 87:085cde657901 827
mbed_official 87:085cde657901 828 /* Process Unlocked */
mbed_official 87:085cde657901 829 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 830
mbed_official 87:085cde657901 831 return HAL_OK;
mbed_official 87:085cde657901 832 }
mbed_official 87:085cde657901 833 else if(hsai->State == HAL_SAI_STATE_BUSY_RX)
mbed_official 87:085cde657901 834 {
mbed_official 87:085cde657901 835 /* Process Locked */
mbed_official 87:085cde657901 836 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 837
mbed_official 87:085cde657901 838 /* Receive data */
mbed_official 87:085cde657901 839 (*hsai->pRxBuffPtr++) = hsai->Instance->DR;
mbed_official 87:085cde657901 840
mbed_official 87:085cde657901 841 hsai->RxXferCount--;
mbed_official 87:085cde657901 842
mbed_official 87:085cde657901 843 if(hsai->RxXferCount == 0)
mbed_official 87:085cde657901 844 {
mbed_official 87:085cde657901 845 /* Disable TXE and OVRUDR interrupts */
mbed_official 87:085cde657901 846 __HAL_SAI_DISABLE_IT(hsai, (SAI_IT_FREQ | SAI_IT_OVRUDR));
mbed_official 87:085cde657901 847
mbed_official 87:085cde657901 848 hsai->State = HAL_SAI_STATE_READY;
mbed_official 87:085cde657901 849 HAL_SAI_RxCpltCallback(hsai);
mbed_official 87:085cde657901 850 }
mbed_official 87:085cde657901 851
mbed_official 87:085cde657901 852 /* Process Unlocked */
mbed_official 87:085cde657901 853 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 854
mbed_official 87:085cde657901 855 return HAL_OK;
mbed_official 87:085cde657901 856 }
mbed_official 87:085cde657901 857
mbed_official 87:085cde657901 858 else
mbed_official 87:085cde657901 859 {
mbed_official 87:085cde657901 860 return HAL_BUSY;
mbed_official 87:085cde657901 861 }
mbed_official 87:085cde657901 862 }
mbed_official 87:085cde657901 863
mbed_official 87:085cde657901 864 /**
mbed_official 87:085cde657901 865 * @brief Pauses the audio stream playing from the Media.
mbed_official 226:b062af740e40 866 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 867 * the configuration information for SAI module.
mbed_official 226:b062af740e40 868 * @retval HAL status
mbed_official 87:085cde657901 869 */
mbed_official 87:085cde657901 870 HAL_StatusTypeDef HAL_SAI_DMAPause(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 871 {
mbed_official 87:085cde657901 872 /* Process Locked */
mbed_official 87:085cde657901 873 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 874
mbed_official 87:085cde657901 875 /* Pause the audio file playing by disabling the SAI DMA requests */
mbed_official 87:085cde657901 876 hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
mbed_official 87:085cde657901 877
mbed_official 87:085cde657901 878
mbed_official 87:085cde657901 879 /* Process Unlocked */
mbed_official 87:085cde657901 880 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 881
mbed_official 87:085cde657901 882 return HAL_OK;
mbed_official 87:085cde657901 883 }
mbed_official 87:085cde657901 884
mbed_official 87:085cde657901 885 /**
mbed_official 87:085cde657901 886 * @brief Resumes the audio stream playing from the Media.
mbed_official 226:b062af740e40 887 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 888 * the configuration information for SAI module.
mbed_official 226:b062af740e40 889 * @retval HAL status
mbed_official 87:085cde657901 890 */
mbed_official 87:085cde657901 891 HAL_StatusTypeDef HAL_SAI_DMAResume(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 892 {
mbed_official 87:085cde657901 893 /* Process Locked */
mbed_official 87:085cde657901 894 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 895
mbed_official 87:085cde657901 896 /* Enable the SAI DMA requests */
mbed_official 87:085cde657901 897 hsai->Instance->CR1 |= SAI_xCR1_DMAEN;
mbed_official 87:085cde657901 898
mbed_official 87:085cde657901 899
mbed_official 87:085cde657901 900 /* If the SAI peripheral is still not enabled, enable it */
mbed_official 87:085cde657901 901 if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == 0)
mbed_official 87:085cde657901 902 {
mbed_official 87:085cde657901 903 /* Enable SAI peripheral */
mbed_official 87:085cde657901 904 __HAL_SAI_ENABLE(hsai);
mbed_official 87:085cde657901 905 }
mbed_official 87:085cde657901 906
mbed_official 87:085cde657901 907 /* Process Unlocked */
mbed_official 87:085cde657901 908 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 909
mbed_official 87:085cde657901 910 return HAL_OK;
mbed_official 87:085cde657901 911 }
mbed_official 87:085cde657901 912
mbed_official 87:085cde657901 913 /**
mbed_official 226:b062af740e40 914 * @brief Stops the audio stream playing from the Media.
mbed_official 226:b062af740e40 915 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 916 * the configuration information for SAI module.
mbed_official 226:b062af740e40 917 * @retval HAL status
mbed_official 87:085cde657901 918 */
mbed_official 87:085cde657901 919 HAL_StatusTypeDef HAL_SAI_DMAStop(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 920 {
mbed_official 87:085cde657901 921 /* Process Locked */
mbed_official 87:085cde657901 922 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 923
mbed_official 87:085cde657901 924 /* Disable the SAI DMA request */
mbed_official 87:085cde657901 925 hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
mbed_official 87:085cde657901 926
mbed_official 106:ced8cbb51063 927 /* Abort the SAI DMA Tx Stream */
mbed_official 106:ced8cbb51063 928 if(hsai->hdmatx != NULL)
mbed_official 106:ced8cbb51063 929 {
mbed_official 106:ced8cbb51063 930 HAL_DMA_Abort(hsai->hdmatx);
mbed_official 106:ced8cbb51063 931 }
mbed_official 106:ced8cbb51063 932 /* Abort the SAI DMA Rx Stream */
mbed_official 106:ced8cbb51063 933 if(hsai->hdmarx != NULL)
mbed_official 106:ced8cbb51063 934 {
mbed_official 106:ced8cbb51063 935 HAL_DMA_Abort(hsai->hdmarx);
mbed_official 106:ced8cbb51063 936 }
mbed_official 106:ced8cbb51063 937
mbed_official 87:085cde657901 938 /* Disable SAI peripheral */
mbed_official 87:085cde657901 939 __HAL_SAI_DISABLE(hsai);
mbed_official 87:085cde657901 940
mbed_official 87:085cde657901 941 hsai->State = HAL_SAI_STATE_READY;
mbed_official 87:085cde657901 942
mbed_official 87:085cde657901 943 /* Process Unlocked */
mbed_official 87:085cde657901 944 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 945
mbed_official 87:085cde657901 946 return HAL_OK;
mbed_official 87:085cde657901 947 }
mbed_official 87:085cde657901 948 /**
mbed_official 87:085cde657901 949 * @brief Transmits an amount of data in no-blocking mode with DMA.
mbed_official 226:b062af740e40 950 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 951 * the configuration information for SAI module.
mbed_official 87:085cde657901 952 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 953 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 954 * @retval HAL status
mbed_official 87:085cde657901 955 */
mbed_official 87:085cde657901 956 HAL_StatusTypeDef HAL_SAI_Transmit_DMA(SAI_HandleTypeDef *hsai, uint16_t *pData, uint16_t Size)
mbed_official 87:085cde657901 957 {
mbed_official 87:085cde657901 958 uint32_t *tmp;
mbed_official 87:085cde657901 959
mbed_official 87:085cde657901 960 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 961 {
mbed_official 87:085cde657901 962 return HAL_ERROR;
mbed_official 87:085cde657901 963 }
mbed_official 87:085cde657901 964
mbed_official 87:085cde657901 965 if(hsai->State == HAL_SAI_STATE_READY)
mbed_official 87:085cde657901 966 {
mbed_official 87:085cde657901 967 hsai->pTxBuffPtr = pData;
mbed_official 87:085cde657901 968 hsai->TxXferSize = Size;
mbed_official 87:085cde657901 969 hsai->TxXferCount = Size;
mbed_official 87:085cde657901 970
mbed_official 87:085cde657901 971 /* Process Locked */
mbed_official 87:085cde657901 972 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 973
mbed_official 87:085cde657901 974 hsai->State = HAL_SAI_STATE_BUSY_TX;
mbed_official 87:085cde657901 975
mbed_official 87:085cde657901 976 /* Set the SAI Tx DMA Half transfert complete callback */
mbed_official 87:085cde657901 977 hsai->hdmatx->XferHalfCpltCallback = SAI_DMATxHalfCplt;
mbed_official 87:085cde657901 978
mbed_official 87:085cde657901 979 /* Set the SAI TxDMA transfer complete callback */
mbed_official 87:085cde657901 980 hsai->hdmatx->XferCpltCallback = SAI_DMATxCplt;
mbed_official 87:085cde657901 981
mbed_official 87:085cde657901 982 /* Set the DMA error callback */
mbed_official 87:085cde657901 983 hsai->hdmatx->XferErrorCallback = SAI_DMAError;
mbed_official 87:085cde657901 984
mbed_official 87:085cde657901 985 /* Enable the Tx DMA Stream */
mbed_official 87:085cde657901 986 tmp = (uint32_t*)&pData;
mbed_official 87:085cde657901 987 HAL_DMA_Start_IT(hsai->hdmatx, *(uint32_t*)tmp, (uint32_t)&hsai->Instance->DR, hsai->TxXferSize);
mbed_official 87:085cde657901 988
mbed_official 87:085cde657901 989 /* Check if the SAI is already enabled */
mbed_official 87:085cde657901 990 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != SAI_xCR1_SAIEN)
mbed_official 87:085cde657901 991 {
mbed_official 87:085cde657901 992 /* Enable SAI peripheral */
mbed_official 87:085cde657901 993 __HAL_SAI_ENABLE(hsai);
mbed_official 87:085cde657901 994 }
mbed_official 87:085cde657901 995
mbed_official 87:085cde657901 996 /* Enable SAI Tx DMA Request */
mbed_official 87:085cde657901 997 hsai->Instance->CR1 |= SAI_xCR1_DMAEN;
mbed_official 87:085cde657901 998
mbed_official 87:085cde657901 999 /* Process Unlocked */
mbed_official 87:085cde657901 1000 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 1001
mbed_official 87:085cde657901 1002 return HAL_OK;
mbed_official 87:085cde657901 1003 }
mbed_official 87:085cde657901 1004 else
mbed_official 87:085cde657901 1005 {
mbed_official 87:085cde657901 1006 return HAL_BUSY;
mbed_official 87:085cde657901 1007 }
mbed_official 87:085cde657901 1008 }
mbed_official 87:085cde657901 1009
mbed_official 87:085cde657901 1010 /**
mbed_official 226:b062af740e40 1011 * @brief Receives an amount of data in no-blocking mode with DMA.
mbed_official 226:b062af740e40 1012 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1013 * the configuration information for SAI module.
mbed_official 87:085cde657901 1014 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 1015 * @param Size: Amount of data to be received
mbed_official 87:085cde657901 1016 * @retval HAL status
mbed_official 87:085cde657901 1017 */
mbed_official 87:085cde657901 1018 HAL_StatusTypeDef HAL_SAI_Receive_DMA(SAI_HandleTypeDef *hsai, uint16_t *pData, uint16_t Size)
mbed_official 87:085cde657901 1019 {
mbed_official 87:085cde657901 1020 uint32_t *tmp;
mbed_official 87:085cde657901 1021
mbed_official 87:085cde657901 1022 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 1023 {
mbed_official 87:085cde657901 1024 return HAL_ERROR;
mbed_official 87:085cde657901 1025 }
mbed_official 87:085cde657901 1026
mbed_official 87:085cde657901 1027 if(hsai->State == HAL_SAI_STATE_READY)
mbed_official 87:085cde657901 1028 {
mbed_official 87:085cde657901 1029 hsai->pRxBuffPtr = pData;
mbed_official 87:085cde657901 1030 hsai->RxXferSize = Size;
mbed_official 87:085cde657901 1031 hsai->RxXferCount = Size;
mbed_official 87:085cde657901 1032
mbed_official 87:085cde657901 1033 /* Process Locked */
mbed_official 87:085cde657901 1034 __HAL_LOCK(hsai);
mbed_official 87:085cde657901 1035
mbed_official 87:085cde657901 1036 hsai->State = HAL_SAI_STATE_BUSY_RX;
mbed_official 87:085cde657901 1037
mbed_official 87:085cde657901 1038 /* Set the SAI Rx DMA Half transfert complete callback */
mbed_official 87:085cde657901 1039 hsai->hdmarx->XferHalfCpltCallback = SAI_DMARxHalfCplt;
mbed_official 87:085cde657901 1040
mbed_official 87:085cde657901 1041 /* Set the SAI Rx DMA transfert complete callback */
mbed_official 87:085cde657901 1042 hsai->hdmarx->XferCpltCallback = SAI_DMARxCplt;
mbed_official 87:085cde657901 1043
mbed_official 87:085cde657901 1044 /* Set the DMA error callback */
mbed_official 87:085cde657901 1045 hsai->hdmarx->XferErrorCallback = SAI_DMAError;
mbed_official 87:085cde657901 1046
mbed_official 87:085cde657901 1047 /* Enable the Rx DMA Stream */
mbed_official 87:085cde657901 1048 tmp = (uint32_t*)&pData;
mbed_official 87:085cde657901 1049 HAL_DMA_Start_IT(hsai->hdmarx, (uint32_t)&hsai->Instance->DR, *(uint32_t*)tmp, hsai->RxXferSize);
mbed_official 87:085cde657901 1050
mbed_official 87:085cde657901 1051 /* Check if the SAI is already enabled */
mbed_official 87:085cde657901 1052 if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != SAI_xCR1_SAIEN)
mbed_official 87:085cde657901 1053 {
mbed_official 87:085cde657901 1054 /* Enable SAI peripheral */
mbed_official 87:085cde657901 1055 __HAL_SAI_ENABLE(hsai);
mbed_official 87:085cde657901 1056 }
mbed_official 87:085cde657901 1057
mbed_official 87:085cde657901 1058 /* Enable SAI Rx DMA Request */
mbed_official 87:085cde657901 1059 hsai->Instance->CR1 |= SAI_xCR1_DMAEN;
mbed_official 87:085cde657901 1060
mbed_official 87:085cde657901 1061 /* Process Unlocked */
mbed_official 87:085cde657901 1062 __HAL_UNLOCK(hsai);
mbed_official 87:085cde657901 1063
mbed_official 87:085cde657901 1064 return HAL_OK;
mbed_official 87:085cde657901 1065 }
mbed_official 87:085cde657901 1066 else
mbed_official 87:085cde657901 1067 {
mbed_official 87:085cde657901 1068 return HAL_BUSY;
mbed_official 87:085cde657901 1069 }
mbed_official 87:085cde657901 1070 }
mbed_official 87:085cde657901 1071
mbed_official 87:085cde657901 1072 /**
mbed_official 87:085cde657901 1073 * @brief This function handles SAI interrupt request.
mbed_official 226:b062af740e40 1074 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1075 * the configuration information for SAI module.
mbed_official 87:085cde657901 1076 * @retval HAL status
mbed_official 87:085cde657901 1077 */
mbed_official 87:085cde657901 1078 void HAL_SAI_IRQHandler(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 1079 {
mbed_official 87:085cde657901 1080 uint32_t tmp1 = 0, tmp2 = 0;
mbed_official 87:085cde657901 1081
mbed_official 87:085cde657901 1082 if(hsai->State == HAL_SAI_STATE_BUSY_RX)
mbed_official 87:085cde657901 1083 {
mbed_official 87:085cde657901 1084 tmp1 = __HAL_SAI_GET_FLAG(hsai, SAI_xSR_FREQ);
mbed_official 87:085cde657901 1085 tmp2 = __HAL_SAI_GET_IT_SOURCE(hsai, SAI_IT_FREQ);
mbed_official 87:085cde657901 1086 /* SAI in mode Receiver --------------------------------------------------*/
mbed_official 87:085cde657901 1087 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 87:085cde657901 1088 {
mbed_official 87:085cde657901 1089 HAL_SAI_Receive_IT(hsai, NULL, 0);
mbed_official 87:085cde657901 1090 }
mbed_official 87:085cde657901 1091
mbed_official 87:085cde657901 1092 tmp1 = __HAL_SAI_GET_FLAG(hsai, SAI_FLAG_OVRUDR);
mbed_official 87:085cde657901 1093 tmp2 = __HAL_SAI_GET_IT_SOURCE(hsai, SAI_IT_OVRUDR);
mbed_official 87:085cde657901 1094 /* SAI Overrun error interrupt occurred ----------------------------------*/
mbed_official 87:085cde657901 1095 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 87:085cde657901 1096 {
mbed_official 87:085cde657901 1097 /* Change the SAI error code */
mbed_official 87:085cde657901 1098 hsai->ErrorCode = HAL_SAI_ERROR_OVR;
mbed_official 87:085cde657901 1099
mbed_official 87:085cde657901 1100 /* Clear the SAI Overrun flag */
mbed_official 87:085cde657901 1101 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
mbed_official 87:085cde657901 1102 /* Set the SAI state ready to be able to start again the process */
mbed_official 87:085cde657901 1103 hsai->State = HAL_SAI_STATE_READY;
mbed_official 87:085cde657901 1104 HAL_SAI_ErrorCallback(hsai);
mbed_official 87:085cde657901 1105 }
mbed_official 87:085cde657901 1106 }
mbed_official 87:085cde657901 1107
mbed_official 87:085cde657901 1108 if(hsai->State == HAL_SAI_STATE_BUSY_TX)
mbed_official 87:085cde657901 1109 {
mbed_official 87:085cde657901 1110 tmp1 = __HAL_SAI_GET_FLAG(hsai, SAI_xSR_FREQ);
mbed_official 87:085cde657901 1111 tmp2 = __HAL_SAI_GET_IT_SOURCE(hsai, SAI_IT_FREQ);
mbed_official 87:085cde657901 1112 /* SAI in mode Transmitter -----------------------------------------------*/
mbed_official 87:085cde657901 1113 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 87:085cde657901 1114 {
mbed_official 87:085cde657901 1115 HAL_SAI_Transmit_IT(hsai, NULL, 0);
mbed_official 87:085cde657901 1116 }
mbed_official 87:085cde657901 1117
mbed_official 87:085cde657901 1118 tmp1 = __HAL_SAI_GET_FLAG(hsai, SAI_FLAG_OVRUDR);
mbed_official 87:085cde657901 1119 tmp2 = __HAL_SAI_GET_IT_SOURCE(hsai, SAI_IT_OVRUDR);
mbed_official 87:085cde657901 1120 /* SAI Underrun error interrupt occurred ---------------------------------*/
mbed_official 87:085cde657901 1121 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 87:085cde657901 1122 {
mbed_official 87:085cde657901 1123 /* Change the SAI error code */
mbed_official 87:085cde657901 1124 hsai->ErrorCode = HAL_SAI_ERROR_UDR;
mbed_official 87:085cde657901 1125
mbed_official 87:085cde657901 1126 /* Clear the SAI Underrun flag */
mbed_official 87:085cde657901 1127 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
mbed_official 87:085cde657901 1128 /* Set the SAI state ready to be able to start again the process */
mbed_official 87:085cde657901 1129 hsai->State = HAL_SAI_STATE_READY;
mbed_official 87:085cde657901 1130 HAL_SAI_ErrorCallback(hsai);
mbed_official 87:085cde657901 1131 }
mbed_official 87:085cde657901 1132 }
mbed_official 87:085cde657901 1133 }
mbed_official 87:085cde657901 1134
mbed_official 87:085cde657901 1135 /**
mbed_official 87:085cde657901 1136 * @brief Tx Transfer completed callbacks.
mbed_official 226:b062af740e40 1137 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1138 * the configuration information for SAI module.
mbed_official 87:085cde657901 1139 * @retval None
mbed_official 87:085cde657901 1140 */
mbed_official 87:085cde657901 1141 __weak void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 1142 {
mbed_official 87:085cde657901 1143 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1144 the HAL_SAI_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 1145 */
mbed_official 87:085cde657901 1146 }
mbed_official 87:085cde657901 1147
mbed_official 87:085cde657901 1148 /**
mbed_official 87:085cde657901 1149 * @brief Tx Transfer Half completed callbacks
mbed_official 226:b062af740e40 1150 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1151 * the configuration information for SAI module.
mbed_official 87:085cde657901 1152 * @retval None
mbed_official 87:085cde657901 1153 */
mbed_official 87:085cde657901 1154 __weak void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 1155 {
mbed_official 87:085cde657901 1156 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1157 the HAL_SAI_TxHalfCpltCallback could be implenetd in the user file
mbed_official 87:085cde657901 1158 */
mbed_official 87:085cde657901 1159 }
mbed_official 87:085cde657901 1160
mbed_official 87:085cde657901 1161 /**
mbed_official 87:085cde657901 1162 * @brief Rx Transfer completed callbacks.
mbed_official 226:b062af740e40 1163 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1164 * the configuration information for SAI module.
mbed_official 87:085cde657901 1165 * @retval None
mbed_official 87:085cde657901 1166 */
mbed_official 87:085cde657901 1167 __weak void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 1168 {
mbed_official 87:085cde657901 1169 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1170 the HAL_SAI_RxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 1171 */
mbed_official 87:085cde657901 1172 }
mbed_official 87:085cde657901 1173
mbed_official 87:085cde657901 1174 /**
mbed_official 87:085cde657901 1175 * @brief Rx Transfer half completed callbacks
mbed_official 226:b062af740e40 1176 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1177 * the configuration information for SAI module.
mbed_official 87:085cde657901 1178 * @retval None
mbed_official 87:085cde657901 1179 */
mbed_official 87:085cde657901 1180 __weak void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 1181 {
mbed_official 87:085cde657901 1182 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1183 the HAL_SAI_RxCpltCallback could be implenetd in the user file
mbed_official 87:085cde657901 1184 */
mbed_official 87:085cde657901 1185 }
mbed_official 87:085cde657901 1186
mbed_official 87:085cde657901 1187 /**
mbed_official 87:085cde657901 1188 * @brief SAI error callbacks.
mbed_official 226:b062af740e40 1189 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1190 * the configuration information for SAI module.
mbed_official 87:085cde657901 1191 * @retval None
mbed_official 87:085cde657901 1192 */
mbed_official 87:085cde657901 1193 __weak void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 1194 {
mbed_official 87:085cde657901 1195 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 1196 the HAL_SAI_ErrorCallback could be implemented in the user file
mbed_official 87:085cde657901 1197 */
mbed_official 87:085cde657901 1198 }
mbed_official 87:085cde657901 1199
mbed_official 87:085cde657901 1200 /**
mbed_official 87:085cde657901 1201 * @}
mbed_official 87:085cde657901 1202 */
mbed_official 87:085cde657901 1203
mbed_official 87:085cde657901 1204
mbed_official 87:085cde657901 1205 /** @defgroup SAI_Group3 Peripheral State functions
mbed_official 87:085cde657901 1206 * @brief Peripheral State functions
mbed_official 87:085cde657901 1207 *
mbed_official 87:085cde657901 1208 @verbatim
mbed_official 87:085cde657901 1209 ===============================================================================
mbed_official 87:085cde657901 1210 ##### Peripheral State and Errors functions #####
mbed_official 87:085cde657901 1211 ===============================================================================
mbed_official 87:085cde657901 1212 [..]
mbed_official 226:b062af740e40 1213 This subsection permits to get in run-time the status of the peripheral
mbed_official 87:085cde657901 1214 and the data flow.
mbed_official 87:085cde657901 1215
mbed_official 87:085cde657901 1216 @endverbatim
mbed_official 87:085cde657901 1217 * @{
mbed_official 87:085cde657901 1218 */
mbed_official 87:085cde657901 1219
mbed_official 87:085cde657901 1220 /**
mbed_official 87:085cde657901 1221 * @brief Returns the SAI state.
mbed_official 226:b062af740e40 1222 * @param hsai: pointer to a SAI_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1223 * the configuration information for SAI module.
mbed_official 87:085cde657901 1224 * @retval HAL state
mbed_official 87:085cde657901 1225 */
mbed_official 87:085cde657901 1226 HAL_SAI_StateTypeDef HAL_SAI_GetState(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 1227 {
mbed_official 87:085cde657901 1228 return hsai->State;
mbed_official 87:085cde657901 1229 }
mbed_official 87:085cde657901 1230
mbed_official 87:085cde657901 1231 /**
mbed_official 87:085cde657901 1232 * @brief Return the SAI error code
mbed_official 87:085cde657901 1233 * @param hsai : pointer to a SAI_HandleTypeDef structure that contains
mbed_official 87:085cde657901 1234 * the configuration information for the specified SAI Block.
mbed_official 87:085cde657901 1235 * @retval SAI Error Code
mbed_official 87:085cde657901 1236 */
mbed_official 87:085cde657901 1237 uint32_t HAL_SAI_GetError(SAI_HandleTypeDef *hsai)
mbed_official 87:085cde657901 1238 {
mbed_official 87:085cde657901 1239 return hsai->ErrorCode;
mbed_official 87:085cde657901 1240 }
mbed_official 87:085cde657901 1241 /**
mbed_official 87:085cde657901 1242 * @}
mbed_official 87:085cde657901 1243 */
mbed_official 87:085cde657901 1244
mbed_official 87:085cde657901 1245 /**
mbed_official 87:085cde657901 1246 * @brief DMA SAI transmit process complete callback.
mbed_official 226:b062af740e40 1247 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1248 * the configuration information for the specified DMA module.
mbed_official 87:085cde657901 1249 * @retval None
mbed_official 87:085cde657901 1250 */
mbed_official 87:085cde657901 1251 static void SAI_DMATxCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 1252 {
mbed_official 369:2e96f1b71984 1253 uint32_t tickstart = 0;
mbed_official 87:085cde657901 1254
mbed_official 106:ced8cbb51063 1255 SAI_HandleTypeDef* hsai = (SAI_HandleTypeDef*)((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 106:ced8cbb51063 1256
mbed_official 106:ced8cbb51063 1257 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
mbed_official 106:ced8cbb51063 1258 {
mbed_official 106:ced8cbb51063 1259 hsai->TxXferCount = 0;
mbed_official 106:ced8cbb51063 1260 hsai->RxXferCount = 0;
mbed_official 106:ced8cbb51063 1261
mbed_official 106:ced8cbb51063 1262 /* Disable SAI Tx DMA Request */
mbed_official 106:ced8cbb51063 1263 hsai->Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
mbed_official 106:ced8cbb51063 1264
mbed_official 369:2e96f1b71984 1265 /* Get tick */
mbed_official 369:2e96f1b71984 1266 tickstart = HAL_GetTick();
mbed_official 369:2e96f1b71984 1267
mbed_official 106:ced8cbb51063 1268 /* Set timeout: 10 is the max delay to send the remaining data in the SAI FIFO */
mbed_official 106:ced8cbb51063 1269 /* Wait until FIFO is empty */
mbed_official 106:ced8cbb51063 1270 while(__HAL_SAI_GET_FLAG(hsai, SAI_xSR_FLVL) != RESET)
mbed_official 106:ced8cbb51063 1271 {
mbed_official 106:ced8cbb51063 1272 /* Check for the Timeout */
mbed_official 369:2e96f1b71984 1273 if((HAL_GetTick() - tickstart ) > SAI_TIMEOUT_VALUE)
mbed_official 106:ced8cbb51063 1274 {
mbed_official 106:ced8cbb51063 1275 /* Update error code */
mbed_official 106:ced8cbb51063 1276 hsai->ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
mbed_official 106:ced8cbb51063 1277
mbed_official 106:ced8cbb51063 1278 /* Change the SAI state */
mbed_official 106:ced8cbb51063 1279 HAL_SAI_ErrorCallback(hsai);
mbed_official 106:ced8cbb51063 1280 }
mbed_official 106:ced8cbb51063 1281 }
mbed_official 106:ced8cbb51063 1282
mbed_official 106:ced8cbb51063 1283 hsai->State= HAL_SAI_STATE_READY;
mbed_official 106:ced8cbb51063 1284 }
mbed_official 87:085cde657901 1285 HAL_SAI_TxCpltCallback(hsai);
mbed_official 87:085cde657901 1286 }
mbed_official 87:085cde657901 1287
mbed_official 87:085cde657901 1288 /**
mbed_official 87:085cde657901 1289 * @brief DMA SAI transmit process half complete callback
mbed_official 226:b062af740e40 1290 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1291 * the configuration information for the specified DMA module.
mbed_official 87:085cde657901 1292 * @retval None
mbed_official 87:085cde657901 1293 */
mbed_official 87:085cde657901 1294 static void SAI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 1295 {
mbed_official 87:085cde657901 1296 SAI_HandleTypeDef* hsai = (SAI_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 1297
mbed_official 87:085cde657901 1298 HAL_SAI_TxHalfCpltCallback(hsai);
mbed_official 87:085cde657901 1299 }
mbed_official 87:085cde657901 1300
mbed_official 87:085cde657901 1301 /**
mbed_official 87:085cde657901 1302 * @brief DMA SAI receive process complete callback.
mbed_official 226:b062af740e40 1303 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1304 * the configuration information for the specified DMA module.
mbed_official 87:085cde657901 1305 * @retval None
mbed_official 87:085cde657901 1306 */
mbed_official 87:085cde657901 1307 static void SAI_DMARxCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 1308 {
mbed_official 87:085cde657901 1309 SAI_HandleTypeDef* hsai = ( SAI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 106:ced8cbb51063 1310 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
mbed_official 106:ced8cbb51063 1311 {
mbed_official 106:ced8cbb51063 1312 /* Disable Rx DMA Request */
mbed_official 106:ced8cbb51063 1313 hsai->Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
mbed_official 106:ced8cbb51063 1314 hsai->RxXferCount = 0;
mbed_official 106:ced8cbb51063 1315
mbed_official 106:ced8cbb51063 1316 hsai->State = HAL_SAI_STATE_READY;
mbed_official 106:ced8cbb51063 1317 }
mbed_official 87:085cde657901 1318 HAL_SAI_RxCpltCallback(hsai);
mbed_official 87:085cde657901 1319 }
mbed_official 87:085cde657901 1320
mbed_official 87:085cde657901 1321 /**
mbed_official 87:085cde657901 1322 * @brief DMA SAI receive process half complete callback
mbed_official 226:b062af740e40 1323 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1324 * the configuration information for the specified DMA module.
mbed_official 87:085cde657901 1325 * @retval None
mbed_official 87:085cde657901 1326 */
mbed_official 87:085cde657901 1327 static void SAI_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 1328 {
mbed_official 87:085cde657901 1329 SAI_HandleTypeDef* hsai = (SAI_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 87:085cde657901 1330
mbed_official 87:085cde657901 1331 HAL_SAI_RxHalfCpltCallback(hsai);
mbed_official 87:085cde657901 1332 }
mbed_official 87:085cde657901 1333 /**
mbed_official 87:085cde657901 1334 * @brief DMA SAI communication error callback.
mbed_official 226:b062af740e40 1335 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 226:b062af740e40 1336 * the configuration information for the specified DMA module.
mbed_official 87:085cde657901 1337 * @retval None
mbed_official 87:085cde657901 1338 */
mbed_official 87:085cde657901 1339 static void SAI_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 1340 {
mbed_official 87:085cde657901 1341 SAI_HandleTypeDef* hsai = ( SAI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 87:085cde657901 1342 /* Set the SAI state ready to be able to start again the process */
mbed_official 87:085cde657901 1343 hsai->State= HAL_SAI_STATE_READY;
mbed_official 87:085cde657901 1344 HAL_SAI_ErrorCallback(hsai);
mbed_official 87:085cde657901 1345
mbed_official 87:085cde657901 1346 hsai->TxXferCount = 0;
mbed_official 87:085cde657901 1347 hsai->RxXferCount = 0;
mbed_official 87:085cde657901 1348 }
mbed_official 87:085cde657901 1349
mbed_official 87:085cde657901 1350 /**
mbed_official 87:085cde657901 1351 * @}
mbed_official 87:085cde657901 1352 */
mbed_official 87:085cde657901 1353
mbed_official 87:085cde657901 1354 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
mbed_official 87:085cde657901 1355 #endif /* HAL_SAI_MODULE_ENABLED */
mbed_official 87:085cde657901 1356 /**
mbed_official 87:085cde657901 1357 * @}
mbed_official 87:085cde657901 1358 */
mbed_official 87:085cde657901 1359
mbed_official 87:085cde657901 1360 /**
mbed_official 87:085cde657901 1361 * @}
mbed_official 87:085cde657901 1362 */
mbed_official 87:085cde657901 1363
mbed_official 87:085cde657901 1364 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/