Modified version of the mbed library for use with the Nucleo boards.

Dependents:   EEPROMWrite Full-Project

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

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