added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Mon Mar 07 10:00:14 2016 +0000
Revision:
83:a036322b8637
Parent:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Synchronized with git revision ee20d03969aa5c570152f88e8f3d8a4739eed40b

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

[STM32F7] Update STM32F7Cube_FW version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**
bogdanm 0:9b334a45a8ff 2 ******************************************************************************
bogdanm 0:9b334a45a8ff 3 * @file stm32f7xx_hal_spdifrx.c
bogdanm 0:9b334a45a8ff 4 * @author MCD Application Team
mbed_official 83:a036322b8637 5 * @version V1.0.4
mbed_official 83:a036322b8637 6 * @date 09-December-2015
bogdanm 0:9b334a45a8ff 7 * @brief This file provides firmware functions to manage the following
bogdanm 0:9b334a45a8ff 8 * functionalities of the SPDIFRX audio interface:
bogdanm 0:9b334a45a8ff 9 * + Initialization and Configuration
bogdanm 0:9b334a45a8ff 10 * + Data transfers functions
bogdanm 0:9b334a45a8ff 11 * + DMA transfers management
bogdanm 0:9b334a45a8ff 12 * + Interrupts and flags management
bogdanm 0:9b334a45a8ff 13 @verbatim
bogdanm 0:9b334a45a8ff 14 ===============================================================================
bogdanm 0:9b334a45a8ff 15 ##### How to use this driver #####
bogdanm 0:9b334a45a8ff 16 ===============================================================================
bogdanm 0:9b334a45a8ff 17 [..]
bogdanm 0:9b334a45a8ff 18 The SPDIFRX HAL driver can be used as follow:
bogdanm 0:9b334a45a8ff 19
bogdanm 0:9b334a45a8ff 20 (#) Declare SPDIFRX_HandleTypeDef handle structure.
bogdanm 0:9b334a45a8ff 21 (#) Initialize the SPDIFRX low level resources by implement the HAL_SPDIFRX_MspInit() API:
bogdanm 0:9b334a45a8ff 22 (##) Enable the SPDIFRX interface clock.
bogdanm 0:9b334a45a8ff 23 (##) SPDIFRX pins configuration:
bogdanm 0:9b334a45a8ff 24 (+++) Enable the clock for the SPDIFRX GPIOs.
bogdanm 0:9b334a45a8ff 25 (+++) Configure these SPDIFRX pins as alternate function pull-up.
bogdanm 0:9b334a45a8ff 26 (##) NVIC configuration if you need to use interrupt process (HAL_SPDIFRX_ReceiveControlFlow_IT() and HAL_SPDIFRX_ReceiveDataFlow_IT() API's).
bogdanm 0:9b334a45a8ff 27 (+++) Configure the SPDIFRX interrupt priority.
bogdanm 0:9b334a45a8ff 28 (+++) Enable the NVIC SPDIFRX IRQ handle.
bogdanm 0:9b334a45a8ff 29 (##) DMA Configuration if you need to use DMA process (HAL_SPDIFRX_ReceiveDataFlow_DMA() and HAL_SPDIFRX_ReceiveControlFlow_DMA() API's).
bogdanm 0:9b334a45a8ff 30 (+++) Declare a DMA handle structure for the reception of the Data Flow channel.
bogdanm 0:9b334a45a8ff 31 (+++) Declare a DMA handle structure for the reception of the Control Flow channel.
bogdanm 0:9b334a45a8ff 32 (+++) Enable the DMAx interface clock.
bogdanm 0:9b334a45a8ff 33 (+++) Configure the declared DMA handle structure CtrlRx/DataRx with the required parameters.
bogdanm 0:9b334a45a8ff 34 (+++) Configure the DMA Channel.
bogdanm 0:9b334a45a8ff 35 (+++) Associate the initialized DMA handle to the SPDIFRX DMA CtrlRx/DataRx handle.
bogdanm 0:9b334a45a8ff 36 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the
bogdanm 0:9b334a45a8ff 37 DMA CtrlRx/DataRx channel.
bogdanm 0:9b334a45a8ff 38
bogdanm 0:9b334a45a8ff 39 (#) Program the input selection, re-tries number, wait for activity, channel status selection, data format, stereo mode and masking of user bits
bogdanm 0:9b334a45a8ff 40 using HAL_SPDIFRX_Init() function.
bogdanm 0:9b334a45a8ff 41
bogdanm 0:9b334a45a8ff 42 -@- The specific SPDIFRX interrupts (RXNE/CSRNE and Error Interrupts) will be managed using the macros
bogdanm 0:9b334a45a8ff 43 __SPDIFRX_ENABLE_IT() and __SPDIFRX_DISABLE_IT() inside the receive process.
bogdanm 0:9b334a45a8ff 44 -@- Make sure that ck_spdif clock is configured.
bogdanm 0:9b334a45a8ff 45
bogdanm 0:9b334a45a8ff 46 (#) Three operation modes are available within this driver :
bogdanm 0:9b334a45a8ff 47
bogdanm 0:9b334a45a8ff 48 *** Polling mode for reception operation (for debug purpose) ***
bogdanm 0:9b334a45a8ff 49 ================================================================
bogdanm 0:9b334a45a8ff 50 [..]
bogdanm 0:9b334a45a8ff 51 (+) Receive data flow in blocking mode using HAL_SPDIFRX_ReceiveDataFlow()
bogdanm 0:9b334a45a8ff 52 (+) Receive control flow of data in blocking mode using HAL_SPDIFRX_ReceiveControlFlow()
bogdanm 0:9b334a45a8ff 53
bogdanm 0:9b334a45a8ff 54 *** Interrupt mode for reception operation ***
bogdanm 0:9b334a45a8ff 55 =========================================
bogdanm 0:9b334a45a8ff 56 [..]
bogdanm 0:9b334a45a8ff 57 (+) Receive an amount of data (Data Flow) in non blocking mode using HAL_SPDIFRX_ReceiveDataFlow_IT()
bogdanm 0:9b334a45a8ff 58 (+) Receive an amount of data (Control Flow) in non blocking mode using HAL_SPDIFRX_ReceiveControlFlow_IT()
bogdanm 0:9b334a45a8ff 59 (+) At reception end of half transfer HAL_SPDIFRX_RxHalfCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 60 add his own code by customization of function pointer HAL_SPDIFRX_RxHalfCpltCallback
bogdanm 0:9b334a45a8ff 61 (+) At reception end of transfer HAL_SPDIFRX_RxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 62 add his own code by customization of function pointer HAL_SPDIFRX_RxCpltCallback
bogdanm 0:9b334a45a8ff 63 (+) In case of transfer Error, HAL_SPDIFRX_ErrorCallback() function is executed and user can
bogdanm 0:9b334a45a8ff 64 add his own code by customization of function pointer HAL_SPDIFRX_ErrorCallback
bogdanm 0:9b334a45a8ff 65
bogdanm 0:9b334a45a8ff 66 *** DMA mode for reception operation ***
bogdanm 0:9b334a45a8ff 67 ========================================
bogdanm 0:9b334a45a8ff 68 [..]
bogdanm 0:9b334a45a8ff 69 (+) Receive an amount of data (Data Flow) in non blocking mode (DMA) using HAL_SPDIFRX_ReceiveDataFlow_DMA()
bogdanm 0:9b334a45a8ff 70 (+) Receive an amount of data (Control Flow) in non blocking mode (DMA) using HAL_SPDIFRX_ReceiveControlFlow_DMA()
bogdanm 0:9b334a45a8ff 71 (+) At reception end of half transfer HAL_SPDIFRX_RxHalfCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 72 add his own code by customization of function pointer HAL_SPDIFRX_RxHalfCpltCallback
bogdanm 0:9b334a45a8ff 73 (+) At reception end of transfer HAL_SPDIFRX_RxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 74 add his own code by customization of function pointer HAL_SPDIFRX_RxCpltCallback
bogdanm 0:9b334a45a8ff 75 (+) In case of transfer Error, HAL_SPDIFRX_ErrorCallback() function is executed and user can
bogdanm 0:9b334a45a8ff 76 add his own code by customization of function pointer HAL_SPDIFRX_ErrorCallback
bogdanm 0:9b334a45a8ff 77 (+) Stop the DMA Transfer using HAL_SPDIFRX_DMAStop()
bogdanm 0:9b334a45a8ff 78
bogdanm 0:9b334a45a8ff 79 *** SPDIFRX HAL driver macros list ***
bogdanm 0:9b334a45a8ff 80 =============================================
bogdanm 0:9b334a45a8ff 81 [..]
bogdanm 0:9b334a45a8ff 82 Below the list of most used macros in USART HAL driver.
bogdanm 0:9b334a45a8ff 83 (+) __HAL_SPDIFRX_IDLE: Disable the specified SPDIFRX peripheral (IDEL State)
bogdanm 0:9b334a45a8ff 84 (+) __HAL_SPDIFRX_SYNC: Enable the synchronization state of the specified SPDIFRX peripheral (SYNC State)
bogdanm 0:9b334a45a8ff 85 (+) __HAL_SPDIFRX_RCV: Enable the receive state of the specified SPDIFRX peripheral (RCV State)
bogdanm 0:9b334a45a8ff 86 (+) __HAL_SPDIFRX_ENABLE_IT : Enable the specified SPDIFRX interrupts
bogdanm 0:9b334a45a8ff 87 (+) __HAL_SPDIFRX_DISABLE_IT : Disable the specified SPDIFRX interrupts
bogdanm 0:9b334a45a8ff 88 (+) __HAL_SPDIFRX_GET_FLAG: Check whether the specified SPDIFRX flag is set or not.
bogdanm 0:9b334a45a8ff 89
bogdanm 0:9b334a45a8ff 90 [..]
bogdanm 0:9b334a45a8ff 91 (@) You can refer to the SPDIFRX HAL driver header file for more useful macros
bogdanm 0:9b334a45a8ff 92
bogdanm 0:9b334a45a8ff 93 @endverbatim
bogdanm 0:9b334a45a8ff 94 ******************************************************************************
bogdanm 0:9b334a45a8ff 95 * @attention
bogdanm 0:9b334a45a8ff 96 *
bogdanm 0:9b334a45a8ff 97 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
bogdanm 0:9b334a45a8ff 98 *
bogdanm 0:9b334a45a8ff 99 * Redistribution and use in source and binary forms, with or without modification,
bogdanm 0:9b334a45a8ff 100 * are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 101 * 1. Redistributions of source code must retain the above copyright notice,
bogdanm 0:9b334a45a8ff 102 * this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 103 * 2. Redistributions in binary form must reproduce the above copyright notice,
bogdanm 0:9b334a45a8ff 104 * this list of conditions and the following disclaimer in the documentation
bogdanm 0:9b334a45a8ff 105 * and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 106 * 3. Neither the name of STMicroelectronics nor the names of its contributors
bogdanm 0:9b334a45a8ff 107 * may be used to endorse or promote products derived from this software
bogdanm 0:9b334a45a8ff 108 * without specific prior written permission.
bogdanm 0:9b334a45a8ff 109 *
bogdanm 0:9b334a45a8ff 110 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 111 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 112 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bogdanm 0:9b334a45a8ff 113 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bogdanm 0:9b334a45a8ff 114 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bogdanm 0:9b334a45a8ff 115 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bogdanm 0:9b334a45a8ff 116 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bogdanm 0:9b334a45a8ff 117 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bogdanm 0:9b334a45a8ff 118 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bogdanm 0:9b334a45a8ff 119 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 120 *
bogdanm 0:9b334a45a8ff 121 ******************************************************************************
bogdanm 0:9b334a45a8ff 122 */
bogdanm 0:9b334a45a8ff 123
bogdanm 0:9b334a45a8ff 124 /* Includes ------------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 125 #include "stm32f7xx_hal.h"
bogdanm 0:9b334a45a8ff 126
bogdanm 0:9b334a45a8ff 127 /** @addtogroup STM32F7xx_HAL_Driver
bogdanm 0:9b334a45a8ff 128 * @{
bogdanm 0:9b334a45a8ff 129 */
bogdanm 0:9b334a45a8ff 130 /** @defgroup SPDIFRX SPDIFRX
bogdanm 0:9b334a45a8ff 131 * @brief SPDIFRX HAL module driver
bogdanm 0:9b334a45a8ff 132 * @{
bogdanm 0:9b334a45a8ff 133 */
bogdanm 0:9b334a45a8ff 134
bogdanm 0:9b334a45a8ff 135 #ifdef HAL_SPDIFRX_MODULE_ENABLED
bogdanm 0:9b334a45a8ff 136
bogdanm 0:9b334a45a8ff 137 /* Private typedef -----------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 138 /* Private define ------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 139 #define SPDIFRX_TIMEOUT_VALUE 0xFFFF
bogdanm 0:9b334a45a8ff 140
bogdanm 0:9b334a45a8ff 141 /* Private macro -------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 142 /* Private variables ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 143 /* Private function prototypes -----------------------------------------------*/
bogdanm 0:9b334a45a8ff 144 /** @addtogroup SPDIFRX_Private_Functions
bogdanm 0:9b334a45a8ff 145 * @{
bogdanm 0:9b334a45a8ff 146 */
bogdanm 0:9b334a45a8ff 147 static void SPDIFRX_DMARxCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 148 static void SPDIFRX_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 149 static void SPDIFRX_DMACxCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 150 static void SPDIFRX_DMACxHalfCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 151 static void SPDIFRX_DMAError(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 152 static void SPDIFRX_ReceiveControlFlow_IT(SPDIFRX_HandleTypeDef *hspdif);
bogdanm 0:9b334a45a8ff 153 static void SPDIFRX_ReceiveDataFlow_IT(SPDIFRX_HandleTypeDef *hspdif);
bogdanm 0:9b334a45a8ff 154 static HAL_StatusTypeDef SPDIFRX_WaitOnFlagUntilTimeout(SPDIFRX_HandleTypeDef *hspdif, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 155 /**
bogdanm 0:9b334a45a8ff 156 * @}
bogdanm 0:9b334a45a8ff 157 */
bogdanm 0:9b334a45a8ff 158 /* Exported functions ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 159
bogdanm 0:9b334a45a8ff 160 /** @defgroup SPDIFRX_Exported_Functions SPDIFRX Exported Functions
bogdanm 0:9b334a45a8ff 161 * @{
bogdanm 0:9b334a45a8ff 162 */
bogdanm 0:9b334a45a8ff 163
bogdanm 0:9b334a45a8ff 164 /** @defgroup SPDIFRX_Exported_Functions_Group1 Initialization and de-initialization functions
bogdanm 0:9b334a45a8ff 165 * @brief Initialization and Configuration functions
bogdanm 0:9b334a45a8ff 166 *
bogdanm 0:9b334a45a8ff 167 @verbatim
bogdanm 0:9b334a45a8ff 168 ===============================================================================
bogdanm 0:9b334a45a8ff 169 ##### Initialization and de-initialization functions #####
bogdanm 0:9b334a45a8ff 170 ===============================================================================
bogdanm 0:9b334a45a8ff 171 [..] This subsection provides a set of functions allowing to initialize and
bogdanm 0:9b334a45a8ff 172 de-initialize the SPDIFRX peripheral:
bogdanm 0:9b334a45a8ff 173
bogdanm 0:9b334a45a8ff 174 (+) User must Implement HAL_SPDIFRX_MspInit() function in which he configures
bogdanm 0:9b334a45a8ff 175 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).
bogdanm 0:9b334a45a8ff 176
bogdanm 0:9b334a45a8ff 177 (+) Call the function HAL_SPDIFRX_Init() to configure the SPDIFRX peripheral with
bogdanm 0:9b334a45a8ff 178 the selected configuration:
bogdanm 0:9b334a45a8ff 179 (++) Input Selection (IN0, IN1,...)
bogdanm 0:9b334a45a8ff 180 (++) Maximum allowed re-tries during synchronization phase
bogdanm 0:9b334a45a8ff 181 (++) Wait for activity on SPDIF selected input
bogdanm 0:9b334a45a8ff 182 (++) Channel status selection (from channel A or B)
bogdanm 0:9b334a45a8ff 183 (++) Data format (LSB, MSB, ...)
bogdanm 0:9b334a45a8ff 184 (++) Stereo mode
bogdanm 0:9b334a45a8ff 185 (++) User bits masking (PT,C,U,V,...)
bogdanm 0:9b334a45a8ff 186
bogdanm 0:9b334a45a8ff 187 (+) Call the function HAL_SPDIFRX_DeInit() to restore the default configuration
bogdanm 0:9b334a45a8ff 188 of the selected SPDIFRXx peripheral.
bogdanm 0:9b334a45a8ff 189 @endverbatim
bogdanm 0:9b334a45a8ff 190 * @{
bogdanm 0:9b334a45a8ff 191 */
bogdanm 0:9b334a45a8ff 192
bogdanm 0:9b334a45a8ff 193 /**
bogdanm 0:9b334a45a8ff 194 * @brief Initializes the SPDIFRX according to the specified parameters
bogdanm 0:9b334a45a8ff 195 * in the SPDIFRX_InitTypeDef and create the associated handle.
bogdanm 0:9b334a45a8ff 196 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 197 * @retval HAL status
bogdanm 0:9b334a45a8ff 198 */
bogdanm 0:9b334a45a8ff 199 HAL_StatusTypeDef HAL_SPDIFRX_Init(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 200 {
bogdanm 0:9b334a45a8ff 201 uint32_t tmpreg = 0;
bogdanm 0:9b334a45a8ff 202
bogdanm 0:9b334a45a8ff 203 /* Check the SPDIFRX handle allocation */
bogdanm 0:9b334a45a8ff 204 if(hspdif == NULL)
bogdanm 0:9b334a45a8ff 205 {
bogdanm 0:9b334a45a8ff 206 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 207 }
bogdanm 0:9b334a45a8ff 208
bogdanm 0:9b334a45a8ff 209 /* Check the SPDIFRX parameters */
bogdanm 0:9b334a45a8ff 210 assert_param(IS_STEREO_MODE(hspdif->Init.StereoMode));
bogdanm 0:9b334a45a8ff 211 assert_param(IS_SPDIFRX_INPUT_SELECT(hspdif->Init.InputSelection));
bogdanm 0:9b334a45a8ff 212 assert_param(IS_SPDIFRX_MAX_RETRIES(hspdif->Init.Retries));
bogdanm 0:9b334a45a8ff 213 assert_param(IS_SPDIFRX_WAIT_FOR_ACTIVITY(hspdif->Init.WaitForActivity));
bogdanm 0:9b334a45a8ff 214 assert_param(IS_SPDIFRX_CHANNEL(hspdif->Init.ChannelSelection));
bogdanm 0:9b334a45a8ff 215 assert_param(IS_SPDIFRX_DATA_FORMAT(hspdif->Init.DataFormat));
bogdanm 0:9b334a45a8ff 216 assert_param(IS_PREAMBLE_TYPE_MASK(hspdif->Init.PreambleTypeMask));
bogdanm 0:9b334a45a8ff 217 assert_param(IS_CHANNEL_STATUS_MASK(hspdif->Init.ChannelStatusMask));
bogdanm 0:9b334a45a8ff 218 assert_param(IS_VALIDITY_MASK(hspdif->Init.ValidityBitMask));
bogdanm 0:9b334a45a8ff 219 assert_param(IS_PARITY_ERROR_MASK(hspdif->Init.ParityErrorMask));
bogdanm 0:9b334a45a8ff 220
bogdanm 0:9b334a45a8ff 221 if(hspdif->State == HAL_SPDIFRX_STATE_RESET)
bogdanm 0:9b334a45a8ff 222 {
bogdanm 0:9b334a45a8ff 223 /* Allocate lock resource and initialize it */
bogdanm 0:9b334a45a8ff 224 hspdif->Lock = HAL_UNLOCKED;
bogdanm 0:9b334a45a8ff 225 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
bogdanm 0:9b334a45a8ff 226 HAL_SPDIFRX_MspInit(hspdif);
bogdanm 0:9b334a45a8ff 227 }
bogdanm 0:9b334a45a8ff 228
bogdanm 0:9b334a45a8ff 229 /* SPDIFRX peripheral state is BUSY*/
bogdanm 0:9b334a45a8ff 230 hspdif->State = HAL_SPDIFRX_STATE_BUSY;
bogdanm 0:9b334a45a8ff 231
bogdanm 0:9b334a45a8ff 232 /* Disable SPDIFRX interface (IDLE State) */
bogdanm 0:9b334a45a8ff 233 __HAL_SPDIFRX_IDLE(hspdif);
bogdanm 0:9b334a45a8ff 234
bogdanm 0:9b334a45a8ff 235 /* Reset the old SPDIFRX CR configuration */
bogdanm 0:9b334a45a8ff 236 tmpreg = hspdif->Instance->CR;
bogdanm 0:9b334a45a8ff 237
bogdanm 0:9b334a45a8ff 238 tmpreg &= ~((uint16_t) SPDIFRX_CR_RXSTEO | SPDIFRX_CR_DRFMT | SPDIFRX_CR_PMSK |
bogdanm 0:9b334a45a8ff 239 SPDIFRX_CR_VMSK | SPDIFRX_CR_CUMSK | SPDIFRX_CR_PTMSK |
bogdanm 0:9b334a45a8ff 240 SPDIFRX_CR_CHSEL | SPDIFRX_CR_NBTR | SPDIFRX_CR_WFA |
bogdanm 0:9b334a45a8ff 241 SPDIFRX_CR_INSEL);
bogdanm 0:9b334a45a8ff 242
bogdanm 0:9b334a45a8ff 243 /* Sets the new configuration of the SPDIFRX peripheral */
bogdanm 0:9b334a45a8ff 244 tmpreg |= ((uint16_t) hspdif->Init.StereoMode |
bogdanm 0:9b334a45a8ff 245 hspdif->Init.InputSelection |
bogdanm 0:9b334a45a8ff 246 hspdif->Init.Retries |
bogdanm 0:9b334a45a8ff 247 hspdif->Init.WaitForActivity |
bogdanm 0:9b334a45a8ff 248 hspdif->Init.ChannelSelection |
bogdanm 0:9b334a45a8ff 249 hspdif->Init.DataFormat |
bogdanm 0:9b334a45a8ff 250 hspdif->Init.PreambleTypeMask |
bogdanm 0:9b334a45a8ff 251 hspdif->Init.ChannelStatusMask |
bogdanm 0:9b334a45a8ff 252 hspdif->Init.ValidityBitMask |
bogdanm 0:9b334a45a8ff 253 hspdif->Init.ParityErrorMask);
bogdanm 0:9b334a45a8ff 254
bogdanm 0:9b334a45a8ff 255 hspdif->Instance->CR = tmpreg;
bogdanm 0:9b334a45a8ff 256
bogdanm 0:9b334a45a8ff 257 hspdif->ErrorCode = HAL_SPDIFRX_ERROR_NONE;
bogdanm 0:9b334a45a8ff 258
bogdanm 0:9b334a45a8ff 259 /* SPDIFRX peripheral state is READY*/
bogdanm 0:9b334a45a8ff 260 hspdif->State = HAL_SPDIFRX_STATE_READY;
bogdanm 0:9b334a45a8ff 261
bogdanm 0:9b334a45a8ff 262 return HAL_OK;
bogdanm 0:9b334a45a8ff 263 }
bogdanm 0:9b334a45a8ff 264
bogdanm 0:9b334a45a8ff 265 /**
bogdanm 0:9b334a45a8ff 266 * @brief DeInitializes the SPDIFRX peripheral
bogdanm 0:9b334a45a8ff 267 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 268 * @retval HAL status
bogdanm 0:9b334a45a8ff 269 */
bogdanm 0:9b334a45a8ff 270 HAL_StatusTypeDef HAL_SPDIFRX_DeInit(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 271 {
bogdanm 0:9b334a45a8ff 272 /* Check the SPDIFRX handle allocation */
bogdanm 0:9b334a45a8ff 273 if(hspdif == NULL)
bogdanm 0:9b334a45a8ff 274 {
bogdanm 0:9b334a45a8ff 275 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 276 }
bogdanm 0:9b334a45a8ff 277
bogdanm 0:9b334a45a8ff 278 /* Check the parameters */
bogdanm 0:9b334a45a8ff 279 assert_param(IS_SPDIFRX_ALL_INSTANCE(hspdif->Instance));
bogdanm 0:9b334a45a8ff 280
bogdanm 0:9b334a45a8ff 281 hspdif->State = HAL_SPDIFRX_STATE_BUSY;
bogdanm 0:9b334a45a8ff 282
bogdanm 0:9b334a45a8ff 283 /* Disable SPDIFRX interface (IDLE state) */
bogdanm 0:9b334a45a8ff 284 __HAL_SPDIFRX_IDLE(hspdif);
bogdanm 0:9b334a45a8ff 285
bogdanm 0:9b334a45a8ff 286 /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */
bogdanm 0:9b334a45a8ff 287 HAL_SPDIFRX_MspDeInit(hspdif);
bogdanm 0:9b334a45a8ff 288
bogdanm 0:9b334a45a8ff 289 hspdif->ErrorCode = HAL_SPDIFRX_ERROR_NONE;
bogdanm 0:9b334a45a8ff 290
bogdanm 0:9b334a45a8ff 291 /* SPDIFRX peripheral state is RESET*/
bogdanm 0:9b334a45a8ff 292 hspdif->State = HAL_SPDIFRX_STATE_RESET;
bogdanm 0:9b334a45a8ff 293
bogdanm 0:9b334a45a8ff 294 /* Release Lock */
bogdanm 0:9b334a45a8ff 295 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 296
bogdanm 0:9b334a45a8ff 297 return HAL_OK;
bogdanm 0:9b334a45a8ff 298 }
bogdanm 0:9b334a45a8ff 299
bogdanm 0:9b334a45a8ff 300 /**
bogdanm 0:9b334a45a8ff 301 * @brief SPDIFRX MSP Init
bogdanm 0:9b334a45a8ff 302 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 303 * @retval None
bogdanm 0:9b334a45a8ff 304 */
bogdanm 0:9b334a45a8ff 305 __weak void HAL_SPDIFRX_MspInit(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 306 {
mbed_official 83:a036322b8637 307 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 308 UNUSED(hspdif);
mbed_official 83:a036322b8637 309
bogdanm 0:9b334a45a8ff 310 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 311 the HAL_SPDIFRX_MspInit could be implemented in the user file
bogdanm 0:9b334a45a8ff 312 */
bogdanm 0:9b334a45a8ff 313 }
bogdanm 0:9b334a45a8ff 314
bogdanm 0:9b334a45a8ff 315 /**
bogdanm 0:9b334a45a8ff 316 * @brief SPDIFRX MSP DeInit
bogdanm 0:9b334a45a8ff 317 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 318 * @retval None
bogdanm 0:9b334a45a8ff 319 */
bogdanm 0:9b334a45a8ff 320 __weak void HAL_SPDIFRX_MspDeInit(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 321 {
mbed_official 83:a036322b8637 322 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 323 UNUSED(hspdif);
mbed_official 83:a036322b8637 324
bogdanm 0:9b334a45a8ff 325 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 326 the HAL_SPDIFRX_MspDeInit could be implemented in the user file
bogdanm 0:9b334a45a8ff 327 */
bogdanm 0:9b334a45a8ff 328 }
bogdanm 0:9b334a45a8ff 329
bogdanm 0:9b334a45a8ff 330 /**
bogdanm 0:9b334a45a8ff 331 * @brief Sets the SPDIFRX dtat format according to the specified parameters
bogdanm 0:9b334a45a8ff 332 * in the SPDIFRX_InitTypeDef.
bogdanm 0:9b334a45a8ff 333 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 334 * @param sDataFormat: SPDIFRX data format
bogdanm 0:9b334a45a8ff 335 * @retval HAL status
bogdanm 0:9b334a45a8ff 336 */
bogdanm 0:9b334a45a8ff 337 HAL_StatusTypeDef HAL_SPDIFRX_SetDataFormat(SPDIFRX_HandleTypeDef *hspdif, SPDIFRX_SetDataFormatTypeDef sDataFormat)
bogdanm 0:9b334a45a8ff 338 {
bogdanm 0:9b334a45a8ff 339 uint32_t tmpreg = 0;
bogdanm 0:9b334a45a8ff 340
bogdanm 0:9b334a45a8ff 341 /* Check the SPDIFRX handle allocation */
bogdanm 0:9b334a45a8ff 342 if(hspdif == NULL)
bogdanm 0:9b334a45a8ff 343 {
bogdanm 0:9b334a45a8ff 344 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 345 }
bogdanm 0:9b334a45a8ff 346
bogdanm 0:9b334a45a8ff 347 /* Check the SPDIFRX parameters */
bogdanm 0:9b334a45a8ff 348 assert_param(IS_STEREO_MODE(sDataFormat.StereoMode));
bogdanm 0:9b334a45a8ff 349 assert_param(IS_SPDIFRX_DATA_FORMAT(sDataFormat.DataFormat));
bogdanm 0:9b334a45a8ff 350 assert_param(IS_PREAMBLE_TYPE_MASK(sDataFormat.PreambleTypeMask));
bogdanm 0:9b334a45a8ff 351 assert_param(IS_CHANNEL_STATUS_MASK(sDataFormat.ChannelStatusMask));
bogdanm 0:9b334a45a8ff 352 assert_param(IS_VALIDITY_MASK(sDataFormat.ValidityBitMask));
bogdanm 0:9b334a45a8ff 353 assert_param(IS_PARITY_ERROR_MASK(sDataFormat.ParityErrorMask));
bogdanm 0:9b334a45a8ff 354
bogdanm 0:9b334a45a8ff 355 /* Reset the old SPDIFRX CR configuration */
bogdanm 0:9b334a45a8ff 356 tmpreg = hspdif->Instance->CR;
bogdanm 0:9b334a45a8ff 357
bogdanm 0:9b334a45a8ff 358 if(((tmpreg & SPDIFRX_STATE_RCV) == SPDIFRX_STATE_RCV) &&
bogdanm 0:9b334a45a8ff 359 (((tmpreg & SPDIFRX_CR_DRFMT) != sDataFormat.DataFormat) ||
bogdanm 0:9b334a45a8ff 360 ((tmpreg & SPDIFRX_CR_RXSTEO) != sDataFormat.StereoMode)))
bogdanm 0:9b334a45a8ff 361 {
bogdanm 0:9b334a45a8ff 362 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 363 }
bogdanm 0:9b334a45a8ff 364
bogdanm 0:9b334a45a8ff 365 tmpreg &= ~((uint16_t) SPDIFRX_CR_RXSTEO | SPDIFRX_CR_DRFMT | SPDIFRX_CR_PMSK |
bogdanm 0:9b334a45a8ff 366 SPDIFRX_CR_VMSK | SPDIFRX_CR_CUMSK | SPDIFRX_CR_PTMSK);
bogdanm 0:9b334a45a8ff 367
bogdanm 0:9b334a45a8ff 368 /* Sets the new configuration of the SPDIFRX peripheral */
bogdanm 0:9b334a45a8ff 369 tmpreg |= ((uint16_t) sDataFormat.StereoMode |
bogdanm 0:9b334a45a8ff 370 sDataFormat.DataFormat |
bogdanm 0:9b334a45a8ff 371 sDataFormat.PreambleTypeMask |
bogdanm 0:9b334a45a8ff 372 sDataFormat.ChannelStatusMask |
bogdanm 0:9b334a45a8ff 373 sDataFormat.ValidityBitMask |
bogdanm 0:9b334a45a8ff 374 sDataFormat.ParityErrorMask);
bogdanm 0:9b334a45a8ff 375
bogdanm 0:9b334a45a8ff 376 hspdif->Instance->CR = tmpreg;
bogdanm 0:9b334a45a8ff 377
bogdanm 0:9b334a45a8ff 378 return HAL_OK;
bogdanm 0:9b334a45a8ff 379 }
bogdanm 0:9b334a45a8ff 380
bogdanm 0:9b334a45a8ff 381 /**
bogdanm 0:9b334a45a8ff 382 * @}
bogdanm 0:9b334a45a8ff 383 */
bogdanm 0:9b334a45a8ff 384
bogdanm 0:9b334a45a8ff 385 /** @defgroup SPDIFRX_Exported_Functions_Group2 IO operation functions
bogdanm 0:9b334a45a8ff 386 * @brief Data transfers functions
bogdanm 0:9b334a45a8ff 387 *
bogdanm 0:9b334a45a8ff 388 @verbatim
bogdanm 0:9b334a45a8ff 389 ===============================================================================
bogdanm 0:9b334a45a8ff 390 ##### IO operation functions #####
bogdanm 0:9b334a45a8ff 391 ===============================================================================
bogdanm 0:9b334a45a8ff 392 [..]
bogdanm 0:9b334a45a8ff 393 This subsection provides a set of functions allowing to manage the SPDIFRX data
bogdanm 0:9b334a45a8ff 394 transfers.
bogdanm 0:9b334a45a8ff 395
bogdanm 0:9b334a45a8ff 396 (#) There is two mode of transfer:
bogdanm 0:9b334a45a8ff 397 (++) Blocking mode : The communication is performed in the polling mode.
bogdanm 0:9b334a45a8ff 398 The status of all data processing is returned by the same function
bogdanm 0:9b334a45a8ff 399 after finishing transfer.
bogdanm 0:9b334a45a8ff 400 (++) No-Blocking mode : The communication is performed using Interrupts
bogdanm 0:9b334a45a8ff 401 or DMA. These functions return the status of the transfer start-up.
bogdanm 0:9b334a45a8ff 402 The end of the data processing will be indicated through the
bogdanm 0:9b334a45a8ff 403 dedicated SPDIFRX IRQ when using Interrupt mode or the DMA IRQ when
bogdanm 0:9b334a45a8ff 404 using DMA mode.
bogdanm 0:9b334a45a8ff 405
bogdanm 0:9b334a45a8ff 406 (#) Blocking mode functions are :
bogdanm 0:9b334a45a8ff 407 (++) HAL_SPDIFRX_ReceiveDataFlow()
bogdanm 0:9b334a45a8ff 408 (++) HAL_SPDIFRX_ReceiveControlFlow()
bogdanm 0:9b334a45a8ff 409 (+@) Do not use blocking mode to receive both control and data flow at the same time.
bogdanm 0:9b334a45a8ff 410
bogdanm 0:9b334a45a8ff 411 (#) No-Blocking mode functions with Interrupt are :
bogdanm 0:9b334a45a8ff 412 (++) HAL_SPDIFRX_ReceiveControlFlow_IT()
bogdanm 0:9b334a45a8ff 413 (++) HAL_SPDIFRX_ReceiveDataFlow_IT()
bogdanm 0:9b334a45a8ff 414
bogdanm 0:9b334a45a8ff 415 (#) No-Blocking mode functions with DMA are :
bogdanm 0:9b334a45a8ff 416 (++) HAL_SPDIFRX_ReceiveControlFlow_DMA()
bogdanm 0:9b334a45a8ff 417 (++) HAL_SPDIFRX_ReceiveDataFlow_DMA()
bogdanm 0:9b334a45a8ff 418
bogdanm 0:9b334a45a8ff 419 (#) A set of Transfer Complete Callbacks are provided in No_Blocking mode:
bogdanm 0:9b334a45a8ff 420 (++) HAL_SPDIFRX_RxCpltCallback()
bogdanm 0:9b334a45a8ff 421 (++) HAL_SPDIFRX_ErrorCallback()
bogdanm 0:9b334a45a8ff 422
bogdanm 0:9b334a45a8ff 423 @endverbatim
bogdanm 0:9b334a45a8ff 424 * @{
bogdanm 0:9b334a45a8ff 425 */
bogdanm 0:9b334a45a8ff 426
bogdanm 0:9b334a45a8ff 427
bogdanm 0:9b334a45a8ff 428 /**
bogdanm 0:9b334a45a8ff 429 * @brief Receives an amount of data (Data Flow) in blocking mode.
bogdanm 0:9b334a45a8ff 430 * @param hspdif: pointer to SPDIFRX_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 431 * the configuration information for SPDIFRX module.
bogdanm 0:9b334a45a8ff 432 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 433 * @param Size: Amount of data to be received
bogdanm 0:9b334a45a8ff 434 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 435 * @retval HAL status
bogdanm 0:9b334a45a8ff 436 */
bogdanm 0:9b334a45a8ff 437 HAL_StatusTypeDef HAL_SPDIFRX_ReceiveDataFlow(SPDIFRX_HandleTypeDef *hspdif, uint32_t *pData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 438 {
bogdanm 0:9b334a45a8ff 439
bogdanm 0:9b334a45a8ff 440 if((pData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 441 {
bogdanm 0:9b334a45a8ff 442 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 443 }
bogdanm 0:9b334a45a8ff 444
bogdanm 0:9b334a45a8ff 445 if(hspdif->State == HAL_SPDIFRX_STATE_READY)
bogdanm 0:9b334a45a8ff 446 {
bogdanm 0:9b334a45a8ff 447 /* Process Locked */
bogdanm 0:9b334a45a8ff 448 __HAL_LOCK(hspdif);
bogdanm 0:9b334a45a8ff 449
bogdanm 0:9b334a45a8ff 450 hspdif->State = HAL_SPDIFRX_STATE_BUSY;
bogdanm 0:9b334a45a8ff 451
bogdanm 0:9b334a45a8ff 452 /* Start synchronisation */
bogdanm 0:9b334a45a8ff 453 __HAL_SPDIFRX_SYNC(hspdif);
bogdanm 0:9b334a45a8ff 454
bogdanm 0:9b334a45a8ff 455 /* Wait until SYNCD flag is set */
bogdanm 0:9b334a45a8ff 456 if(SPDIFRX_WaitOnFlagUntilTimeout(hspdif, SPDIFRX_FLAG_SYNCD, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 457 {
bogdanm 0:9b334a45a8ff 458 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 459 }
bogdanm 0:9b334a45a8ff 460
bogdanm 0:9b334a45a8ff 461 /* Start reception */
bogdanm 0:9b334a45a8ff 462 __HAL_SPDIFRX_RCV(hspdif);
bogdanm 0:9b334a45a8ff 463
bogdanm 0:9b334a45a8ff 464 /* Receive data flow */
bogdanm 0:9b334a45a8ff 465 while(Size > 0)
bogdanm 0:9b334a45a8ff 466 {
bogdanm 0:9b334a45a8ff 467 /* Wait until RXNE flag is set */
bogdanm 0:9b334a45a8ff 468 if(SPDIFRX_WaitOnFlagUntilTimeout(hspdif, SPDIFRX_FLAG_RXNE, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 469 {
bogdanm 0:9b334a45a8ff 470 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 471 }
bogdanm 0:9b334a45a8ff 472
bogdanm 0:9b334a45a8ff 473 (*pData++) = hspdif->Instance->DR;
bogdanm 0:9b334a45a8ff 474 Size--;
bogdanm 0:9b334a45a8ff 475 }
bogdanm 0:9b334a45a8ff 476
bogdanm 0:9b334a45a8ff 477 /* SPDIFRX ready */
bogdanm 0:9b334a45a8ff 478 hspdif->State = HAL_SPDIFRX_STATE_READY;
bogdanm 0:9b334a45a8ff 479
bogdanm 0:9b334a45a8ff 480 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 481 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 482
bogdanm 0:9b334a45a8ff 483 return HAL_OK;
bogdanm 0:9b334a45a8ff 484 }
bogdanm 0:9b334a45a8ff 485 else
bogdanm 0:9b334a45a8ff 486 {
bogdanm 0:9b334a45a8ff 487 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 488 }
bogdanm 0:9b334a45a8ff 489 }
bogdanm 0:9b334a45a8ff 490
bogdanm 0:9b334a45a8ff 491 /**
bogdanm 0:9b334a45a8ff 492 * @brief Receives an amount of data (Control Flow) in blocking mode.
bogdanm 0:9b334a45a8ff 493 * @param hspdif: pointer to a SPDIFRX_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 494 * the configuration information for SPDIFRX module.
bogdanm 0:9b334a45a8ff 495 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 496 * @param Size: Amount of data to be received
bogdanm 0:9b334a45a8ff 497 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 498 * @retval HAL status
bogdanm 0:9b334a45a8ff 499 */
bogdanm 0:9b334a45a8ff 500 HAL_StatusTypeDef HAL_SPDIFRX_ReceiveControlFlow(SPDIFRX_HandleTypeDef *hspdif, uint32_t *pData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 501 {
bogdanm 0:9b334a45a8ff 502
bogdanm 0:9b334a45a8ff 503 if((pData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 504 {
bogdanm 0:9b334a45a8ff 505 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 506 }
bogdanm 0:9b334a45a8ff 507
bogdanm 0:9b334a45a8ff 508 if(hspdif->State == HAL_SPDIFRX_STATE_READY)
bogdanm 0:9b334a45a8ff 509 {
bogdanm 0:9b334a45a8ff 510 /* Process Locked */
bogdanm 0:9b334a45a8ff 511 __HAL_LOCK(hspdif);
bogdanm 0:9b334a45a8ff 512
bogdanm 0:9b334a45a8ff 513 hspdif->State = HAL_SPDIFRX_STATE_BUSY;
bogdanm 0:9b334a45a8ff 514
bogdanm 0:9b334a45a8ff 515 /* Start synchronization */
bogdanm 0:9b334a45a8ff 516 __HAL_SPDIFRX_SYNC(hspdif);
bogdanm 0:9b334a45a8ff 517
bogdanm 0:9b334a45a8ff 518 /* Wait until SYNCD flag is set */
bogdanm 0:9b334a45a8ff 519 if(SPDIFRX_WaitOnFlagUntilTimeout(hspdif, SPDIFRX_FLAG_SYNCD, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 520 {
bogdanm 0:9b334a45a8ff 521 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 522 }
bogdanm 0:9b334a45a8ff 523
bogdanm 0:9b334a45a8ff 524 /* Start reception */
bogdanm 0:9b334a45a8ff 525 __HAL_SPDIFRX_RCV(hspdif);
bogdanm 0:9b334a45a8ff 526
bogdanm 0:9b334a45a8ff 527 /* Receive control flow */
bogdanm 0:9b334a45a8ff 528 while(Size > 0)
bogdanm 0:9b334a45a8ff 529 {
bogdanm 0:9b334a45a8ff 530 /* Wait until CSRNE flag is set */
bogdanm 0:9b334a45a8ff 531 if(SPDIFRX_WaitOnFlagUntilTimeout(hspdif, SPDIFRX_FLAG_CSRNE, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 532 {
bogdanm 0:9b334a45a8ff 533 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 534 }
bogdanm 0:9b334a45a8ff 535
bogdanm 0:9b334a45a8ff 536 (*pData++) = hspdif->Instance->CSR;
bogdanm 0:9b334a45a8ff 537 Size--;
bogdanm 0:9b334a45a8ff 538 }
bogdanm 0:9b334a45a8ff 539
bogdanm 0:9b334a45a8ff 540 /* SPDIFRX ready */
bogdanm 0:9b334a45a8ff 541 hspdif->State = HAL_SPDIFRX_STATE_READY;
bogdanm 0:9b334a45a8ff 542
bogdanm 0:9b334a45a8ff 543 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 544 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 545
bogdanm 0:9b334a45a8ff 546 return HAL_OK;
bogdanm 0:9b334a45a8ff 547 }
bogdanm 0:9b334a45a8ff 548 else
bogdanm 0:9b334a45a8ff 549 {
bogdanm 0:9b334a45a8ff 550 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 551 }
bogdanm 0:9b334a45a8ff 552 }
bogdanm 0:9b334a45a8ff 553 /**
bogdanm 0:9b334a45a8ff 554 * @brief Receive an amount of data (Data Flow) in non-blocking mode with Interrupt
bogdanm 0:9b334a45a8ff 555 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 556 * @param pData: a 32-bit pointer to the Receive data buffer.
bogdanm 0:9b334a45a8ff 557 * @param Size: number of data sample to be received .
bogdanm 0:9b334a45a8ff 558 * @retval HAL status
bogdanm 0:9b334a45a8ff 559 */
bogdanm 0:9b334a45a8ff 560 HAL_StatusTypeDef HAL_SPDIFRX_ReceiveDataFlow_IT(SPDIFRX_HandleTypeDef *hspdif, uint32_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 561 {
bogdanm 0:9b334a45a8ff 562 if((hspdif->State == HAL_SPDIFRX_STATE_READY) || (hspdif->State == HAL_SPDIFRX_STATE_BUSY_CX))
bogdanm 0:9b334a45a8ff 563 {
bogdanm 0:9b334a45a8ff 564 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 565 {
bogdanm 0:9b334a45a8ff 566 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 567 }
bogdanm 0:9b334a45a8ff 568
bogdanm 0:9b334a45a8ff 569 /* Process Locked */
bogdanm 0:9b334a45a8ff 570 __HAL_LOCK(hspdif);
bogdanm 0:9b334a45a8ff 571
bogdanm 0:9b334a45a8ff 572 hspdif->pRxBuffPtr = pData;
bogdanm 0:9b334a45a8ff 573 hspdif->RxXferSize = Size;
bogdanm 0:9b334a45a8ff 574 hspdif->RxXferCount = Size;
bogdanm 0:9b334a45a8ff 575
bogdanm 0:9b334a45a8ff 576 hspdif->ErrorCode = HAL_SPDIFRX_ERROR_NONE;
bogdanm 0:9b334a45a8ff 577
bogdanm 0:9b334a45a8ff 578 /* Check if a receive process is ongoing or not */
bogdanm 0:9b334a45a8ff 579 hspdif->State = HAL_SPDIFRX_STATE_BUSY_RX;
bogdanm 0:9b334a45a8ff 580
bogdanm 0:9b334a45a8ff 581
bogdanm 0:9b334a45a8ff 582 /* Enable the SPDIFRX PE Error Interrupt */
bogdanm 0:9b334a45a8ff 583 __HAL_SPDIFRX_ENABLE_IT(hspdif, SPDIFRX_IT_PERRIE);
bogdanm 0:9b334a45a8ff 584
bogdanm 0:9b334a45a8ff 585 /* Enable the SPDIFRX OVR Error Interrupt */
bogdanm 0:9b334a45a8ff 586 __HAL_SPDIFRX_ENABLE_IT(hspdif, SPDIFRX_IT_OVRIE);
bogdanm 0:9b334a45a8ff 587
bogdanm 0:9b334a45a8ff 588 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 589 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 590
bogdanm 0:9b334a45a8ff 591 /* Enable the SPDIFRX RXNE interrupt */
bogdanm 0:9b334a45a8ff 592 __HAL_SPDIFRX_ENABLE_IT(hspdif, SPDIFRX_IT_RXNE);
bogdanm 0:9b334a45a8ff 593
bogdanm 0:9b334a45a8ff 594 if (((SPDIFRX->CR & SPDIFRX_CR_SPDIFEN) != SPDIFRX_STATE_SYNC) || ((SPDIFRX->CR & SPDIFRX_CR_SPDIFEN) != 0x00))
bogdanm 0:9b334a45a8ff 595 {
bogdanm 0:9b334a45a8ff 596 /* Start synchronization */
bogdanm 0:9b334a45a8ff 597 __HAL_SPDIFRX_SYNC(hspdif);
bogdanm 0:9b334a45a8ff 598
bogdanm 0:9b334a45a8ff 599 /* Wait until SYNCD flag is set */
bogdanm 0:9b334a45a8ff 600 if(SPDIFRX_WaitOnFlagUntilTimeout(hspdif, SPDIFRX_FLAG_SYNCD, RESET, SPDIFRX_TIMEOUT_VALUE) != HAL_OK)
bogdanm 0:9b334a45a8ff 601 {
bogdanm 0:9b334a45a8ff 602 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 603 }
bogdanm 0:9b334a45a8ff 604
bogdanm 0:9b334a45a8ff 605 /* Start reception */
bogdanm 0:9b334a45a8ff 606 __HAL_SPDIFRX_RCV(hspdif);
bogdanm 0:9b334a45a8ff 607 }
bogdanm 0:9b334a45a8ff 608
bogdanm 0:9b334a45a8ff 609 return HAL_OK;
bogdanm 0:9b334a45a8ff 610 }
bogdanm 0:9b334a45a8ff 611 else
bogdanm 0:9b334a45a8ff 612 {
bogdanm 0:9b334a45a8ff 613 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 614 }
bogdanm 0:9b334a45a8ff 615 }
bogdanm 0:9b334a45a8ff 616
bogdanm 0:9b334a45a8ff 617 /**
bogdanm 0:9b334a45a8ff 618 * @brief Receive an amount of data (Control Flow) with Interrupt
bogdanm 0:9b334a45a8ff 619 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 620 * @param pData: a 32-bit pointer to the Receive data buffer.
bogdanm 0:9b334a45a8ff 621 * @param Size: number of data sample (Control Flow) to be received :
bogdanm 0:9b334a45a8ff 622 * @retval HAL status
bogdanm 0:9b334a45a8ff 623 */
bogdanm 0:9b334a45a8ff 624 HAL_StatusTypeDef HAL_SPDIFRX_ReceiveControlFlow_IT(SPDIFRX_HandleTypeDef *hspdif, uint32_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 625 {
bogdanm 0:9b334a45a8ff 626 if((hspdif->State == HAL_SPDIFRX_STATE_READY) || (hspdif->State == HAL_SPDIFRX_STATE_BUSY_RX))
bogdanm 0:9b334a45a8ff 627 {
bogdanm 0:9b334a45a8ff 628 if((pData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 629 {
bogdanm 0:9b334a45a8ff 630 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 631 }
bogdanm 0:9b334a45a8ff 632
bogdanm 0:9b334a45a8ff 633 /* Process Locked */
bogdanm 0:9b334a45a8ff 634 __HAL_LOCK(hspdif);
bogdanm 0:9b334a45a8ff 635
bogdanm 0:9b334a45a8ff 636 hspdif->pCsBuffPtr = pData;
bogdanm 0:9b334a45a8ff 637 hspdif->CsXferSize = Size;
bogdanm 0:9b334a45a8ff 638 hspdif->CsXferCount = Size;
bogdanm 0:9b334a45a8ff 639
bogdanm 0:9b334a45a8ff 640 hspdif->ErrorCode = HAL_SPDIFRX_ERROR_NONE;
bogdanm 0:9b334a45a8ff 641
bogdanm 0:9b334a45a8ff 642 /* Check if a receive process is ongoing or not */
bogdanm 0:9b334a45a8ff 643 hspdif->State = HAL_SPDIFRX_STATE_BUSY_CX;
bogdanm 0:9b334a45a8ff 644
bogdanm 0:9b334a45a8ff 645
bogdanm 0:9b334a45a8ff 646 /* Enable the SPDIFRX PE Error Interrupt */
bogdanm 0:9b334a45a8ff 647 __HAL_SPDIFRX_ENABLE_IT(hspdif, SPDIFRX_IT_PERRIE);
bogdanm 0:9b334a45a8ff 648
bogdanm 0:9b334a45a8ff 649 /* Enable the SPDIFRX OVR Error Interrupt */
bogdanm 0:9b334a45a8ff 650 __HAL_SPDIFRX_ENABLE_IT(hspdif, SPDIFRX_IT_OVRIE);
bogdanm 0:9b334a45a8ff 651
bogdanm 0:9b334a45a8ff 652 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 653 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 654
bogdanm 0:9b334a45a8ff 655 /* Enable the SPDIFRX CSRNE interrupt */
bogdanm 0:9b334a45a8ff 656 __HAL_SPDIFRX_ENABLE_IT(hspdif, SPDIFRX_IT_CSRNE);
bogdanm 0:9b334a45a8ff 657
bogdanm 0:9b334a45a8ff 658 if (((SPDIFRX->CR & SPDIFRX_CR_SPDIFEN) != SPDIFRX_STATE_SYNC) || ((SPDIFRX->CR & SPDIFRX_CR_SPDIFEN) != 0x00))
bogdanm 0:9b334a45a8ff 659 {
bogdanm 0:9b334a45a8ff 660 /* Start synchronization */
bogdanm 0:9b334a45a8ff 661 __HAL_SPDIFRX_SYNC(hspdif);
bogdanm 0:9b334a45a8ff 662
bogdanm 0:9b334a45a8ff 663 /* Wait until SYNCD flag is set */
bogdanm 0:9b334a45a8ff 664 if(SPDIFRX_WaitOnFlagUntilTimeout(hspdif, SPDIFRX_FLAG_SYNCD, RESET, SPDIFRX_TIMEOUT_VALUE) != HAL_OK)
bogdanm 0:9b334a45a8ff 665 {
bogdanm 0:9b334a45a8ff 666 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 667 }
bogdanm 0:9b334a45a8ff 668
bogdanm 0:9b334a45a8ff 669 /* Start reception */
bogdanm 0:9b334a45a8ff 670 __HAL_SPDIFRX_RCV(hspdif);
bogdanm 0:9b334a45a8ff 671 }
bogdanm 0:9b334a45a8ff 672
bogdanm 0:9b334a45a8ff 673 return HAL_OK;
bogdanm 0:9b334a45a8ff 674 }
bogdanm 0:9b334a45a8ff 675 else
bogdanm 0:9b334a45a8ff 676 {
bogdanm 0:9b334a45a8ff 677 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 678 }
bogdanm 0:9b334a45a8ff 679 }
bogdanm 0:9b334a45a8ff 680
bogdanm 0:9b334a45a8ff 681 /**
bogdanm 0:9b334a45a8ff 682 * @brief Receive an amount of data (Data Flow) mode with DMA
bogdanm 0:9b334a45a8ff 683 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 684 * @param pData: a 32-bit pointer to the Receive data buffer.
bogdanm 0:9b334a45a8ff 685 * @param Size: number of data sample to be received :
bogdanm 0:9b334a45a8ff 686 * @retval HAL status
bogdanm 0:9b334a45a8ff 687 */
bogdanm 0:9b334a45a8ff 688 HAL_StatusTypeDef HAL_SPDIFRX_ReceiveDataFlow_DMA(SPDIFRX_HandleTypeDef *hspdif, uint32_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 689 {
bogdanm 0:9b334a45a8ff 690
bogdanm 0:9b334a45a8ff 691 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 692 {
bogdanm 0:9b334a45a8ff 693 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 694 }
bogdanm 0:9b334a45a8ff 695
bogdanm 0:9b334a45a8ff 696 if((hspdif->State == HAL_SPDIFRX_STATE_READY) || (hspdif->State == HAL_SPDIFRX_STATE_BUSY_CX))
bogdanm 0:9b334a45a8ff 697 {
bogdanm 0:9b334a45a8ff 698 hspdif->pRxBuffPtr = pData;
bogdanm 0:9b334a45a8ff 699 hspdif->RxXferSize = Size;
bogdanm 0:9b334a45a8ff 700 hspdif->RxXferCount = Size;
bogdanm 0:9b334a45a8ff 701
bogdanm 0:9b334a45a8ff 702 /* Process Locked */
bogdanm 0:9b334a45a8ff 703 __HAL_LOCK(hspdif);
bogdanm 0:9b334a45a8ff 704
bogdanm 0:9b334a45a8ff 705 hspdif->ErrorCode = HAL_SPDIFRX_ERROR_NONE;
bogdanm 0:9b334a45a8ff 706 hspdif->State = HAL_SPDIFRX_STATE_BUSY_RX;
bogdanm 0:9b334a45a8ff 707
bogdanm 0:9b334a45a8ff 708 /* Set the SPDIFRX Rx DMA Half transfer complete callback */
bogdanm 0:9b334a45a8ff 709 hspdif->hdmaDrRx->XferHalfCpltCallback = SPDIFRX_DMARxHalfCplt;
bogdanm 0:9b334a45a8ff 710
bogdanm 0:9b334a45a8ff 711 /* Set the SPDIFRX Rx DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 712 hspdif->hdmaDrRx->XferCpltCallback = SPDIFRX_DMARxCplt;
bogdanm 0:9b334a45a8ff 713
bogdanm 0:9b334a45a8ff 714 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 715 hspdif->hdmaDrRx->XferErrorCallback = SPDIFRX_DMAError;
bogdanm 0:9b334a45a8ff 716
bogdanm 0:9b334a45a8ff 717 /* Enable the DMA request */
bogdanm 0:9b334a45a8ff 718 HAL_DMA_Start_IT(hspdif->hdmaDrRx, (uint32_t)&hspdif->Instance->DR, (uint32_t)hspdif->pRxBuffPtr, Size);
bogdanm 0:9b334a45a8ff 719
bogdanm 0:9b334a45a8ff 720 /* Enable RXDMAEN bit in SPDIFRX CR register for data flow reception*/
bogdanm 0:9b334a45a8ff 721 hspdif->Instance->CR |= SPDIFRX_CR_RXDMAEN;
bogdanm 0:9b334a45a8ff 722
bogdanm 0:9b334a45a8ff 723 if (((SPDIFRX->CR & SPDIFRX_CR_SPDIFEN) != SPDIFRX_STATE_SYNC) || ((SPDIFRX->CR & SPDIFRX_CR_SPDIFEN) != 0x00))
bogdanm 0:9b334a45a8ff 724 {
bogdanm 0:9b334a45a8ff 725 /* Start synchronization */
bogdanm 0:9b334a45a8ff 726 __HAL_SPDIFRX_SYNC(hspdif);
bogdanm 0:9b334a45a8ff 727
bogdanm 0:9b334a45a8ff 728 /* Wait until SYNCD flag is set */
bogdanm 0:9b334a45a8ff 729 if(SPDIFRX_WaitOnFlagUntilTimeout(hspdif, SPDIFRX_FLAG_SYNCD, RESET, SPDIFRX_TIMEOUT_VALUE) != HAL_OK)
bogdanm 0:9b334a45a8ff 730 {
bogdanm 0:9b334a45a8ff 731 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 732 }
bogdanm 0:9b334a45a8ff 733
bogdanm 0:9b334a45a8ff 734 /* Start reception */
bogdanm 0:9b334a45a8ff 735 __HAL_SPDIFRX_RCV(hspdif);
bogdanm 0:9b334a45a8ff 736 }
bogdanm 0:9b334a45a8ff 737
bogdanm 0:9b334a45a8ff 738 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 739 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 740
bogdanm 0:9b334a45a8ff 741 return HAL_OK;
bogdanm 0:9b334a45a8ff 742 }
bogdanm 0:9b334a45a8ff 743 else
bogdanm 0:9b334a45a8ff 744 {
bogdanm 0:9b334a45a8ff 745 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 746 }
bogdanm 0:9b334a45a8ff 747 }
bogdanm 0:9b334a45a8ff 748
bogdanm 0:9b334a45a8ff 749 /**
bogdanm 0:9b334a45a8ff 750 * @brief Receive an amount of data (Control Flow) with DMA
bogdanm 0:9b334a45a8ff 751 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 752 * @param pData: a 32-bit pointer to the Receive data buffer.
bogdanm 0:9b334a45a8ff 753 * @param Size: number of data (Control Flow) sample to be received :
bogdanm 0:9b334a45a8ff 754 * @retval HAL status
bogdanm 0:9b334a45a8ff 755 */
bogdanm 0:9b334a45a8ff 756 HAL_StatusTypeDef HAL_SPDIFRX_ReceiveControlFlow_DMA(SPDIFRX_HandleTypeDef *hspdif, uint32_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 757 {
bogdanm 0:9b334a45a8ff 758
bogdanm 0:9b334a45a8ff 759 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 760 {
bogdanm 0:9b334a45a8ff 761 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 762 }
bogdanm 0:9b334a45a8ff 763
bogdanm 0:9b334a45a8ff 764 if((hspdif->State == HAL_SPDIFRX_STATE_READY) || (hspdif->State == HAL_SPDIFRX_STATE_BUSY_RX))
bogdanm 0:9b334a45a8ff 765 {
bogdanm 0:9b334a45a8ff 766 hspdif->pCsBuffPtr = pData;
bogdanm 0:9b334a45a8ff 767 hspdif->CsXferSize = Size;
bogdanm 0:9b334a45a8ff 768 hspdif->CsXferCount = Size;
bogdanm 0:9b334a45a8ff 769
bogdanm 0:9b334a45a8ff 770 /* Process Locked */
bogdanm 0:9b334a45a8ff 771 __HAL_LOCK(hspdif);
bogdanm 0:9b334a45a8ff 772
bogdanm 0:9b334a45a8ff 773 hspdif->ErrorCode = HAL_SPDIFRX_ERROR_NONE;
bogdanm 0:9b334a45a8ff 774 hspdif->State = HAL_SPDIFRX_STATE_BUSY_CX;
bogdanm 0:9b334a45a8ff 775
bogdanm 0:9b334a45a8ff 776 /* Set the SPDIFRX Rx DMA Half transfer complete callback */
bogdanm 0:9b334a45a8ff 777 hspdif->hdmaCsRx->XferHalfCpltCallback = SPDIFRX_DMACxHalfCplt;
bogdanm 0:9b334a45a8ff 778
bogdanm 0:9b334a45a8ff 779 /* Set the SPDIFRX Rx DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 780 hspdif->hdmaCsRx->XferCpltCallback = SPDIFRX_DMACxCplt;
bogdanm 0:9b334a45a8ff 781
bogdanm 0:9b334a45a8ff 782 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 783 hspdif->hdmaCsRx->XferErrorCallback = SPDIFRX_DMAError;
bogdanm 0:9b334a45a8ff 784
bogdanm 0:9b334a45a8ff 785 /* Enable the DMA request */
bogdanm 0:9b334a45a8ff 786 HAL_DMA_Start_IT(hspdif->hdmaCsRx, (uint32_t)&hspdif->Instance->CSR, (uint32_t)hspdif->pCsBuffPtr, Size);
bogdanm 0:9b334a45a8ff 787
bogdanm 0:9b334a45a8ff 788 /* Enable CBDMAEN bit in SPDIFRX CR register for control flow reception*/
bogdanm 0:9b334a45a8ff 789 hspdif->Instance->CR |= SPDIFRX_CR_CBDMAEN;
bogdanm 0:9b334a45a8ff 790
bogdanm 0:9b334a45a8ff 791 if (((SPDIFRX->CR & SPDIFRX_CR_SPDIFEN) != SPDIFRX_STATE_SYNC) || ((SPDIFRX->CR & SPDIFRX_CR_SPDIFEN) != 0x00))
bogdanm 0:9b334a45a8ff 792 {
bogdanm 0:9b334a45a8ff 793 /* Start synchronization */
bogdanm 0:9b334a45a8ff 794 __HAL_SPDIFRX_SYNC(hspdif);
bogdanm 0:9b334a45a8ff 795
bogdanm 0:9b334a45a8ff 796 /* Wait until SYNCD flag is set */
bogdanm 0:9b334a45a8ff 797 if(SPDIFRX_WaitOnFlagUntilTimeout(hspdif, SPDIFRX_FLAG_SYNCD, RESET, SPDIFRX_TIMEOUT_VALUE) != HAL_OK)
bogdanm 0:9b334a45a8ff 798 {
bogdanm 0:9b334a45a8ff 799 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 800 }
bogdanm 0:9b334a45a8ff 801
bogdanm 0:9b334a45a8ff 802 /* Start reception */
bogdanm 0:9b334a45a8ff 803 __HAL_SPDIFRX_RCV(hspdif);
bogdanm 0:9b334a45a8ff 804 }
bogdanm 0:9b334a45a8ff 805
bogdanm 0:9b334a45a8ff 806 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 807 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 808
bogdanm 0:9b334a45a8ff 809 return HAL_OK;
bogdanm 0:9b334a45a8ff 810 }
bogdanm 0:9b334a45a8ff 811 else
bogdanm 0:9b334a45a8ff 812 {
bogdanm 0:9b334a45a8ff 813 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 814 }
bogdanm 0:9b334a45a8ff 815 }
bogdanm 0:9b334a45a8ff 816
bogdanm 0:9b334a45a8ff 817 /**
bogdanm 0:9b334a45a8ff 818 * @brief stop the audio stream receive from the Media.
bogdanm 0:9b334a45a8ff 819 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 820 * @retval None
bogdanm 0:9b334a45a8ff 821 */
bogdanm 0:9b334a45a8ff 822 HAL_StatusTypeDef HAL_SPDIFRX_DMAStop(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 823 {
bogdanm 0:9b334a45a8ff 824 /* Process Locked */
bogdanm 0:9b334a45a8ff 825 __HAL_LOCK(hspdif);
bogdanm 0:9b334a45a8ff 826
bogdanm 0:9b334a45a8ff 827 /* Disable the SPDIFRX DMA requests */
bogdanm 0:9b334a45a8ff 828 hspdif->Instance->CR &= (uint16_t)(~SPDIFRX_CR_RXDMAEN);
bogdanm 0:9b334a45a8ff 829 hspdif->Instance->CR &= (uint16_t)(~SPDIFRX_CR_CBDMAEN);
bogdanm 0:9b334a45a8ff 830
bogdanm 0:9b334a45a8ff 831 /* Disable the SPDIFRX DMA channel */
bogdanm 0:9b334a45a8ff 832 __HAL_DMA_DISABLE(hspdif->hdmaDrRx);
bogdanm 0:9b334a45a8ff 833 __HAL_DMA_DISABLE(hspdif->hdmaCsRx);
bogdanm 0:9b334a45a8ff 834
bogdanm 0:9b334a45a8ff 835 /* Disable SPDIFRX peripheral */
bogdanm 0:9b334a45a8ff 836 __HAL_SPDIFRX_IDLE(hspdif);
bogdanm 0:9b334a45a8ff 837
bogdanm 0:9b334a45a8ff 838 hspdif->State = HAL_SPDIFRX_STATE_READY;
bogdanm 0:9b334a45a8ff 839
bogdanm 0:9b334a45a8ff 840 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 841 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 842
bogdanm 0:9b334a45a8ff 843 return HAL_OK;
bogdanm 0:9b334a45a8ff 844 }
bogdanm 0:9b334a45a8ff 845
bogdanm 0:9b334a45a8ff 846 /**
bogdanm 0:9b334a45a8ff 847 * @brief This function handles SPDIFRX interrupt request.
bogdanm 0:9b334a45a8ff 848 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 849 * @retval HAL status
bogdanm 0:9b334a45a8ff 850 */
bogdanm 0:9b334a45a8ff 851 void HAL_SPDIFRX_IRQHandler(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 852 {
bogdanm 0:9b334a45a8ff 853 /* SPDIFRX in mode Data Flow Reception ------------------------------------------------*/
bogdanm 0:9b334a45a8ff 854 if((__HAL_SPDIFRX_GET_FLAG(hspdif, SPDIFRX_FLAG_RXNE) != RESET) && (__HAL_SPDIFRX_GET_IT_SOURCE(hspdif, SPDIFRX_IT_RXNE) != RESET))
bogdanm 0:9b334a45a8ff 855 {
bogdanm 0:9b334a45a8ff 856 __HAL_SPDIFRX_CLEAR_IT(hspdif, SPDIFRX_IT_RXNE);
bogdanm 0:9b334a45a8ff 857 SPDIFRX_ReceiveDataFlow_IT(hspdif);
bogdanm 0:9b334a45a8ff 858 }
bogdanm 0:9b334a45a8ff 859
bogdanm 0:9b334a45a8ff 860 /* SPDIFRX in mode Control Flow Reception ------------------------------------------------*/
bogdanm 0:9b334a45a8ff 861 if((__HAL_SPDIFRX_GET_FLAG(hspdif, SPDIFRX_FLAG_CSRNE) != RESET) && (__HAL_SPDIFRX_GET_IT_SOURCE(hspdif, SPDIFRX_IT_CSRNE) != RESET))
bogdanm 0:9b334a45a8ff 862 {
bogdanm 0:9b334a45a8ff 863 __HAL_SPDIFRX_CLEAR_IT(hspdif, SPDIFRX_IT_CSRNE);
bogdanm 0:9b334a45a8ff 864 SPDIFRX_ReceiveControlFlow_IT(hspdif);
bogdanm 0:9b334a45a8ff 865 }
bogdanm 0:9b334a45a8ff 866
bogdanm 0:9b334a45a8ff 867 /* SPDIFRX Overrun error interrupt occurred ---------------------------------*/
bogdanm 0:9b334a45a8ff 868 if((__HAL_SPDIFRX_GET_FLAG(hspdif, SPDIFRX_FLAG_OVR) != RESET) && (__HAL_SPDIFRX_GET_IT_SOURCE(hspdif, SPDIFRX_IT_OVRIE) != RESET))
bogdanm 0:9b334a45a8ff 869 {
bogdanm 0:9b334a45a8ff 870 __HAL_SPDIFRX_CLEAR_IT(hspdif, SPDIFRX_FLAG_OVR);
bogdanm 0:9b334a45a8ff 871
bogdanm 0:9b334a45a8ff 872 /* Change the SPDIFRX error code */
bogdanm 0:9b334a45a8ff 873 hspdif->ErrorCode |= HAL_SPDIFRX_ERROR_OVR;
bogdanm 0:9b334a45a8ff 874
bogdanm 0:9b334a45a8ff 875 /* the transfer is not stopped */
bogdanm 0:9b334a45a8ff 876 HAL_SPDIFRX_ErrorCallback(hspdif);
bogdanm 0:9b334a45a8ff 877 }
bogdanm 0:9b334a45a8ff 878
bogdanm 0:9b334a45a8ff 879 /* SPDIFRX Parity error interrupt occurred ---------------------------------*/
bogdanm 0:9b334a45a8ff 880 if((__HAL_SPDIFRX_GET_FLAG(hspdif, SPDIFRX_FLAG_PERR) != RESET) && (__HAL_SPDIFRX_GET_IT_SOURCE(hspdif, SPDIFRX_IT_PERRIE) != RESET))
bogdanm 0:9b334a45a8ff 881 {
bogdanm 0:9b334a45a8ff 882 __HAL_SPDIFRX_CLEAR_IT(hspdif, SPDIFRX_FLAG_PERR);
bogdanm 0:9b334a45a8ff 883
bogdanm 0:9b334a45a8ff 884 /* Change the SPDIFRX error code */
bogdanm 0:9b334a45a8ff 885 hspdif->ErrorCode |= HAL_SPDIFRX_ERROR_PE;
bogdanm 0:9b334a45a8ff 886
bogdanm 0:9b334a45a8ff 887 /* the transfer is not stopped */
bogdanm 0:9b334a45a8ff 888 HAL_SPDIFRX_ErrorCallback(hspdif);
bogdanm 0:9b334a45a8ff 889 }
bogdanm 0:9b334a45a8ff 890
bogdanm 0:9b334a45a8ff 891 }
bogdanm 0:9b334a45a8ff 892
bogdanm 0:9b334a45a8ff 893 /**
bogdanm 0:9b334a45a8ff 894 * @brief Rx Transfer (Data flow) half completed callbacks
bogdanm 0:9b334a45a8ff 895 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 896 * @retval None
bogdanm 0:9b334a45a8ff 897 */
bogdanm 0:9b334a45a8ff 898 __weak void HAL_SPDIFRX_RxHalfCpltCallback(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 899 {
mbed_official 83:a036322b8637 900 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 901 UNUSED(hspdif);
mbed_official 83:a036322b8637 902
bogdanm 0:9b334a45a8ff 903 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 904 the HAL_SPDIFRX_RxCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 905 */
bogdanm 0:9b334a45a8ff 906 }
bogdanm 0:9b334a45a8ff 907
bogdanm 0:9b334a45a8ff 908 /**
bogdanm 0:9b334a45a8ff 909 * @brief Rx Transfer (Data flow) completed callbacks
bogdanm 0:9b334a45a8ff 910 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 911 * @retval None
bogdanm 0:9b334a45a8ff 912 */
bogdanm 0:9b334a45a8ff 913 __weak void HAL_SPDIFRX_RxCpltCallback(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 914 {
mbed_official 83:a036322b8637 915 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 916 UNUSED(hspdif);
mbed_official 83:a036322b8637 917
bogdanm 0:9b334a45a8ff 918 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 919 the HAL_SPDIFRX_RxCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 920 */
bogdanm 0:9b334a45a8ff 921 }
bogdanm 0:9b334a45a8ff 922
bogdanm 0:9b334a45a8ff 923 /**
bogdanm 0:9b334a45a8ff 924 * @brief Rx (Control flow) Transfer half completed callbacks
bogdanm 0:9b334a45a8ff 925 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 926 * @retval None
bogdanm 0:9b334a45a8ff 927 */
bogdanm 0:9b334a45a8ff 928 __weak void HAL_SPDIFRX_CxHalfCpltCallback(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 929 {
mbed_official 83:a036322b8637 930 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 931 UNUSED(hspdif);
mbed_official 83:a036322b8637 932
bogdanm 0:9b334a45a8ff 933 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 934 the HAL_SPDIFRX_RxCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 935 */
bogdanm 0:9b334a45a8ff 936 }
bogdanm 0:9b334a45a8ff 937
bogdanm 0:9b334a45a8ff 938 /**
bogdanm 0:9b334a45a8ff 939 * @brief Rx Transfer (Control flow) completed callbacks
bogdanm 0:9b334a45a8ff 940 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 941 * @retval None
bogdanm 0:9b334a45a8ff 942 */
bogdanm 0:9b334a45a8ff 943 __weak void HAL_SPDIFRX_CxCpltCallback(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 944 {
mbed_official 83:a036322b8637 945 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 946 UNUSED(hspdif);
mbed_official 83:a036322b8637 947
bogdanm 0:9b334a45a8ff 948 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 949 the HAL_SPDIFRX_RxCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 950 */
bogdanm 0:9b334a45a8ff 951 }
bogdanm 0:9b334a45a8ff 952
bogdanm 0:9b334a45a8ff 953 /**
bogdanm 0:9b334a45a8ff 954 * @brief SPDIFRX error callbacks
bogdanm 0:9b334a45a8ff 955 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 956 * @retval None
bogdanm 0:9b334a45a8ff 957 */
bogdanm 0:9b334a45a8ff 958 __weak void HAL_SPDIFRX_ErrorCallback(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 959 {
mbed_official 83:a036322b8637 960 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 961 UNUSED(hspdif);
mbed_official 83:a036322b8637 962
bogdanm 0:9b334a45a8ff 963 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 964 the HAL_SPDIFRX_ErrorCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 965 */
bogdanm 0:9b334a45a8ff 966 }
bogdanm 0:9b334a45a8ff 967
bogdanm 0:9b334a45a8ff 968 /**
bogdanm 0:9b334a45a8ff 969 * @}
bogdanm 0:9b334a45a8ff 970 */
bogdanm 0:9b334a45a8ff 971
bogdanm 0:9b334a45a8ff 972 /** @defgroup SPDIFRX_Exported_Functions_Group3 Peripheral State and Errors functions
bogdanm 0:9b334a45a8ff 973 * @brief Peripheral State functions
bogdanm 0:9b334a45a8ff 974 *
bogdanm 0:9b334a45a8ff 975 @verbatim
bogdanm 0:9b334a45a8ff 976 ===============================================================================
bogdanm 0:9b334a45a8ff 977 ##### Peripheral State and Errors functions #####
bogdanm 0:9b334a45a8ff 978 ===============================================================================
bogdanm 0:9b334a45a8ff 979 [..]
bogdanm 0:9b334a45a8ff 980 This subsection permit to get in run-time the status of the peripheral
bogdanm 0:9b334a45a8ff 981 and the data flow.
bogdanm 0:9b334a45a8ff 982
bogdanm 0:9b334a45a8ff 983 @endverbatim
bogdanm 0:9b334a45a8ff 984 * @{
bogdanm 0:9b334a45a8ff 985 */
bogdanm 0:9b334a45a8ff 986
bogdanm 0:9b334a45a8ff 987 /**
bogdanm 0:9b334a45a8ff 988 * @brief Return the SPDIFRX state
bogdanm 0:9b334a45a8ff 989 * @param hspdif : SPDIFRX handle
bogdanm 0:9b334a45a8ff 990 * @retval HAL state
bogdanm 0:9b334a45a8ff 991 */
bogdanm 0:9b334a45a8ff 992 HAL_SPDIFRX_StateTypeDef HAL_SPDIFRX_GetState(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 993 {
bogdanm 0:9b334a45a8ff 994 return hspdif->State;
bogdanm 0:9b334a45a8ff 995 }
bogdanm 0:9b334a45a8ff 996
bogdanm 0:9b334a45a8ff 997 /**
bogdanm 0:9b334a45a8ff 998 * @brief Return the SPDIFRX error code
bogdanm 0:9b334a45a8ff 999 * @param hspdif : SPDIFRX handle
bogdanm 0:9b334a45a8ff 1000 * @retval SPDIFRX Error Code
bogdanm 0:9b334a45a8ff 1001 */
bogdanm 0:9b334a45a8ff 1002 uint32_t HAL_SPDIFRX_GetError(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 1003 {
bogdanm 0:9b334a45a8ff 1004 return hspdif->ErrorCode;
bogdanm 0:9b334a45a8ff 1005 }
bogdanm 0:9b334a45a8ff 1006
bogdanm 0:9b334a45a8ff 1007 /**
bogdanm 0:9b334a45a8ff 1008 * @}
bogdanm 0:9b334a45a8ff 1009 */
bogdanm 0:9b334a45a8ff 1010
bogdanm 0:9b334a45a8ff 1011 /**
bogdanm 0:9b334a45a8ff 1012 * @brief DMA SPDIFRX receive process (Data flow) complete callback
bogdanm 0:9b334a45a8ff 1013 * @param hdma : DMA handle
bogdanm 0:9b334a45a8ff 1014 * @retval None
bogdanm 0:9b334a45a8ff 1015 */
bogdanm 0:9b334a45a8ff 1016 static void SPDIFRX_DMARxCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1017 {
bogdanm 0:9b334a45a8ff 1018 SPDIFRX_HandleTypeDef* hspdif = ( SPDIFRX_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
bogdanm 0:9b334a45a8ff 1019
bogdanm 0:9b334a45a8ff 1020 /* Disable Rx DMA Request */
mbed_official 83:a036322b8637 1021 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
mbed_official 83:a036322b8637 1022 {
mbed_official 83:a036322b8637 1023 hspdif->Instance->CR &= (uint16_t)(~SPDIFRX_CR_RXDMAEN);
mbed_official 83:a036322b8637 1024 hspdif->RxXferCount = 0;
mbed_official 83:a036322b8637 1025 hspdif->State = HAL_SPDIFRX_STATE_READY;
mbed_official 83:a036322b8637 1026 }
bogdanm 0:9b334a45a8ff 1027 HAL_SPDIFRX_RxCpltCallback(hspdif);
bogdanm 0:9b334a45a8ff 1028 }
bogdanm 0:9b334a45a8ff 1029
bogdanm 0:9b334a45a8ff 1030 /**
bogdanm 0:9b334a45a8ff 1031 * @brief DMA SPDIFRX receive process (Data flow) half complete callback
bogdanm 0:9b334a45a8ff 1032 * @param hdma : DMA handle
bogdanm 0:9b334a45a8ff 1033 * @retval None
bogdanm 0:9b334a45a8ff 1034 */
bogdanm 0:9b334a45a8ff 1035 static void SPDIFRX_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1036 {
bogdanm 0:9b334a45a8ff 1037 SPDIFRX_HandleTypeDef* hspdif = (SPDIFRX_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 1038
bogdanm 0:9b334a45a8ff 1039 HAL_SPDIFRX_RxHalfCpltCallback(hspdif);
bogdanm 0:9b334a45a8ff 1040 }
bogdanm 0:9b334a45a8ff 1041
bogdanm 0:9b334a45a8ff 1042
bogdanm 0:9b334a45a8ff 1043 /**
bogdanm 0:9b334a45a8ff 1044 * @brief DMA SPDIFRX receive process (Control flow) complete callback
bogdanm 0:9b334a45a8ff 1045 * @param hdma : DMA handle
bogdanm 0:9b334a45a8ff 1046 * @retval None
bogdanm 0:9b334a45a8ff 1047 */
bogdanm 0:9b334a45a8ff 1048 static void SPDIFRX_DMACxCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1049 {
bogdanm 0:9b334a45a8ff 1050 SPDIFRX_HandleTypeDef* hspdif = ( SPDIFRX_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
bogdanm 0:9b334a45a8ff 1051
bogdanm 0:9b334a45a8ff 1052 /* Disable Cb DMA Request */
bogdanm 0:9b334a45a8ff 1053 hspdif->Instance->CR &= (uint16_t)(~SPDIFRX_CR_CBDMAEN);
bogdanm 0:9b334a45a8ff 1054 hspdif->CsXferCount = 0;
bogdanm 0:9b334a45a8ff 1055
bogdanm 0:9b334a45a8ff 1056 hspdif->State = HAL_SPDIFRX_STATE_READY;
bogdanm 0:9b334a45a8ff 1057 HAL_SPDIFRX_CxCpltCallback(hspdif);
bogdanm 0:9b334a45a8ff 1058 }
bogdanm 0:9b334a45a8ff 1059
bogdanm 0:9b334a45a8ff 1060 /**
bogdanm 0:9b334a45a8ff 1061 * @brief DMA SPDIFRX receive process (Control flow) half complete callback
bogdanm 0:9b334a45a8ff 1062 * @param hdma : DMA handle
bogdanm 0:9b334a45a8ff 1063 * @retval None
bogdanm 0:9b334a45a8ff 1064 */
bogdanm 0:9b334a45a8ff 1065 static void SPDIFRX_DMACxHalfCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1066 {
bogdanm 0:9b334a45a8ff 1067 SPDIFRX_HandleTypeDef* hspdif = (SPDIFRX_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 1068
bogdanm 0:9b334a45a8ff 1069 HAL_SPDIFRX_CxHalfCpltCallback(hspdif);
bogdanm 0:9b334a45a8ff 1070 }
bogdanm 0:9b334a45a8ff 1071
bogdanm 0:9b334a45a8ff 1072 /**
bogdanm 0:9b334a45a8ff 1073 * @brief DMA SPDIFRX communication error callback
bogdanm 0:9b334a45a8ff 1074 * @param hdma : DMA handle
bogdanm 0:9b334a45a8ff 1075 * @retval None
bogdanm 0:9b334a45a8ff 1076 */
bogdanm 0:9b334a45a8ff 1077 static void SPDIFRX_DMAError(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1078 {
bogdanm 0:9b334a45a8ff 1079 SPDIFRX_HandleTypeDef* hspdif = ( SPDIFRX_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
bogdanm 0:9b334a45a8ff 1080
bogdanm 0:9b334a45a8ff 1081 /* Disable Rx and Cb DMA Request */
bogdanm 0:9b334a45a8ff 1082 hspdif->Instance->CR &= (uint16_t)(~(SPDIFRX_CR_RXDMAEN | SPDIFRX_CR_CBDMAEN));
bogdanm 0:9b334a45a8ff 1083 hspdif->RxXferCount = 0;
bogdanm 0:9b334a45a8ff 1084
bogdanm 0:9b334a45a8ff 1085 hspdif->State= HAL_SPDIFRX_STATE_READY;
bogdanm 0:9b334a45a8ff 1086
bogdanm 0:9b334a45a8ff 1087 /* Set the error code and execute error callback*/
bogdanm 0:9b334a45a8ff 1088 hspdif->ErrorCode |= HAL_SPDIFRX_ERROR_DMA;
bogdanm 0:9b334a45a8ff 1089 HAL_SPDIFRX_ErrorCallback(hspdif);
bogdanm 0:9b334a45a8ff 1090 }
bogdanm 0:9b334a45a8ff 1091
bogdanm 0:9b334a45a8ff 1092
bogdanm 0:9b334a45a8ff 1093 /**
bogdanm 0:9b334a45a8ff 1094 * @brief Receive an amount of data (Data Flow) with Interrupt
bogdanm 0:9b334a45a8ff 1095 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 1096 * @retval None
bogdanm 0:9b334a45a8ff 1097 */
bogdanm 0:9b334a45a8ff 1098 static void SPDIFRX_ReceiveDataFlow_IT(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 1099 {
bogdanm 0:9b334a45a8ff 1100 /* Receive data */
bogdanm 0:9b334a45a8ff 1101 (*hspdif->pRxBuffPtr++) = hspdif->Instance->DR;
bogdanm 0:9b334a45a8ff 1102 hspdif->RxXferCount--;
bogdanm 0:9b334a45a8ff 1103
bogdanm 0:9b334a45a8ff 1104 if(hspdif->RxXferCount == 0)
bogdanm 0:9b334a45a8ff 1105 {
bogdanm 0:9b334a45a8ff 1106 /* Disable RXNE/PE and OVR interrupts */
bogdanm 0:9b334a45a8ff 1107 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_OVRIE | SPDIFRX_IT_PERRIE | SPDIFRX_IT_RXNE);
bogdanm 0:9b334a45a8ff 1108
bogdanm 0:9b334a45a8ff 1109 hspdif->State = HAL_SPDIFRX_STATE_READY;
bogdanm 0:9b334a45a8ff 1110
bogdanm 0:9b334a45a8ff 1111 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1112 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 1113
bogdanm 0:9b334a45a8ff 1114 HAL_SPDIFRX_RxCpltCallback(hspdif);
bogdanm 0:9b334a45a8ff 1115 }
bogdanm 0:9b334a45a8ff 1116 }
bogdanm 0:9b334a45a8ff 1117
bogdanm 0:9b334a45a8ff 1118 /**
bogdanm 0:9b334a45a8ff 1119 * @brief Receive an amount of data (Control Flow) with Interrupt
bogdanm 0:9b334a45a8ff 1120 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 1121 * @retval None
bogdanm 0:9b334a45a8ff 1122 */
bogdanm 0:9b334a45a8ff 1123 static void SPDIFRX_ReceiveControlFlow_IT(SPDIFRX_HandleTypeDef *hspdif)
bogdanm 0:9b334a45a8ff 1124 {
bogdanm 0:9b334a45a8ff 1125 /* Receive data */
bogdanm 0:9b334a45a8ff 1126 (*hspdif->pCsBuffPtr++) = hspdif->Instance->CSR;
bogdanm 0:9b334a45a8ff 1127 hspdif->CsXferCount--;
bogdanm 0:9b334a45a8ff 1128
bogdanm 0:9b334a45a8ff 1129 if(hspdif->CsXferCount == 0)
bogdanm 0:9b334a45a8ff 1130 {
bogdanm 0:9b334a45a8ff 1131 /* Disable CSRNE interrupt */
bogdanm 0:9b334a45a8ff 1132 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_CSRNE);
bogdanm 0:9b334a45a8ff 1133
bogdanm 0:9b334a45a8ff 1134 hspdif->State = HAL_SPDIFRX_STATE_READY;
bogdanm 0:9b334a45a8ff 1135
bogdanm 0:9b334a45a8ff 1136 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1137 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 1138
bogdanm 0:9b334a45a8ff 1139 HAL_SPDIFRX_CxCpltCallback(hspdif);
bogdanm 0:9b334a45a8ff 1140 }
bogdanm 0:9b334a45a8ff 1141 }
bogdanm 0:9b334a45a8ff 1142
bogdanm 0:9b334a45a8ff 1143 /**
bogdanm 0:9b334a45a8ff 1144 * @brief This function handles SPDIFRX Communication Timeout.
bogdanm 0:9b334a45a8ff 1145 * @param hspdif: SPDIFRX handle
bogdanm 0:9b334a45a8ff 1146 * @param Flag: Flag checked
bogdanm 0:9b334a45a8ff 1147 * @param Status: Value of the flag expected
bogdanm 0:9b334a45a8ff 1148 * @param Timeout: Duration of the timeout
bogdanm 0:9b334a45a8ff 1149 * @retval HAL status
bogdanm 0:9b334a45a8ff 1150 */
bogdanm 0:9b334a45a8ff 1151 static HAL_StatusTypeDef SPDIFRX_WaitOnFlagUntilTimeout(SPDIFRX_HandleTypeDef *hspdif, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1152 {
bogdanm 0:9b334a45a8ff 1153 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1154
bogdanm 0:9b334a45a8ff 1155 /* Get tick */
bogdanm 0:9b334a45a8ff 1156 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1157
bogdanm 0:9b334a45a8ff 1158 /* Wait until flag is set */
bogdanm 0:9b334a45a8ff 1159 if(Status == RESET)
bogdanm 0:9b334a45a8ff 1160 {
bogdanm 0:9b334a45a8ff 1161 while(__HAL_SPDIFRX_GET_FLAG(hspdif, Flag) == RESET)
bogdanm 0:9b334a45a8ff 1162 {
bogdanm 0:9b334a45a8ff 1163 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1164 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1165 {
bogdanm 0:9b334a45a8ff 1166 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 1167 {
bogdanm 0:9b334a45a8ff 1168 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
bogdanm 0:9b334a45a8ff 1169 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_RXNE);
bogdanm 0:9b334a45a8ff 1170 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_CSRNE);
bogdanm 0:9b334a45a8ff 1171 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_PERRIE);
bogdanm 0:9b334a45a8ff 1172 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_OVRIE);
bogdanm 0:9b334a45a8ff 1173 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_SBLKIE);
bogdanm 0:9b334a45a8ff 1174 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_SYNCDIE);
bogdanm 0:9b334a45a8ff 1175 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_IFEIE);
bogdanm 0:9b334a45a8ff 1176
bogdanm 0:9b334a45a8ff 1177 hspdif->State= HAL_SPDIFRX_STATE_READY;
bogdanm 0:9b334a45a8ff 1178
bogdanm 0:9b334a45a8ff 1179 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1180 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 1181
bogdanm 0:9b334a45a8ff 1182 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1183 }
bogdanm 0:9b334a45a8ff 1184 }
bogdanm 0:9b334a45a8ff 1185 }
bogdanm 0:9b334a45a8ff 1186 }
bogdanm 0:9b334a45a8ff 1187 else
bogdanm 0:9b334a45a8ff 1188 {
bogdanm 0:9b334a45a8ff 1189 while(__HAL_SPDIFRX_GET_FLAG(hspdif, Flag) != RESET)
bogdanm 0:9b334a45a8ff 1190 {
bogdanm 0:9b334a45a8ff 1191 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1192 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1193 {
bogdanm 0:9b334a45a8ff 1194 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 1195 {
bogdanm 0:9b334a45a8ff 1196 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
bogdanm 0:9b334a45a8ff 1197 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_RXNE);
bogdanm 0:9b334a45a8ff 1198 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_CSRNE);
bogdanm 0:9b334a45a8ff 1199 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_PERRIE);
bogdanm 0:9b334a45a8ff 1200 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_OVRIE);
bogdanm 0:9b334a45a8ff 1201 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_SBLKIE);
bogdanm 0:9b334a45a8ff 1202 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_SYNCDIE);
bogdanm 0:9b334a45a8ff 1203 __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_IFEIE);
bogdanm 0:9b334a45a8ff 1204
bogdanm 0:9b334a45a8ff 1205 hspdif->State= HAL_SPDIFRX_STATE_READY;
bogdanm 0:9b334a45a8ff 1206
bogdanm 0:9b334a45a8ff 1207 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1208 __HAL_UNLOCK(hspdif);
bogdanm 0:9b334a45a8ff 1209
bogdanm 0:9b334a45a8ff 1210 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1211 }
bogdanm 0:9b334a45a8ff 1212 }
bogdanm 0:9b334a45a8ff 1213 }
bogdanm 0:9b334a45a8ff 1214 }
bogdanm 0:9b334a45a8ff 1215 return HAL_OK;
bogdanm 0:9b334a45a8ff 1216 }
bogdanm 0:9b334a45a8ff 1217
bogdanm 0:9b334a45a8ff 1218 /**
bogdanm 0:9b334a45a8ff 1219 * @}
bogdanm 0:9b334a45a8ff 1220 */
bogdanm 0:9b334a45a8ff 1221
bogdanm 0:9b334a45a8ff 1222 #endif /* HAL_SPDIFRX_MODULE_ENABLED */
bogdanm 0:9b334a45a8ff 1223 /**
bogdanm 0:9b334a45a8ff 1224 * @}
bogdanm 0:9b334a45a8ff 1225 */
bogdanm 0:9b334a45a8ff 1226
bogdanm 0:9b334a45a8ff 1227 /**
bogdanm 0:9b334a45a8ff 1228 * @}
bogdanm 0:9b334a45a8ff 1229 */
bogdanm 0:9b334a45a8ff 1230
bogdanm 0:9b334a45a8ff 1231 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/