mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Sat Feb 08 19:45:06 2014 +0000
Revision:
87:085cde657901
Child:
106:ced8cbb51063
Synchronized with git revision 9272cdeb45ec7e6077641536509413da8fd2ebc2

Full URL: https://github.com/mbedmicro/mbed/commit/9272cdeb45ec7e6077641536509413da8fd2ebc2/

Add NUCLEO_F401RE, improvements

Who changed what in which revision?

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