IOTON Technology / mbed-ton

Fork of mbed-dev by mbed official

Committer:
krebyy
Date:
Thu Jun 29 20:34:04 2017 +0000
Revision:
168:1dc8c8bdd03d
Parent:
167:e84263d55307
First commit - mbed for TON Board V1.2

Who changed what in which revision?

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