227#ifdef HAL_SAI_MODULE_ENABLED
229#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\
230 defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F413xx) ||\
250#define SAI_DEFAULT_TIMEOUT 4U
251#define SAI_LONG_TIMEOUT 1000U
346 status =
SAI_InitI2S(hsai, protocol, datasize, nbslot);
350 status =
SAI_InitPCM(hsai, protocol, datasize, nbslot);
374 uint32_t tmpregisterGCR = 0U;
381 uint32_t ckstr_bits = 0U;
382 uint32_t syncen_bits = 0U;
427#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
436 if (hsai->MspInitCallback == NULL)
440 hsai->MspInitCallback(hsai);
470 if ((tmpregisterGCR % 10U) > 8U)
505 syncen_bits = SAI_xCR1_SYNCEN_0;
511 syncen_bits = SAI_xCR1_SYNCEN_1;
519 hsai->
Instance->CR1 &= ~(SAI_xCR1_MODE | SAI_xCR1_PRTCFG | SAI_xCR1_DS | \
520 SAI_xCR1_LSBFIRST | SAI_xCR1_CKSTR | SAI_xCR1_SYNCEN | \
521 SAI_xCR1_MONO | SAI_xCR1_OUTDRIV | SAI_xCR1_DMAEN | \
522 SAI_xCR1_NODIV | SAI_xCR1_MCKDIV);
526 ckstr_bits | syncen_bits | \
531 hsai->
Instance->CR2 &= ~(SAI_xCR2_FTH | SAI_xCR2_FFLUSH | SAI_xCR2_COMP | SAI_xCR2_CPL);
535 hsai->
Instance->FRCR &= (~(SAI_xFRCR_FRL | SAI_xFRCR_FSALL | SAI_xFRCR_FSDEF | \
536 SAI_xFRCR_FSPOL | SAI_xFRCR_FSOFF));
545 hsai->
Instance->SLOTR &= ~(SAI_xSLOTR_FBOFF | SAI_xSLOTR_SLOTSZ | \
546 SAI_xSLOTR_NBSLOT | SAI_xSLOTR_SLOTEN);
581 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
587 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
590#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
591 if (hsai->MspDeInitCallback == NULL)
595 hsai->MspDeInitCallback(hsai);
644#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
662 HAL_SAI_CallbackIDTypeDef CallbackID,
663 pSAI_CallbackTypeDef pCallback)
667 if (pCallback == NULL)
670 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
680 case HAL_SAI_RX_COMPLETE_CB_ID :
681 hsai->RxCpltCallback = pCallback;
683 case HAL_SAI_RX_HALFCOMPLETE_CB_ID :
684 hsai->RxHalfCpltCallback = pCallback;
686 case HAL_SAI_TX_COMPLETE_CB_ID :
687 hsai->TxCpltCallback = pCallback;
689 case HAL_SAI_TX_HALFCOMPLETE_CB_ID :
690 hsai->TxHalfCpltCallback = pCallback;
692 case HAL_SAI_ERROR_CB_ID :
693 hsai->ErrorCallback = pCallback;
695 case HAL_SAI_MSPINIT_CB_ID :
696 hsai->MspInitCallback = pCallback;
698 case HAL_SAI_MSPDEINIT_CB_ID :
699 hsai->MspDeInitCallback = pCallback;
703 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
713 case HAL_SAI_MSPINIT_CB_ID :
714 hsai->MspInitCallback = pCallback;
716 case HAL_SAI_MSPDEINIT_CB_ID :
717 hsai->MspDeInitCallback = pCallback;
721 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
730 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
754 HAL_SAI_CallbackIDTypeDef CallbackID)
762 case HAL_SAI_RX_COMPLETE_CB_ID :
765 case HAL_SAI_RX_HALFCOMPLETE_CB_ID :
768 case HAL_SAI_TX_COMPLETE_CB_ID :
771 case HAL_SAI_TX_HALFCOMPLETE_CB_ID :
774 case HAL_SAI_ERROR_CB_ID :
777 case HAL_SAI_MSPINIT_CB_ID :
780 case HAL_SAI_MSPDEINIT_CB_ID :
785 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
795 case HAL_SAI_MSPINIT_CB_ID :
798 case HAL_SAI_MSPDEINIT_CB_ID :
803 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
812 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
879 if ((pData == NULL) || (Size == 0))
896 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
934 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
940 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
979 if ((pData == NULL) || (Size == 0))
996 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
1032 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
1038 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
1074 if ((pData == NULL) || (Size == 0))
1110 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
1136 if ((pData == NULL) || (Size == 0))
1169 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
1198 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
1218 hsai->
Instance->CR1 |= SAI_xCR1_DMAEN;
1221 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
1250 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
1281 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
1309 if ((hsai->
Instance->CR1 & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1312 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
1345 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
1348 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
1371 if ((pData == NULL) || (Size == 0))
1410 hsai->
Instance->CR1 |= SAI_xCR1_DMAEN;
1429 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1456 if ((pData == NULL) || (Size == 0))
1495 hsai->
Instance->CR1 |= SAI_xCR1_DMAEN;
1498 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
1528 CLEAR_BIT(hsai->
Instance->CR2, SAI_xCR2_MUTEVAL | SAI_xCR2_MUTE);
1529 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_MUTE | val);
1545 CLEAR_BIT(hsai->
Instance->CR2, SAI_xCR2_MUTEVAL | SAI_xCR2_MUTE);
1566 CLEAR_BIT(hsai->
Instance->CR2, SAI_xCR2_MUTECNT);
1567 SET_BIT(hsai->
Instance->CR2, (uint32_t)((uint32_t)counter << SAI_xCR2_MUTECNT_Pos));
1605 uint32_t itflags = hsai->
Instance->SR;
1606 uint32_t itsources = hsai->
Instance->IMR;
1607 uint32_t cr1config = hsai->
Instance->CR1;
1628#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1629 hsai->ErrorCallback(hsai);
1657 if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1660 if (hsai->
hdmatx != NULL)
1668 else if (hsai->
hdmarx != NULL)
1683#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1684 hsai->ErrorCallback(hsai);
1700 if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1703 if (hsai->
hdmatx != NULL)
1711 else if (hsai->
hdmarx != NULL)
1726#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1727 hsai->ErrorCallback(hsai);
1743 if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1746 if (hsai->
hdmatx != NULL)
1754 else if (hsai->
hdmarx != NULL)
1768 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
1777#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1778 hsai->ErrorCallback(hsai);
1794#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1795 hsai->ErrorCallback(hsai);
1973 if ((nbslot & 0x1U) != 0U)
2193 while ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) != RESET);
2212#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2213 hsai->TxCpltCallback(hsai);
2240#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2241 hsai->TxCpltCallback(hsai);
2269#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2270 hsai->TxCpltCallback(hsai);
2306#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2307 hsai->RxCpltCallback(hsai);
2337#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2338 hsai->RxCpltCallback(hsai);
2368#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2369 hsai->RxCpltCallback(hsai);
2391 hsai->
Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
2398#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2399 hsai->TxCpltCallback(hsai);
2415#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2416 hsai->TxHalfCpltCallback(hsai);
2435 hsai->
Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
2443#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2444 hsai->RxCpltCallback(hsai);
2460#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2461 hsai->RxHalfCpltCallback(hsai);
2483 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
2495#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2496 hsai->ErrorCallback(hsai);
2513 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
2517 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
2525 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
2534#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2535 hsai->ErrorCallback(hsai);
#define HAL_DMA_ERROR_NO_XFER
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer.
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
void SAI_BlockSynchroConfig(const SAI_HandleTypeDef *hsai)
Configure SAI Block synchronization mode.
uint32_t SAI_GetInputClock(const SAI_HandleTypeDef *hsai)
Get SAI Input Clock based on SAI source clock selection.
#define SAI_AUDIO_FREQUENCY_MCKDIV
#define SAI_CLOCKSTROBING_FALLINGEDGE
#define SAI_CLOCKSTROBING_RISINGEDGE
#define SAI_FS_STARTFRAME
#define SAI_FS_CHANNEL_IDENTIFICATION
#define SAI_FS_BEFOREFIRSTBIT
#define SAI_FS_ACTIVE_LOW
#define SAI_FS_ACTIVE_HIGH
#define SAI_FIFOSTATUS_FULL
#define SAI_FIFOSTATUS_EMPTY
#define SAI_MODEMASTER_RX
#define SAI_MODEMASTER_TX
#define SAI_SPDIF_PROTOCOL
#define SAI_AC97_PROTOCOL
#define SAI_FREE_PROTOCOL
#define SAI_SLOTACTIVE_ALL
#define SAI_SYNCHRONOUS_EXT_SAI1
#define SAI_SYNCHRONOUS_EXT_SAI2
#define HAL_SAI_ERROR_UDR
#define HAL_SAI_ERROR_LFSDET
#define HAL_SAI_ERROR_CNREADY
#define HAL_SAI_ERROR_NONE
#define HAL_SAI_ERROR_TIMEOUT
#define HAL_SAI_ERROR_WCKCFG
#define HAL_SAI_ERROR_DMA
#define HAL_SAI_ERROR_AFSDET
#define HAL_SAI_ERROR_OVR
HAL_StatusTypeDef HAL_SAI_InitProtocol(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
Initialize the structure FrameInit, SlotInit and the low part of Init according to the specified para...
void HAL_SAI_MspInit(SAI_HandleTypeDef *hsai)
Initialize the SAI MSP.
void HAL_SAI_MspDeInit(SAI_HandleTypeDef *hsai)
DeInitialize the SAI MSP.
HAL_StatusTypeDef HAL_SAI_Init(SAI_HandleTypeDef *hsai)
Initialize the SAI according to the specified parameters. in the SAI_InitTypeDef structure and initia...
HAL_StatusTypeDef HAL_SAI_DeInit(SAI_HandleTypeDef *hsai)
DeInitialize the SAI peripheral.
HAL_StatusTypeDef HAL_SAI_Abort(SAI_HandleTypeDef *hsai)
Abort the current transfer and disable the SAI.
HAL_StatusTypeDef HAL_SAI_Receive_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
Receive an amount of data in non-blocking mode with DMA.
void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
Tx Transfer completed callback.
HAL_StatusTypeDef HAL_SAI_Receive(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Receive an amount of data in blocking mode.
HAL_StatusTypeDef HAL_SAI_Transmit_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
Transmit an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_SAI_DMAResume(SAI_HandleTypeDef *hsai)
Resume the audio stream playing from the Media.
HAL_StatusTypeDef HAL_SAI_Receive_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
Receive an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_SAI_DisableRxMuteMode(SAI_HandleTypeDef *hsai)
Disable the Rx mute detection.
HAL_StatusTypeDef HAL_SAI_EnableRxMuteMode(SAI_HandleTypeDef *hsai, SAIcallback callback, uint16_t counter)
Enable the Rx mute detection.
HAL_StatusTypeDef HAL_SAI_DMAStop(SAI_HandleTypeDef *hsai)
Stop the audio stream playing from the Media.
void HAL_SAI_IRQHandler(SAI_HandleTypeDef *hsai)
Handle SAI interrupt request.
HAL_StatusTypeDef HAL_SAI_Transmit(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Transmit an amount of data in blocking mode.
HAL_StatusTypeDef HAL_SAI_DMAPause(SAI_HandleTypeDef *hsai)
Pause the audio stream playing from the Media.
void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai)
SAI error callback.
void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
Rx Transfer half completed callback.
HAL_StatusTypeDef HAL_SAI_Transmit_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
Transmit an amount of data in non-blocking mode with DMA.
void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
Tx Transfer Half completed callback.
HAL_StatusTypeDef HAL_SAI_DisableTxMuteMode(SAI_HandleTypeDef *hsai)
Disable the Tx mute mode.
HAL_StatusTypeDef HAL_SAI_EnableTxMuteMode(SAI_HandleTypeDef *hsai, uint16_t val)
Enable the Tx mute mode.
void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
Rx Transfer completed callback.
uint32_t HAL_SAI_GetError(const SAI_HandleTypeDef *hsai)
Return the SAI error code.
HAL_SAI_StateTypeDef HAL_SAI_GetState(const SAI_HandleTypeDef *hsai)
Return the SAI handle state.
#define __HAL_SAI_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clear the specified SAI pending flag.
#define __HAL_SAI_DISABLE_IT(__HANDLE__, __INTERRUPT__)
#define __HAL_SAI_ENABLE(__HANDLE__)
Enable SAI.
#define __HAL_SAI_DISABLE(__HANDLE__)
Disable SAI.
#define __HAL_SAI_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enable or disable the specified SAI interrupts.
void(* SAIcallback)(void)
SAI Callback prototype.
HAL_SAI_StateTypeDef
HAL State structures definition.
#define SAI_DEFAULT_TIMEOUT
static void SAI_Receive_IT32Bit(SAI_HandleTypeDef *hsai)
Rx Handler for Receive in Interrupt mode for 32-Bit transfer.
static void SAI_DMARxCplt(DMA_HandleTypeDef *hdma)
DMA SAI receive process complete callback.
static void SAI_DMAAbort(DMA_HandleTypeDef *hdma)
DMA SAI Abort callback.
static void SAI_Transmit_IT32Bit(SAI_HandleTypeDef *hsai)
Tx Handler for Transmit in Interrupt mode for 32-Bit transfer.
static void SAI_Transmit_IT8Bit(SAI_HandleTypeDef *hsai)
Tx Handler for Transmit in Interrupt mode 8-Bit transfer.
static void SAI_Receive_IT8Bit(SAI_HandleTypeDef *hsai)
Rx Handler for Receive in Interrupt mode 8-Bit transfer.
static HAL_StatusTypeDef SAI_InitI2S(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
Initialize the SAI I2S protocol according to the specified parameters in the SAI_InitTypeDef and crea...
static void SAI_Transmit_IT16Bit(SAI_HandleTypeDef *hsai)
Tx Handler for Transmit in Interrupt mode for 16-Bit transfer.
static void SAI_DMAError(DMA_HandleTypeDef *hdma)
DMA SAI communication error callback.
static void SAI_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
DMA SAI receive process half complete callback.
static HAL_StatusTypeDef SAI_Disable(SAI_HandleTypeDef *hsai)
Disable the SAI and wait for the disabling.
static void SAI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
DMA SAI transmit process half complete callback.
static void SAI_Receive_IT16Bit(SAI_HandleTypeDef *hsai)
Rx Handler for Receive in Interrupt mode for 16-Bit transfer.
static HAL_StatusTypeDef SAI_InitPCM(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
Initialize the SAI PCM protocol according to the specified parameters in the SAI_InitTypeDef and crea...
static void SAI_DMATxCplt(DMA_HandleTypeDef *hdma)
DMA SAI transmit process complete callback.
static uint32_t SAI_InterruptFlag(const SAI_HandleTypeDef *hsai, uint32_t mode)
Return the interrupt flag to set according the SAI setup.
static void SAI_FillFifo(SAI_HandleTypeDef *hsai)
Fill the fifo.
#define IS_SAI_BLOCK_FIRSTBIT_OFFSET(OFFSET)
#define IS_SAI_BLOCK_MUTE_COUNTER(COUNTER)
#define IS_SAI_SUPPORTED_PROTOCOL(PROTOCOL)
#define IS_SAI_BLOCK_ACTIVE_FRAME(LENGTH)
#define IS_SAI_BLOCK_FS_OFFSET(OFFSET)
#define IS_SAI_BLOCK_SLOT_SIZE(SIZE)
#define IS_SAI_BLOCK_MODE(MODE)
#define IS_SAI_BLOCK_FIRST_BIT(BIT)
#define IS_SAI_BLOCK_MASTER_DIVIDER(DIVIDER)
#define IS_SAI_BLOCK_OUTPUT_DRIVE(DRIVE)
#define IS_SAI_BLOCK_PROTOCOL(PROTOCOL)
#define IS_SAI_BLOCK_SLOT_NUMBER(NUMBER)
#define IS_SAI_MONO_STEREO_MODE(MODE)
#define IS_SAI_BLOCK_SYNCHRO(SYNCHRO)
#define IS_SAI_SLOT_ACTIVE(ACTIVE)
#define IS_SAI_BLOCK_FS_POLARITY(POLARITY)
#define IS_SAI_BLOCK_MUTE_VALUE(VALUE)
#define IS_SAI_BLOCK_FS_DEFINITION(DEFINITION)
#define IS_SAI_BLOCK_FRAME_LENGTH(LENGTH)
#define IS_SAI_BLOCK_NODIVIDER(NODIVIDER)
#define IS_SAI_BLOCK_TRISTATE_MANAGEMENT(STATE)
#define IS_SAI_AUDIO_FREQUENCY(AUDIO)
#define IS_SAI_BLOCK_SYNCEXT(STATE)
#define IS_SAI_BLOCK_FIFO_THRESHOLD(THRESHOLD)
#define IS_SAI_BLOCK_COMPANDING_MODE(MODE)
#define IS_SAI_PROTOCOL_DATASIZE(DATASIZE)
#define IS_SAI_BLOCK_CLOCK_STROBING(CLOCK)
#define IS_SAI_BLOCK_DATASIZE(DATASIZE)
#define SAI_PROTOCOL_DATASIZE_16BIT
#define SAI_PROTOCOL_DATASIZE_32BIT
#define SAI_PROTOCOL_DATASIZE_24BIT
#define SAI_PROTOCOL_DATASIZE_16BITEXTENDED
#define SAI_I2S_LSBJUSTIFIED
#define SAI_I2S_MSBJUSTIFIED
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)
uint32_t ActiveFrameLength
DMA handle Structure definition.
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
DMA_HandleTypeDef * hdmatx
SAI_FrameInitTypeDef FrameInit
SAI_SlotInitTypeDef SlotInit
void(* InterruptServiceRoutine)(struct __SAI_HandleTypeDef *hsai)
__IO HAL_SAI_StateTypeDef State
SAI_Block_TypeDef * Instance
DMA_HandleTypeDef * hdmarx