217 #include "stm32h7xx_hal.h"
228 #ifdef HAL_SAI_MODULE_ENABLED
247 #define SAI_DEFAULT_TIMEOUT 4U
248 #define SAI_LONG_TIMEOUT 1000U
260 static uint32_t SAI_InterruptFlag(
const SAI_HandleTypeDef *hsai, SAI_ModeTypedef mode);
344 status = SAI_InitI2S(hsai, protocol, datasize, nbslot);
348 status = SAI_InitPCM(hsai, protocol, datasize, nbslot);
372 uint32_t tmpregisterGCR;
374 uint32_t syncen_bits;
394 #if defined(SAI_VER_V2_X)
452 SaiBaseAddress =
SAI1;
457 SaiBaseAddress =
SAI2;
463 SaiBaseAddress =
SAI3;
469 SaiBaseAddress =
SAI4;
482 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
491 if (hsai->MspInitCallback ==
NULL)
495 hsai->MspInitCallback(hsai);
503 if(SAI_Disable(hsai) !=
HAL_OK)
546 case SAI_SYNCHRONOUS_EXT_SAI3 :
552 case SAI_SYNCHRONOUS_EXT_SAI4 :
563 SaiBaseAddress->
GCR = tmpregisterGCR;
577 #if defined(RCC_PERIPHCLK_SAI2)
619 uint32_t tmpframelength;
624 tmpframelength = 64U;
629 tmpframelength = 256U;
651 if ((tmpval % 10U) > 8U)
680 #if defined(SAI_VER_V2_X)
692 ckstr_bits | syncen_bits | \
694 hsai->Init.NoDivider | (hsai->
Init.
Mckdiv << 20) | \
706 ckstr_bits | syncen_bits | \
708 hsai->Init.NoDivider | (hsai->
Init.
Mckdiv << 20) | \
720 ckstr_bits | syncen_bits | \
722 hsai->Init.NoDivider | (hsai->
Init.
Mckdiv << 20) | \
800 if (SAI_Disable(hsai) !=
HAL_OK)
825 SaiBaseAddress =
SAI1;
829 SaiBaseAddress->
PDMDLY = 0U;
836 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
837 if (hsai->MspDeInitCallback ==
NULL)
841 hsai->MspDeInitCallback(hsai);
890 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
908 HAL_SAI_CallbackIDTypeDef CallbackID,
909 pSAI_CallbackTypeDef pCallback)
913 if (pCallback ==
NULL)
916 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
926 case HAL_SAI_RX_COMPLETE_CB_ID :
927 hsai->RxCpltCallback = pCallback;
929 case HAL_SAI_RX_HALFCOMPLETE_CB_ID :
930 hsai->RxHalfCpltCallback = pCallback;
932 case HAL_SAI_TX_COMPLETE_CB_ID :
933 hsai->TxCpltCallback = pCallback;
935 case HAL_SAI_TX_HALFCOMPLETE_CB_ID :
936 hsai->TxHalfCpltCallback = pCallback;
938 case HAL_SAI_ERROR_CB_ID :
939 hsai->ErrorCallback = pCallback;
941 case HAL_SAI_MSPINIT_CB_ID :
942 hsai->MspInitCallback = pCallback;
944 case HAL_SAI_MSPDEINIT_CB_ID :
945 hsai->MspDeInitCallback = pCallback;
949 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
959 case HAL_SAI_MSPINIT_CB_ID :
960 hsai->MspInitCallback = pCallback;
962 case HAL_SAI_MSPDEINIT_CB_ID :
963 hsai->MspDeInitCallback = pCallback;
967 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
976 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
1000 HAL_SAI_CallbackIDTypeDef CallbackID)
1008 case HAL_SAI_RX_COMPLETE_CB_ID :
1011 case HAL_SAI_RX_HALFCOMPLETE_CB_ID :
1014 case HAL_SAI_TX_COMPLETE_CB_ID :
1017 case HAL_SAI_TX_HALFCOMPLETE_CB_ID :
1020 case HAL_SAI_ERROR_CB_ID :
1023 case HAL_SAI_MSPINIT_CB_ID :
1026 case HAL_SAI_MSPDEINIT_CB_ID :
1031 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
1041 case HAL_SAI_MSPINIT_CB_ID :
1044 case HAL_SAI_MSPDEINIT_CB_ID :
1049 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
1058 hsai->
ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
1126 if ((pData ==
NULL) || (Size == 0U))
1163 temp = (uint32_t)(*hsai->
pBuffPtr);
1165 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
1171 temp = (uint32_t)(*hsai->
pBuffPtr);
1173 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
1175 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 16);
1177 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 24);
1196 (void) SAI_Disable(hsai);
1239 if ((pData ==
NULL) || (Size == 0U))
1277 *hsai->
pBuffPtr = (uint8_t)(temp >> 8);
1285 *hsai->
pBuffPtr = (uint8_t)(temp >> 8);
1287 *hsai->
pBuffPtr = (uint8_t)(temp >> 16);
1289 *hsai->
pBuffPtr = (uint8_t)(temp >> 24);
1307 (void) SAI_Disable(hsai);
1346 if ((pData ==
NULL) || (Size == 0U))
1408 if ((pData ==
NULL) || (Size == 0U))
1550 if (SAI_Disable(hsai) !=
HAL_OK)
1620 if (SAI_Disable(hsai) !=
HAL_OK)
1649 if ((pData ==
NULL) || (Size == 0U))
1694 if ((
HAL_GetTick() - tickstart) > SAI_LONG_TIMEOUT)
1735 if ((pData ==
NULL) || (Size == 0U))
1904 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1905 hsai->ErrorCallback(hsai);
1947 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1948 hsai->ErrorCallback(hsai);
1966 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1967 hsai->ErrorCallback(hsai);
1981 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1982 hsai->ErrorCallback(hsai);
2013 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2014 hsai->ErrorCallback(hsai);
2032 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2033 hsai->ErrorCallback(hsai);
2047 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2048 hsai->ErrorCallback(hsai);
2079 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2080 hsai->ErrorCallback(hsai);
2098 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2099 hsai->ErrorCallback(hsai);
2119 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2120 hsai->ErrorCallback(hsai);
2134 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2135 hsai->ErrorCallback(hsai);
2315 if ((nbslot & 0x1U) != 0U)
2471 temp = (uint32_t)(*hsai->
pBuffPtr);
2473 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
2479 temp = (uint32_t)(*hsai->
pBuffPtr);
2481 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
2483 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 16);
2485 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 24);
2500 static uint32_t SAI_InterruptFlag(
const SAI_HandleTypeDef *hsai, SAI_ModeTypedef mode)
2504 if (mode == SAI_MODE_IT)
2572 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2573 hsai->TxCpltCallback(hsai);
2601 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2602 hsai->TxCpltCallback(hsai);
2611 temp = (uint32_t)(*hsai->
pBuffPtr);
2613 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
2634 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2635 hsai->TxCpltCallback(hsai);
2644 temp = (uint32_t)(*hsai->
pBuffPtr);
2646 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 8);
2648 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 16);
2650 temp |= ((uint32_t)(*hsai->
pBuffPtr) << 24);
2680 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2681 hsai->RxCpltCallback(hsai);
2702 *hsai->
pBuffPtr = (uint8_t)(temp >> 8);
2716 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2717 hsai->RxCpltCallback(hsai);
2738 *hsai->
pBuffPtr = (uint8_t)(temp >> 8);
2740 *hsai->
pBuffPtr = (uint8_t)(temp >> 16);
2742 *hsai->
pBuffPtr = (uint8_t)(temp >> 24);
2756 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2757 hsai->RxCpltCallback(hsai);
2786 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2787 hsai->TxCpltCallback(hsai);
2803 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2804 hsai->TxHalfCpltCallback(hsai);
2831 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2832 hsai->RxCpltCallback(hsai);
2848 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2849 hsai->RxHalfCpltCallback(hsai);
2876 (void) SAI_Disable(hsai);
2885 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2886 hsai->ErrorCallback(hsai);
2914 (void) SAI_Disable(hsai);
2926 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2927 hsai->ErrorCallback(hsai);