221 #ifdef HAL_SAI_MODULE_ENABLED 222 #if !defined(STM32L412xx) && !defined(STM32L422xx) 246 #define SAI_DEFAULT_TIMEOUT 4U 247 #define SAI_LONG_TIMEOUT 1000U 332 HAL_StatusTypeDef status;
340 case SAI_I2S_STANDARD :
341 case SAI_I2S_MSBJUSTIFIED :
342 case SAI_I2S_LSBJUSTIFIED :
343 status =
SAI_InitI2S(hsai, protocol, datasize, nbslot);
347 status =
SAI_InitPCM(hsai, protocol, datasize, nbslot);
371 uint32_t tmpregisterGCR;
373 uint32_t syncen_bits;
399 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 416 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 424 if ((hsai->
Instance != SAI1_Block_A) ||
438 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 470 case SAI_SYNCEXT_DISABLE :
473 case SAI_SYNCEXT_OUTBLOCKA_ENABLE :
474 tmpregisterGCR = SAI_GCR_SYNCOUT_0;
476 case SAI_SYNCEXT_OUTBLOCKB_ENABLE :
477 tmpregisterGCR = SAI_GCR_SYNCOUT_1;
486 case SAI_ASYNCHRONOUS :
489 case SAI_SYNCHRONOUS :
490 syncen_bits = SAI_xCR1_SYNCEN_0;
492 case SAI_SYNCHRONOUS_EXT_SAI1 :
493 syncen_bits = SAI_xCR1_SYNCEN_1;
495 case SAI_SYNCHRONOUS_EXT_SAI2 :
496 syncen_bits = SAI_xCR1_SYNCEN_1;
497 tmpregisterGCR |= SAI_GCR_SYNCIN_0;
504 #if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || \ 505 defined(STM32L496xx) || defined(STM32L4A6xx) || \ 506 defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 510 SAI1->GCR = tmpregisterGCR;
514 SAI2->GCR = tmpregisterGCR;
519 SAI1->GCR = tmpregisterGCR;
531 #if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || \ 532 defined(STM32L496xx) || defined(STM32L4A6xx) || \ 533 defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 553 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 576 if ((tmpval % 10U) > 8U)
590 if ((tmpval % 10U) > 8U)
603 ckstr_bits = (hsai->
Init.
ClockStrobing == SAI_CLOCKSTROBING_RISINGEDGE) ? 0U : SAI_xCR1_CKSTR;
608 ckstr_bits = (hsai->
Init.
ClockStrobing == SAI_CLOCKSTROBING_RISINGEDGE) ? SAI_xCR1_CKSTR : 0U;
613 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 614 hsai->
Instance->CR1 &= ~(SAI_xCR1_MODE | SAI_xCR1_PRTCFG | SAI_xCR1_DS | \
615 SAI_xCR1_LSBFIRST | SAI_xCR1_CKSTR | SAI_xCR1_SYNCEN | \
616 SAI_xCR1_MONO | SAI_xCR1_OUTDRIV | SAI_xCR1_DMAEN | \
617 SAI_xCR1_NOMCK | SAI_xCR1_MCKDIV | SAI_xCR1_OSR);
621 ckstr_bits | syncen_bits | \
623 hsai->Init.NoDivider | (hsai->
Init.
Mckdiv << 20) | \
626 hsai->
Instance->CR1 &= ~(SAI_xCR1_MODE | SAI_xCR1_PRTCFG | SAI_xCR1_DS | \
627 SAI_xCR1_LSBFIRST | SAI_xCR1_CKSTR | SAI_xCR1_SYNCEN | \
628 SAI_xCR1_MONO | SAI_xCR1_OUTDRIV | SAI_xCR1_DMAEN | \
629 SAI_xCR1_NODIV | SAI_xCR1_MCKDIV);
633 ckstr_bits | syncen_bits | \
635 hsai->Init.NoDivider | (hsai->
Init.
Mckdiv << 20));
639 hsai->
Instance->CR2 &= ~(SAI_xCR2_FTH | SAI_xCR2_FFLUSH | SAI_xCR2_COMP | SAI_xCR2_CPL);
643 hsai->
Instance->FRCR &= (~(SAI_xFRCR_FRL | SAI_xFRCR_FSALL | SAI_xFRCR_FSDEF | \
644 SAI_xFRCR_FSPOL | SAI_xFRCR_FSOFF));
653 hsai->
Instance->SLOTR &= (~(SAI_xSLOTR_FBOFF | SAI_xSLOTR_SLOTSZ | \
654 SAI_xSLOTR_NBSLOT | SAI_xSLOTR_SLOTEN));
659 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 664 SAI1->PDMCR &= ~(SAI_PDMCR_PDMEN);
670 SAI1->PDMCR |= SAI_PDMCR_PDMEN;
705 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
720 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
722 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 730 SAI1->PDMCR &= ~(SAI_PDMCR_PDMEN);
735 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 789 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 810 HAL_StatusTypeDef status =
HAL_OK;
812 if (pCallback == NULL)
815 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
848 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
866 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
875 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
901 HAL_StatusTypeDef status =
HAL_OK;
930 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
948 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
957 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
1025 if ((pData == NULL) || (Size == 0U))
1042 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1047 __HAL_SAI_ENABLE(hsai);
1053 if ((hsai->
Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_FULL)
1062 temp = (uint32_t)(*hsai->
pBuffPtr);
1064 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
1070 temp = (uint32_t)(*hsai->
pBuffPtr);
1072 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
1074 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 16);
1076 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 24);
1085 if ((((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) && (Timeout != HAL_MAX_DELAY))
1088 hsai->
ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
1091 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
1098 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
1138 if ((pData == NULL) || (Size == 0U))
1155 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1158 __HAL_SAI_ENABLE(hsai);
1164 if ((hsai->
Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_EMPTY)
1176 *hsai->
pBuffPtr = (uint8_t)(temp >> 8);
1184 *hsai->
pBuffPtr = (uint8_t)(temp >> 8);
1186 *hsai->
pBuffPtr = (uint8_t)(temp >> 16);
1188 *hsai->
pBuffPtr = (uint8_t)(temp >> 24);
1196 if ((((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) && (Timeout != HAL_MAX_DELAY))
1199 hsai->
ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
1202 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
1209 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
1245 if ((pData == NULL) || (Size == 0U))
1281 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1284 __HAL_SAI_ENABLE(hsai);
1307 if ((pData == NULL) || (Size == 0U))
1340 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1343 __HAL_SAI_ENABLE(hsai);
1369 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
1389 hsai->
Instance->CR1 |= SAI_xCR1_DMAEN;
1392 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1395 __HAL_SAI_ENABLE(hsai);
1412 HAL_StatusTypeDef status =
HAL_OK;
1418 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
1455 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
1474 HAL_StatusTypeDef status =
HAL_OK;
1480 if ((hsai->
Instance->CR1 & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1483 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
1516 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
1525 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
1548 if ((pData == NULL) || (Size == 0U))
1587 hsai->
Instance->CR1 |= SAI_xCR1_DMAEN;
1590 while ((hsai->
Instance->SR & SAI_xSR_FLVL) == SAI_FIFOSTATUS_EMPTY)
1593 if ((
HAL_GetTick() - tickstart) > SAI_LONG_TIMEOUT)
1596 hsai->
ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
1606 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1609 __HAL_SAI_ENABLE(hsai);
1634 if ((pData == NULL) || (Size == 0U))
1670 if ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1673 __HAL_SAI_ENABLE(hsai);
1680 hsai->
Instance->CR1 |= SAI_xCR1_DMAEN;
1707 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_MUTE | (uint32_t)val);
1745 SET_BIT(hsai->
Instance->CR2, (uint32_t)((uint32_t)counter << SAI_xCR2_MUTECNT_Pos));
1748 __HAL_SAI_ENABLE_IT(hsai, SAI_IT_MUTEDET);
1767 __HAL_SAI_DISABLE_IT(hsai, SAI_IT_MUTEDET);
1783 uint32_t itflags = hsai->
Instance->SR;
1784 uint32_t itsources = hsai->
Instance->IMR;
1785 uint32_t cr1config = hsai->
Instance->CR1;
1789 if (((itflags & SAI_xSR_FREQ) == SAI_xSR_FREQ) && ((itsources & SAI_IT_FREQ) == SAI_IT_FREQ))
1794 else if (((itflags & SAI_FLAG_OVRUDR) == SAI_FLAG_OVRUDR) && ((itsources & SAI_IT_OVRUDR) == SAI_IT_OVRUDR))
1797 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
1803 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 1810 else if (((itflags & SAI_FLAG_MUTEDET) == SAI_FLAG_MUTEDET) && ((itsources & SAI_IT_MUTEDET) == SAI_IT_MUTEDET))
1813 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_MUTEDET);
1822 else if (((itflags & SAI_FLAG_AFSDET) == SAI_FLAG_AFSDET) && ((itsources & SAI_IT_AFSDET) == SAI_IT_AFSDET))
1825 hsai->
ErrorCode |= HAL_SAI_ERROR_AFSDET;
1828 if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1831 if (hsai->
hdmatx != NULL)
1843 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 1850 if (hsai->
hdmarx != NULL)
1862 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 1877 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 1885 else if (((itflags & SAI_FLAG_LFSDET) == SAI_FLAG_LFSDET) && ((itsources & SAI_IT_LFSDET) == SAI_IT_LFSDET))
1888 hsai->
ErrorCode |= HAL_SAI_ERROR_LFSDET;
1891 if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1894 if (hsai->
hdmatx != NULL)
1906 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 1913 if (hsai->
hdmarx != NULL)
1925 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 1940 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 1948 else if (((itflags & SAI_FLAG_WCKCFG) == SAI_FLAG_WCKCFG) && ((itsources & SAI_IT_WCKCFG) == SAI_IT_WCKCFG))
1951 hsai->
ErrorCode |= HAL_SAI_ERROR_WCKCFG;
1954 if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1957 if (hsai->
hdmatx != NULL)
1969 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 1976 if (hsai->
hdmarx != NULL)
1988 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2001 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
2009 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2017 else if (((itflags & SAI_FLAG_CNRDY) == SAI_FLAG_CNRDY) && ((itsources & SAI_IT_CNRDY) == SAI_IT_CNRDY))
2020 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_CNRDY);
2022 hsai->
ErrorCode |= HAL_SAI_ERROR_CNREADY;
2024 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2184 HAL_StatusTypeDef status =
HAL_OK;
2205 if ((nbslot & 0x1U) != 0U)
2212 case SAI_I2S_STANDARD :
2216 case SAI_I2S_MSBJUSTIFIED :
2217 case SAI_I2S_LSBJUSTIFIED :
2229 case SAI_PROTOCOL_DATASIZE_16BIT:
2235 case SAI_PROTOCOL_DATASIZE_16BITEXTENDED :
2241 case SAI_PROTOCOL_DATASIZE_24BIT:
2247 case SAI_PROTOCOL_DATASIZE_32BIT:
2257 if (protocol == SAI_I2S_LSBJUSTIFIED)
2259 if (datasize == SAI_PROTOCOL_DATASIZE_16BITEXTENDED)
2263 if (datasize == SAI_PROTOCOL_DATASIZE_24BIT)
2283 HAL_StatusTypeDef status =
HAL_OK;
2307 case SAI_PCM_SHORT :
2320 case SAI_PROTOCOL_DATASIZE_16BIT:
2325 case SAI_PROTOCOL_DATASIZE_16BITEXTENDED :
2330 case SAI_PROTOCOL_DATASIZE_24BIT :
2335 case SAI_PROTOCOL_DATASIZE_32BIT:
2359 while (((hsai->
Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_FULL) && (hsai->
XferCount > 0U))
2368 temp = (uint32_t)(*hsai->
pBuffPtr);
2370 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
2376 temp = (uint32_t)(*hsai->
pBuffPtr);
2378 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
2380 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 16);
2382 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 24);
2399 uint32_t tmpIT = SAI_IT_OVRUDR;
2403 tmpIT |= SAI_IT_FREQ;
2409 tmpIT |= SAI_IT_CNRDY;
2414 tmpIT |= SAI_IT_AFSDET | SAI_IT_LFSDET;
2419 tmpIT |= SAI_IT_WCKCFG;
2432 register uint32_t count = SAI_DEFAULT_TIMEOUT * (SystemCoreClock / 7U / 1000U);
2433 HAL_StatusTypeDef status =
HAL_OK;
2436 __HAL_SAI_DISABLE(hsai);
2444 hsai->
ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
2445 status = HAL_TIMEOUT;
2450 while ((hsai->
Instance->CR1 & SAI_xCR1_SAIEN) != 0U);
2469 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2498 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2508 temp = (uint32_t)(*hsai->
pBuffPtr);
2510 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
2531 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2541 temp = (uint32_t)(*hsai->
pBuffPtr);
2543 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
2545 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 16);
2547 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 24);
2574 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
2577 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2599 *hsai->
pBuffPtr = (uint8_t)(temp >> 8);
2610 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
2613 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2635 *hsai->
pBuffPtr = (uint8_t)(temp >> 8);
2637 *hsai->
pBuffPtr = (uint8_t)(temp >> 16);
2639 *hsai->
pBuffPtr = (uint8_t)(temp >> 24);
2650 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
2653 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2671 if (hdma->
Init.Mode != DMA_CIRCULAR)
2676 hsai->
Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
2683 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2700 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2717 if (hdma->
Init.Mode != DMA_CIRCULAR)
2720 hsai->
Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
2728 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2745 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2766 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
2779 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1) 2797 hsai->
Instance->CR1 &= ~SAI_xCR1_DMAEN;
2801 hsai->
Instance->CLRFR = 0xFFFFFFFFU;
2803 if (hsai->
ErrorCode != HAL_SAI_ERROR_WCKCFG)
2810 SET_BIT(hsai->
Instance->CR2, SAI_xCR2_FFLUSH);
2819 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
DMA_HandleTypeDef * hdmarx
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_SAI_StateTypeDef HAL_SAI_GetState(SAI_HandleTypeDef *hsai)
Return the SAI handle state.
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
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_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
DMA SAI receive process half complete callback.
static void SAI_FillFifo(SAI_HandleTypeDef *hsai)
Fill the fifo.
static HAL_StatusTypeDef SAI_Disable(SAI_HandleTypeDef *hsai)
Disable the SAI and wait for the disabling.
void(* TxCpltCallback)(struct __SAI_HandleTypeDef *hsai)
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.
DMA handle Structure definition.
void HAL_SAI_IRQHandler(SAI_HandleTypeDef *hsai)
Handle SAI interrupt request.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
if(lpuartdiv >=LPUART_BRR_MIN_VALUE)
HAL_SAI_CallbackIDTypeDef
SAI callback ID enumeration definition.
static void SAI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
DMA SAI transmit process half complete callback.
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef HAL_SAI_DeInit(SAI_HandleTypeDef *hsai)
DeInitialize the SAI peripheral.
HAL_StatusTypeDef HAL_SAI_DMAStop(SAI_HandleTypeDef *hsai)
Stop the audio stream playing from the Media.
void(* RxHalfCpltCallback)(struct __SAI_HandleTypeDef *hsai)
void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
Rx Transfer half completed callback.
void(* RxCpltCallback)(struct __SAI_HandleTypeDef *hsai)
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.
static uint32_t SAI_InterruptFlag(const SAI_HandleTypeDef *hsai, SAI_ModeTypedef mode)
Return the interrupt flag to set according the SAI setup.
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
uint32_t HAL_SAI_GetError(SAI_HandleTypeDef *hsai)
Return the SAI error code.
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
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...
static void SAI_Transmit_IT8Bit(SAI_HandleTypeDef *hsai)
Tx Handler for Transmit in Interrupt mode 8-Bit transfer.
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.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
SAI_Block_TypeDef * Instance
DMA_HandleTypeDef * hdmatx
__IO HAL_SAI_StateTypeDef State
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.
void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai)
SAI error callback.
HAL_StatusTypeDef HAL_SAI_DMAResume(SAI_HandleTypeDef *hsai)
Resume the audio stream playing from the Media.
void(* InterruptServiceRoutine)(struct __SAI_HandleTypeDef *hsai)
void(* pSAI_CallbackTypeDef)(SAI_HandleTypeDef *hsai)
SAI callback pointer definition.
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
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_UnRegisterCallback(SAI_HandleTypeDef *hsai, HAL_SAI_CallbackIDTypeDef CallbackID)
Unregister a user SAI callback. SAI callback is redirected to the weak predefined callback...
static void SAI_DMAError(DMA_HandleTypeDef *hdma)
DMA SAI communication error callback.
HAL_StatusTypeDef HAL_SAI_Init(SAI_HandleTypeDef *hsai)
Initialize the SAI according to the specified parameters. in the SAI_InitTypeDef structure and initia...
SAI_SlotInitTypeDef SlotInit
static void SAI_DMAAbort(DMA_HandleTypeDef *hdma)
DMA SAI Abort callback.
uint32_t ActiveFrameLength
HAL_StatusTypeDef HAL_SAI_EnableTxMuteMode(SAI_HandleTypeDef *hsai, uint16_t val)
Enable the Tx mute mode.
void HAL_SAI_MspDeInit(SAI_HandleTypeDef *hsai)
DeInitialize the SAI MSP.
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.
FunctionalState Activation
HAL_SAI_StateTypeDef
HAL State structures definition.
void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
Rx Transfer completed callback.
static void SAI_Transmit_IT32Bit(SAI_HandleTypeDef *hsai)
Tx Handler for Transmit in Interrupt mode for 32-Bit transfer.
static void SAI_DMATxCplt(DMA_HandleTypeDef *hdma)
DMA SAI transmit process complete callback.
SAI_FrameInitTypeDef FrameInit
HAL_StatusTypeDef HAL_SAI_EnableRxMuteMode(SAI_HandleTypeDef *hsai, SAIcallback callback, uint16_t counter)
Enable the Rx mute detection.
static void SAI_DMARxCplt(DMA_HandleTypeDef *hdma)
DMA SAI receive process complete callback.
uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk)
Return the peripheral clock frequency for peripherals with clock source from PLLSAIs.
void(* SAIcallback)(void)
SAI Callback prototype.
static void SAI_Receive_IT8Bit(SAI_HandleTypeDef *hsai)
Rx Handler for Receive in Interrupt mode 8-Bit transfer.
SAI_PdmInitTypeDef PdmInit
static void SAI_Transmit_IT16Bit(SAI_HandleTypeDef *hsai)
Tx Handler for Transmit in Interrupt mode for 16-Bit transfer.
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(* MspDeInitCallback)(struct __SAI_HandleTypeDef *hsai)
void HAL_SAI_MspInit(SAI_HandleTypeDef *hsai)
Initialize the SAI MSP.
void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
Tx Transfer completed callback.
void(* TxHalfCpltCallback)(struct __SAI_HandleTypeDef *hsai)
void(* MspInitCallback)(struct __SAI_HandleTypeDef *hsai)
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...
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))
HAL_StatusTypeDef HAL_SAI_DMAPause(SAI_HandleTypeDef *hsai)
Pause the audio stream playing from the Media.
HAL_StatusTypeDef HAL_SAI_Abort(SAI_HandleTypeDef *hsai)
Abort the current transfer and disable the SAI.
void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
Tx Transfer Half completed callback.
static void SAI_Receive_IT32Bit(SAI_HandleTypeDef *hsai)
Rx Handler for Receive in Interrupt mode for 32-Bit transfer.
void(* ErrorCallback)(struct __SAI_HandleTypeDef *hsai)
HAL_StatusTypeDef HAL_SAI_DisableTxMuteMode(SAI_HandleTypeDef *hsai)
Disable the Tx mute mode.
static void SAI_Receive_IT16Bit(SAI_HandleTypeDef *hsai)
Rx Handler for Receive in Interrupt mode for 16-Bit transfer.