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
264 static HAL_StatusTypeDef SAI_InitI2S(
SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot);
265 static HAL_StatusTypeDef SAI_InitPCM(
SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot);
335 HAL_StatusTypeDef status = HAL_OK;
338 assert_param(IS_SAI_SUPPORTED_PROTOCOL(protocol));
339 assert_param(IS_SAI_PROTOCOL_DATASIZE(datasize));
343 case SAI_I2S_STANDARD :
344 case SAI_I2S_MSBJUSTIFIED :
345 case SAI_I2S_LSBJUSTIFIED :
346 status = SAI_InitI2S(hsai, protocol, datasize, nbslot);
350 status = SAI_InitPCM(hsai, protocol, datasize, nbslot);
357 if (status == HAL_OK)
374 uint32_t tmpregisterGCR = 0U;
381 uint32_t ckstr_bits = 0U;
382 uint32_t syncen_bits = 0U;
391 assert_param(IS_SAI_ALL_INSTANCE(hsai->
Instance));
395 assert_param(IS_SAI_BLOCK_PROTOCOL(hsai->
Init.
Protocol));
398 assert_param(IS_SAI_BLOCK_DATASIZE(hsai->
Init.
DataSize));
399 assert_param(IS_SAI_BLOCK_FIRST_BIT(hsai->
Init.
FirstBit));
401 assert_param(IS_SAI_BLOCK_SYNCHRO(hsai->
Init.
Synchro));
407 assert_param(IS_SAI_BLOCK_TRISTATE_MANAGEMENT(hsai->
Init.
TriState));
425 hsai->
Lock = HAL_UNLOCKED;
427 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
470 if ((tmpregisterGCR % 10U) > 8U)
483 assert_param(IS_SAI_BLOCK_MASTER_DIVIDER(hsai->
Init.
Mckdiv));
488 ckstr_bits = (hsai->
Init.
ClockStrobing == SAI_CLOCKSTROBING_RISINGEDGE) ? 0U : SAI_xCR1_CKSTR;
492 ckstr_bits = (hsai->
Init.
ClockStrobing == SAI_CLOCKSTROBING_RISINGEDGE) ? SAI_xCR1_CKSTR : 0U;
498 case SAI_ASYNCHRONOUS :
503 case SAI_SYNCHRONOUS :
505 syncen_bits = SAI_xCR1_SYNCEN_0;
508 case SAI_SYNCHRONOUS_EXT_SAI1 :
509 case SAI_SYNCHRONOUS_EXT_SAI2 :
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 | \
528 hsai->Init.NoDivider | (hsai->
Init.
Mckdiv << 20U));
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)
644 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
665 HAL_StatusTypeDef status = HAL_OK;
667 if (pCallback == NULL)
670 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
703 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
721 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
730 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
756 HAL_StatusTypeDef status = HAL_OK;
785 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
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)
901 __HAL_SAI_ENABLE(hsai);
907 if ((hsai->
Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_FULL)
928 if ((Timeout != HAL_MAX_DELAY) && ((Timeout == 0U) || ((
HAL_GetTick() - tickstart) > Timeout)))
931 hsai->
ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
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)
999 __HAL_SAI_ENABLE(hsai);
1005 if ((hsai->
Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_EMPTY)
1026 if ((Timeout != HAL_MAX_DELAY) && ((Timeout == 0U) || ((
HAL_GetTick() - tickstart) > Timeout)))
1029 hsai->
ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
1032 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
1038 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
1074 if ((pData == NULL) || (Size == 0))
1092 hsai->InterruptServiceRoutine = SAI_Transmit_IT8Bit;
1096 hsai->InterruptServiceRoutine = SAI_Transmit_IT16Bit;
1100 hsai->InterruptServiceRoutine = SAI_Transmit_IT32Bit;
1107 __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
1110 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
1113 __HAL_SAI_ENABLE(hsai);
1136 if ((pData == NULL) || (Size == 0))
1154 hsai->InterruptServiceRoutine = SAI_Receive_IT8Bit;
1158 hsai->InterruptServiceRoutine = SAI_Receive_IT16Bit;
1162 hsai->InterruptServiceRoutine = SAI_Receive_IT32Bit;
1166 __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
1169 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
1172 __HAL_SAI_ENABLE(hsai);
1198 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
1218 hsai->
Instance->CR1 |= SAI_xCR1_DMAEN;
1221 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
1224 __HAL_SAI_ENABLE(hsai);
1241 HAL_StatusTypeDef status = HAL_OK;
1250 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
1281 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
1300 HAL_StatusTypeDef status = HAL_OK;
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))
1407 __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
1410 hsai->
Instance->CR1 |= SAI_xCR1_DMAEN;
1413 while ((hsai->
Instance->SR & SAI_xSR_FLVL) == SAI_FIFOSTATUS_EMPTY)
1416 if ((
HAL_GetTick() - tickstart) > SAI_LONG_TIMEOUT)
1419 hsai->
ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
1429 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1432 __HAL_SAI_ENABLE(hsai);
1456 if ((pData == NULL) || (Size == 0))
1492 __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
1495 hsai->
Instance->CR1 |= SAI_xCR1_DMAEN;
1498 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
1501 __HAL_SAI_ENABLE(hsai);
1524 assert_param(IS_SAI_BLOCK_MUTE_VALUE(val));
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);
1561 assert_param(IS_SAI_BLOCK_MUTE_COUNTER(counter));
1566 CLEAR_BIT(hsai->
Instance->CR2, SAI_xCR2_MUTECNT);
1567 SET_BIT(hsai->
Instance->CR2, (uint32_t)((uint32_t)counter << SAI_xCR2_MUTECNT_Pos));
1570 __HAL_SAI_ENABLE_IT(hsai, SAI_IT_MUTEDET);
1589 __HAL_SAI_DISABLE_IT(hsai, SAI_IT_MUTEDET);
1605 uint32_t itflags = hsai->
Instance->SR;
1606 uint32_t itsources = hsai->
Instance->IMR;
1607 uint32_t cr1config = hsai->
Instance->CR1;
1611 if (((itflags & SAI_xSR_FREQ) == SAI_xSR_FREQ) && ((itsources & SAI_IT_FREQ) == SAI_IT_FREQ))
1613 hsai->InterruptServiceRoutine(hsai);
1616 else if (((itflags & SAI_FLAG_OVRUDR) == SAI_FLAG_OVRUDR) && ((itsources & SAI_IT_OVRUDR) == SAI_IT_OVRUDR))
1619 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
1628 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1635 else if (((itflags & SAI_FLAG_MUTEDET) == SAI_FLAG_MUTEDET) && ((itsources & SAI_IT_MUTEDET) == SAI_IT_MUTEDET))
1638 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_MUTEDET);
1648 else if (((itflags & SAI_FLAG_AFSDET) == SAI_FLAG_AFSDET) && ((itsources & SAI_IT_AFSDET) == SAI_IT_AFSDET))
1651 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_AFSDET);
1654 hsai->
ErrorCode |= HAL_SAI_ERROR_AFSDET;
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)
1691 else if (((itflags & SAI_FLAG_LFSDET) == SAI_FLAG_LFSDET) && ((itsources & SAI_IT_LFSDET) == SAI_IT_LFSDET))
1694 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_LFSDET);
1697 hsai->
ErrorCode |= HAL_SAI_ERROR_LFSDET;
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)
1734 else if (((itflags & SAI_FLAG_WCKCFG) == SAI_FLAG_WCKCFG) && ((itsources & SAI_IT_WCKCFG) == SAI_IT_WCKCFG))
1737 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_WCKCFG);
1740 hsai->
ErrorCode |= HAL_SAI_ERROR_WCKCFG;
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)
1785 else if (((itflags & SAI_FLAG_CNRDY) == SAI_FLAG_CNRDY) && ((itsources & SAI_IT_CNRDY) == SAI_IT_CNRDY))
1788 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_CNRDY);
1791 hsai->
ErrorCode |= HAL_SAI_ERROR_CNREADY;
1794 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1952 static HAL_StatusTypeDef SAI_InitI2S(
SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
1973 if ((nbslot & 0x1U) != 0U)
1978 if (protocol == SAI_I2S_STANDARD)
1993 case SAI_PROTOCOL_DATASIZE_16BIT:
1999 case SAI_PROTOCOL_DATASIZE_16BITEXTENDED :
2005 case SAI_PROTOCOL_DATASIZE_24BIT:
2011 case SAI_PROTOCOL_DATASIZE_32BIT:
2020 if (protocol == SAI_I2S_LSBJUSTIFIED)
2022 if (datasize == SAI_PROTOCOL_DATASIZE_16BITEXTENDED)
2026 if (datasize == SAI_PROTOCOL_DATASIZE_24BIT)
2044 static HAL_StatusTypeDef SAI_InitPCM(
SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
2066 if (protocol == SAI_PCM_SHORT)
2078 case SAI_PROTOCOL_DATASIZE_16BIT:
2083 case SAI_PROTOCOL_DATASIZE_16BITEXTENDED :
2088 case SAI_PROTOCOL_DATASIZE_24BIT :
2093 case SAI_PROTOCOL_DATASIZE_32BIT:
2114 while (((hsai->
Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_FULL) && (hsai->
XferCount > 0U))
2143 uint32_t tmpIT = SAI_IT_OVRUDR;
2145 if (mode == SAI_MODE_IT)
2147 tmpIT |= SAI_IT_FREQ;
2153 tmpIT |= SAI_IT_CNRDY;
2158 tmpIT |= SAI_IT_AFSDET | SAI_IT_LFSDET;
2163 tmpIT |= SAI_IT_WCKCFG;
2176 uint32_t count = SAI_DEFAULT_TIMEOUT * (SystemCoreClock / 7U / 1000U);
2177 HAL_StatusTypeDef status = HAL_OK;
2180 __HAL_SAI_DISABLE(hsai);
2188 hsai->
ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
2189 status = HAL_TIMEOUT;
2193 while ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) != RESET);
2210 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2212 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2238 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2240 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2267 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2269 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2300 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2303 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
2306 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2331 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2334 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
2337 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2362 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2365 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
2368 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2386 if (hdma->
Init.Mode != DMA_CIRCULAR)
2391 hsai->
Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
2394 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
2398 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2415 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2432 if (hdma->
Init.Mode != DMA_CIRCULAR)
2435 hsai->
Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
2439 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
2443 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2460 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2483 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
2495 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2513 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
2517 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
2519 if (hsai->
ErrorCode != HAL_SAI_ERROR_WCKCFG)
2525 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
2534 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
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.
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...
HAL_StatusTypeDef HAL_SAI_RegisterCallback(SAI_HandleTypeDef *hsai, HAL_SAI_CallbackIDTypeDef CallbackID, pSAI_CallbackTypeDef pCallback)
Register a user SAI callback to be used instead of the weak predefined callback.
void HAL_SAI_MspInit(SAI_HandleTypeDef *hsai)
Initialize the SAI MSP.
HAL_StatusTypeDef HAL_SAI_UnRegisterCallback(SAI_HandleTypeDef *hsai, HAL_SAI_CallbackIDTypeDef CallbackID)
Unregister a user SAI callback. SAI callback is redirected to the weak predefined callback.
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.
void(* pSAI_CallbackTypeDef)(SAI_HandleTypeDef *hsai)
SAI callback pointer definition.
void(* SAIcallback)(void)
SAI Callback prototype.
HAL_SAI_CallbackIDTypeDef
SAI callback ID enumeration definition.
HAL_SAI_StateTypeDef
HAL State structures definition.
@ HAL_SAI_MSPDEINIT_CB_ID
@ HAL_SAI_RX_HALFCOMPLETE_CB_ID
@ HAL_SAI_TX_HALFCOMPLETE_CB_ID
@ HAL_SAI_TX_COMPLETE_CB_ID
@ HAL_SAI_RX_COMPLETE_CB_ID
uint32_t ActiveFrameLength
void(* TxHalfCpltCallback)(struct __SAI_HandleTypeDef *hsai)
DMA_HandleTypeDef * hdmatx
SAI_FrameInitTypeDef FrameInit
SAI_SlotInitTypeDef SlotInit
void(* RxCpltCallback)(struct __SAI_HandleTypeDef *hsai)
void(* RxHalfCpltCallback)(struct __SAI_HandleTypeDef *hsai)
void(* MspInitCallback)(struct __SAI_HandleTypeDef *hsai)
__IO HAL_SAI_StateTypeDef State
SAI_Block_TypeDef * Instance
void(* ErrorCallback)(struct __SAI_HandleTypeDef *hsai)
void(* TxCpltCallback)(struct __SAI_HandleTypeDef *hsai)
DMA_HandleTypeDef * hdmarx
void(* MspDeInitCallback)(struct __SAI_HandleTypeDef *hsai)
This file contains all the functions prototypes for the HAL module driver.
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)