mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Thu Jul 02 16:30:08 2015 +0100
Revision:
581:39197bcd20f2
Parent:
532:fe11edbda85c
Child:
613:bc40b8d2aec4
Synchronized with git revision ae2d3cdffe70184eb8736d94f76c45c93f4b7724

Full URL: https://github.com/mbedmicro/mbed/commit/ae2d3cdffe70184eb8736d94f76c45c93f4b7724/

Make it possible to build the core mbed library with yotta

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 532:fe11edbda85c 5 * @version V1.3.0
mbed_official 532:fe11edbda85c 6 * @date 09-March-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 384:ef87175507f1 323 if(hsai == HAL_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 384:ef87175507f1 451 if(hsai == HAL_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 384:ef87175507f1 571 if((pData == HAL_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 384:ef87175507f1 667 if((pData == HAL_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 384:ef87175507f1 761 if((pData == HAL_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 384:ef87175507f1 824 if((pData == HAL_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 384:ef87175507f1 933 if(hsai->hdmatx != HAL_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 384:ef87175507f1 938 if(hsai->hdmarx != HAL_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 532:fe11edbda85c 966 if(hsai->hdmatx != HAL_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 532:fe11edbda85c 971 if(hsai->hdmarx != HAL_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 384:ef87175507f1 1006 if((pData == HAL_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 384:ef87175507f1 1071 if((pData == HAL_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****/