mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Fri May 26 12:39:01 2017 +0100
Revision:
165:e614a9f1c9e2
Parent:
161:2cc1468da177
Child:
168:9672193075cf
This updates the lib to the mbed lib v 143

Who changed what in which revision?

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