comparison Common/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spdifrx.c @ 160:e3ca52b8e7fa

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