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
262static void SAI_FillFifo(SAI_HandleTypeDef *hsai);
263static uint32_t SAI_InterruptFlag(
const SAI_HandleTypeDef *hsai, uint32_t mode);
264static HAL_StatusTypeDef SAI_InitI2S(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot);
265static HAL_StatusTypeDef SAI_InitPCM(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot);
268static void SAI_Transmit_IT8Bit(SAI_HandleTypeDef *hsai);
269static void SAI_Transmit_IT16Bit(SAI_HandleTypeDef *hsai);
270static void SAI_Transmit_IT32Bit(SAI_HandleTypeDef *hsai);
271static void SAI_Receive_IT8Bit(SAI_HandleTypeDef *hsai);
272static void SAI_Receive_IT16Bit(SAI_HandleTypeDef *hsai);
273static void SAI_Receive_IT32Bit(SAI_HandleTypeDef *hsai);
333HAL_StatusTypeDef HAL_SAI_InitProtocol(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
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);
359 status = HAL_SAI_Init(hsai);
374 uint32_t tmpregisterGCR = 0U;
381 uint32_t ckstr_bits = 0U;
382 uint32_t syncen_bits = 0U;
394 assert_param(IS_SAI_AUDIO_FREQUENCY(hsai->Init.AudioFrequency));
395 assert_param(IS_SAI_BLOCK_PROTOCOL(hsai->Init.Protocol));
397 assert_param(IS_SAI_BLOCK_SYNCEXT(hsai->Init.SynchroExt));
398 assert_param(IS_SAI_BLOCK_DATASIZE(hsai->Init.DataSize));
399 assert_param(IS_SAI_BLOCK_FIRST_BIT(hsai->Init.FirstBit));
400 assert_param(IS_SAI_BLOCK_CLOCK_STROBING(hsai->Init.ClockStrobing));
402 assert_param(IS_SAI_BLOCK_OUTPUT_DRIVE(hsai->Init.OutputDrive));
403 assert_param(IS_SAI_BLOCK_NODIVIDER(hsai->Init.NoDivider));
404 assert_param(IS_SAI_BLOCK_FIFO_THRESHOLD(hsai->Init.FIFOThreshold));
405 assert_param(IS_SAI_MONO_STEREO_MODE(hsai->Init.MonoStereoMode));
406 assert_param(IS_SAI_BLOCK_COMPANDING_MODE(hsai->Init.CompandingMode));
407 assert_param(IS_SAI_BLOCK_TRISTATE_MANAGEMENT(hsai->Init.TriState));
410 assert_param(IS_SAI_BLOCK_FRAME_LENGTH(hsai->FrameInit.FrameLength));
411 assert_param(IS_SAI_BLOCK_ACTIVE_FRAME(hsai->FrameInit.ActiveFrameLength));
412 assert_param(IS_SAI_BLOCK_FS_DEFINITION(hsai->FrameInit.FSDefinition));
413 assert_param(IS_SAI_BLOCK_FS_POLARITY(hsai->FrameInit.FSPolarity));
414 assert_param(IS_SAI_BLOCK_FS_OFFSET(hsai->FrameInit.FSOffset));
417 assert_param(IS_SAI_BLOCK_FIRSTBIT_OFFSET(hsai->SlotInit.FirstBitOffset));
418 assert_param(IS_SAI_BLOCK_SLOT_SIZE(hsai->SlotInit.SlotSize));
419 assert_param(IS_SAI_BLOCK_SLOT_NUMBER(hsai->SlotInit.SlotNumber));
420 assert_param(IS_SAI_SLOT_ACTIVE(hsai->SlotInit.SlotActive));
422 if (hsai->State == HAL_SAI_STATE_RESET)
427#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
429 hsai->RxCpltCallback = HAL_SAI_RxCpltCallback;
430 hsai->RxHalfCpltCallback = HAL_SAI_RxHalfCpltCallback;
431 hsai->TxCpltCallback = HAL_SAI_TxCpltCallback;
432 hsai->TxHalfCpltCallback = HAL_SAI_TxHalfCpltCallback;
433 hsai->ErrorCallback = HAL_SAI_ErrorCallback;
436 if (hsai->MspInitCallback == NULL)
438 hsai->MspInitCallback = HAL_SAI_MspInit;
440 hsai->MspInitCallback(hsai);
443 HAL_SAI_MspInit(hsai);
447 hsai->State = HAL_SAI_STATE_BUSY;
453 SAI_BlockSynchroConfig(hsai);
459 if (hsai->Init.AudioFrequency != SAI_AUDIO_FREQUENCY_MCKDIV)
462 freq = SAI_GetInputClock(hsai);
465 tmpregisterGCR = (((freq * 10U) / ((hsai->Init.AudioFrequency) * 512U)));
467 hsai->Init.Mckdiv = tmpregisterGCR / 10U;
470 if ((tmpregisterGCR % 10U) > 8U)
472 hsai->Init.Mckdiv += 1U;
476 if (hsai->Init.Protocol == SAI_SPDIF_PROTOCOL)
478 hsai->Init.Mckdiv = hsai->Init.Mckdiv >> 1;
483 assert_param(IS_SAI_BLOCK_MASTER_DIVIDER(hsai->Init.Mckdiv));
486 if ((hsai->Init.AudioMode == SAI_MODEMASTER_TX) || (hsai->Init.AudioMode == SAI_MODESLAVE_TX))
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;
496 switch (hsai->Init.Synchro)
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);
524 hsai->Instance->CR1 |= (hsai->Init.AudioMode | hsai->Init.Protocol | \
525 hsai->Init.DataSize | hsai->Init.FirstBit | \
526 ckstr_bits | syncen_bits | \
527 hsai->Init.MonoStereoMode | hsai->Init.OutputDrive | \
528 hsai->Init.NoDivider | (hsai->Init.Mckdiv << 20U));
531 hsai->Instance->CR2 &= ~(SAI_xCR2_FTH | SAI_xCR2_FFLUSH | SAI_xCR2_COMP | SAI_xCR2_CPL);
532 hsai->Instance->CR2 |= (hsai->Init.FIFOThreshold | hsai->Init.CompandingMode | hsai->Init.TriState);
535 hsai->Instance->FRCR &= (~(SAI_xFRCR_FRL | SAI_xFRCR_FSALL | SAI_xFRCR_FSDEF | \
536 SAI_xFRCR_FSPOL | SAI_xFRCR_FSOFF));
537 hsai->Instance->FRCR |= ((hsai->FrameInit.FrameLength - 1U) |
538 hsai->FrameInit.FSOffset |
539 hsai->FrameInit.FSDefinition |
540 hsai->FrameInit.FSPolarity |
541 ((hsai->FrameInit.ActiveFrameLength - 1U) << 8U));
545 hsai->Instance->SLOTR &= ~(SAI_xSLOTR_FBOFF | SAI_xSLOTR_SLOTSZ | \
546 SAI_xSLOTR_NBSLOT | SAI_xSLOTR_SLOTEN);
548 hsai->Instance->SLOTR |= hsai->SlotInit.FirstBitOffset | hsai->SlotInit.SlotSize | \
549 (hsai->SlotInit.SlotActive << 16U) | ((hsai->SlotInit.SlotNumber - 1U) << 8U);
552 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
555 hsai->State = HAL_SAI_STATE_READY;
577 hsai->State = HAL_SAI_STATE_BUSY;
580 hsai->Instance->IMR = 0U;
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)
593 hsai->MspDeInitCallback = HAL_SAI_MspDeInit;
595 hsai->MspDeInitCallback(hsai);
597 HAL_SAI_MspDeInit(hsai);
601 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
604 hsai->State = HAL_SAI_STATE_RESET;
618__weak
void HAL_SAI_MspInit(SAI_HandleTypeDef *hsai)
634__weak
void HAL_SAI_MspDeInit(SAI_HandleTypeDef *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;
676 if (HAL_SAI_STATE_READY == hsai->State)
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;
709 else if (HAL_SAI_STATE_RESET == hsai->State)
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)
758 if (HAL_SAI_STATE_READY == hsai->State)
762 case HAL_SAI_RX_COMPLETE_CB_ID :
763 hsai->RxCpltCallback = HAL_SAI_RxCpltCallback;
765 case HAL_SAI_RX_HALFCOMPLETE_CB_ID :
766 hsai->RxHalfCpltCallback = HAL_SAI_RxHalfCpltCallback;
768 case HAL_SAI_TX_COMPLETE_CB_ID :
769 hsai->TxCpltCallback = HAL_SAI_TxCpltCallback;
771 case HAL_SAI_TX_HALFCOMPLETE_CB_ID :
772 hsai->TxHalfCpltCallback = HAL_SAI_TxHalfCpltCallback;
774 case HAL_SAI_ERROR_CB_ID :
775 hsai->ErrorCallback = HAL_SAI_ErrorCallback;
777 case HAL_SAI_MSPINIT_CB_ID :
778 hsai->MspInitCallback = HAL_SAI_MspInit;
780 case HAL_SAI_MSPDEINIT_CB_ID :
781 hsai->MspDeInitCallback = HAL_SAI_MspDeInit;
785 hsai->ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
791 else if (HAL_SAI_STATE_RESET == hsai->State)
795 case HAL_SAI_MSPINIT_CB_ID :
796 hsai->MspInitCallback = HAL_SAI_MspInit;
798 case HAL_SAI_MSPDEINIT_CB_ID :
799 hsai->MspDeInitCallback = HAL_SAI_MspDeInit;
803 hsai->ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
812 hsai->ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
875HAL_StatusTypeDef HAL_SAI_Transmit(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size, uint32_t Timeout)
879 if ((pData == NULL) || (Size == 0))
884 if (hsai->State == HAL_SAI_STATE_READY)
889 hsai->XferSize = Size;
890 hsai->XferCount = Size;
891 hsai->pBuffPtr = pData;
892 hsai->State = HAL_SAI_STATE_BUSY_TX;
893 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
896 if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
901 __HAL_SAI_ENABLE(hsai);
904 while (hsai->XferCount > 0U)
907 if ((hsai->Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_FULL)
909 if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
911 hsai->Instance->DR = (*hsai->pBuffPtr++);
913 else if (hsai->Init.DataSize <= SAI_DATASIZE_16)
915 hsai->Instance->DR = *((uint16_t *)hsai->pBuffPtr);
916 hsai->pBuffPtr += 2U;
920 hsai->Instance->DR = *((uint32_t *)hsai->pBuffPtr);
921 hsai->pBuffPtr += 4U;
931 hsai->ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
934 hsai->Instance->CLRFR = 0xFFFFFFFFU;
940 SET_BIT(hsai->Instance->CR2, SAI_xCR2_FFLUSH);
943 hsai->State = HAL_SAI_STATE_READY;
953 hsai->State = HAL_SAI_STATE_READY;
975HAL_StatusTypeDef HAL_SAI_Receive(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size, uint32_t Timeout)
979 if ((pData == NULL) || (Size == 0))
984 if (hsai->State == HAL_SAI_STATE_READY)
989 hsai->pBuffPtr = pData;
990 hsai->XferSize = Size;
991 hsai->XferCount = Size;
992 hsai->State = HAL_SAI_STATE_BUSY_RX;
993 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
996 if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
999 __HAL_SAI_ENABLE(hsai);
1003 while (hsai->XferCount > 0U)
1005 if ((hsai->Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_EMPTY)
1007 if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
1009 (*hsai->pBuffPtr++) = hsai->Instance->DR;
1011 else if (hsai->Init.DataSize <= SAI_DATASIZE_16)
1013 *((uint16_t *)hsai->pBuffPtr) = hsai->Instance->DR;
1014 hsai->pBuffPtr += 2U;
1018 *((uint32_t *)hsai->pBuffPtr) = hsai->Instance->DR;
1019 hsai->pBuffPtr += 4U;
1029 hsai->ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
1032 hsai->Instance->CLRFR = 0xFFFFFFFFU;
1038 SET_BIT(hsai->Instance->CR2, SAI_xCR2_FFLUSH);
1041 hsai->State = HAL_SAI_STATE_READY;
1051 hsai->State = HAL_SAI_STATE_READY;
1072HAL_StatusTypeDef HAL_SAI_Transmit_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
1074 if ((pData == NULL) || (Size == 0))
1079 if (hsai->State == HAL_SAI_STATE_READY)
1084 hsai->pBuffPtr = pData;
1085 hsai->XferSize = Size;
1086 hsai->XferCount = Size;
1087 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
1088 hsai->State = HAL_SAI_STATE_BUSY_TX;
1090 if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
1092 hsai->InterruptServiceRoutine = SAI_Transmit_IT8Bit;
1094 else if (hsai->Init.DataSize <= SAI_DATASIZE_16)
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);
1134HAL_StatusTypeDef HAL_SAI_Receive_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
1136 if ((pData == NULL) || (Size == 0))
1141 if (hsai->State == HAL_SAI_STATE_READY)
1146 hsai->pBuffPtr = pData;
1147 hsai->XferSize = Size;
1148 hsai->XferCount = Size;
1149 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
1150 hsai->State = HAL_SAI_STATE_BUSY_RX;
1152 if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
1154 hsai->InterruptServiceRoutine = SAI_Receive_IT8Bit;
1156 else if (hsai->Init.DataSize <= SAI_DATASIZE_16)
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);
1250 hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
1253 if ((hsai->hdmatx != NULL) && (hsai->State == HAL_SAI_STATE_BUSY_TX))
1261 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1267 if ((hsai->hdmarx != NULL) && (hsai->State == HAL_SAI_STATE_BUSY_RX))
1275 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1281 SET_BIT(hsai->Instance->CR2, SAI_xCR2_FFLUSH);
1284 hsai->State = HAL_SAI_STATE_READY;
1309 if ((hsai->Instance->CR1 & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1312 hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
1315 if ((hsai->hdmatx != NULL) && (hsai->State == HAL_SAI_STATE_BUSY_TX))
1323 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1329 if ((hsai->hdmarx != NULL) && (hsai->State == HAL_SAI_STATE_BUSY_RX))
1337 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1344 hsai->Instance->IMR = 0U;
1345 hsai->Instance->CLRFR = 0xFFFFFFFFU;
1348 SET_BIT(hsai->Instance->CR2, SAI_xCR2_FFLUSH);
1351 hsai->State = HAL_SAI_STATE_READY;
1367HAL_StatusTypeDef HAL_SAI_Transmit_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
1371 if ((pData == NULL) || (Size == 0))
1376 if (hsai->State == HAL_SAI_STATE_READY)
1381 hsai->pBuffPtr = pData;
1382 hsai->XferSize = Size;
1383 hsai->XferCount = Size;
1384 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
1385 hsai->State = HAL_SAI_STATE_BUSY_TX;
1388 hsai->hdmatx->XferHalfCpltCallback = SAI_DMATxHalfCplt;
1391 hsai->hdmatx->XferCpltCallback = SAI_DMATxCplt;
1394 hsai->hdmatx->XferErrorCallback = SAI_DMAError;
1397 hsai->hdmatx->XferAbortCallback = NULL;
1400 if (
HAL_DMA_Start_IT(hsai->hdmatx, (uint32_t)hsai->pBuffPtr, (uint32_t)&hsai->Instance->DR, hsai->XferSize) !=
HAL_OK)
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);
1454HAL_StatusTypeDef HAL_SAI_Receive_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
1456 if ((pData == NULL) || (Size == 0))
1461 if (hsai->State == HAL_SAI_STATE_READY)
1466 hsai->pBuffPtr = pData;
1467 hsai->XferSize = Size;
1468 hsai->XferCount = Size;
1469 hsai->ErrorCode = HAL_SAI_ERROR_NONE;
1470 hsai->State = HAL_SAI_STATE_BUSY_RX;
1473 hsai->hdmarx->XferHalfCpltCallback = SAI_DMARxHalfCplt;
1476 hsai->hdmarx->XferCpltCallback = SAI_DMARxCplt;
1479 hsai->hdmarx->XferErrorCallback = SAI_DMAError;
1482 hsai->hdmarx->XferAbortCallback = NULL;
1485 if (
HAL_DMA_Start_IT(hsai->hdmarx, (uint32_t)&hsai->Instance->DR, (uint32_t)hsai->pBuffPtr, hsai->XferSize) !=
HAL_OK)
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);
1522HAL_StatusTypeDef HAL_SAI_EnableTxMuteMode(SAI_HandleTypeDef *hsai, uint16_t val)
1526 if (hsai->State != HAL_SAI_STATE_RESET)
1528 CLEAR_BIT(hsai->Instance->CR2, SAI_xCR2_MUTEVAL | SAI_xCR2_MUTE);
1529 SET_BIT(hsai->Instance->CR2, SAI_xCR2_MUTE | val);
1543 if (hsai->State != HAL_SAI_STATE_RESET)
1545 CLEAR_BIT(hsai->Instance->CR2, SAI_xCR2_MUTEVAL | SAI_xCR2_MUTE);
1559HAL_StatusTypeDef HAL_SAI_EnableRxMuteMode(SAI_HandleTypeDef *hsai, SAIcallback callback, uint16_t counter)
1563 if (hsai->State != HAL_SAI_STATE_RESET)
1566 CLEAR_BIT(hsai->Instance->CR2, SAI_xCR2_MUTECNT);
1567 SET_BIT(hsai->Instance->CR2, (uint32_t)((uint32_t)counter << SAI_xCR2_MUTECNT_Pos));
1568 hsai->mutecallback = callback;
1570 __HAL_SAI_ENABLE_IT(hsai, SAI_IT_MUTEDET);
1584 if (hsai->State != HAL_SAI_STATE_RESET)
1587 hsai->mutecallback = (SAIcallback)NULL;
1589 __HAL_SAI_DISABLE_IT(hsai, SAI_IT_MUTEDET);
1601void HAL_SAI_IRQHandler(SAI_HandleTypeDef *hsai)
1603 if (hsai->State != HAL_SAI_STATE_RESET)
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);
1622 tmperror = ((hsai->State == HAL_SAI_STATE_BUSY_RX) ? HAL_SAI_ERROR_OVR : HAL_SAI_ERROR_UDR);
1625 hsai->ErrorCode |= tmperror;
1628#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1629 hsai->ErrorCallback(hsai);
1631 HAL_SAI_ErrorCallback(hsai);
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);
1641 if (hsai->mutecallback != (SAIcallback)NULL)
1644 hsai->mutecallback();
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)
1663 hsai->hdmatx->XferAbortCallback = SAI_DMAAbort;
1669 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1672#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1673 hsai->ErrorCallback(hsai);
1675 HAL_SAI_ErrorCallback(hsai);
1679 else if (hsai->hdmarx != NULL)
1682 hsai->hdmarx->XferAbortCallback = SAI_DMAAbort;
1688 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1691#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1692 hsai->ErrorCallback(hsai);
1694 HAL_SAI_ErrorCallback(hsai);
1702 HAL_SAI_Abort(hsai);
1705#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1706 hsai->ErrorCallback(hsai);
1708 HAL_SAI_ErrorCallback(hsai);
1713 else if (((itflags & SAI_FLAG_LFSDET) == SAI_FLAG_LFSDET) && ((itsources & SAI_IT_LFSDET) == SAI_IT_LFSDET))
1716 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_LFSDET);
1719 hsai->ErrorCode |= HAL_SAI_ERROR_LFSDET;
1722 if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1725 if (hsai->hdmatx != NULL)
1728 hsai->hdmatx->XferAbortCallback = SAI_DMAAbort;
1734 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1737#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1738 hsai->ErrorCallback(hsai);
1740 HAL_SAI_ErrorCallback(hsai);
1744 else if (hsai->hdmarx != NULL)
1747 hsai->hdmarx->XferAbortCallback = SAI_DMAAbort;
1753 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1756#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1757 hsai->ErrorCallback(hsai);
1759 HAL_SAI_ErrorCallback(hsai);
1767 HAL_SAI_Abort(hsai);
1770#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1771 hsai->ErrorCallback(hsai);
1773 HAL_SAI_ErrorCallback(hsai);
1778 else if (((itflags & SAI_FLAG_WCKCFG) == SAI_FLAG_WCKCFG) && ((itsources & SAI_IT_WCKCFG) == SAI_IT_WCKCFG))
1781 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_WCKCFG);
1784 hsai->ErrorCode |= HAL_SAI_ERROR_WCKCFG;
1787 if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1790 if (hsai->hdmatx != NULL)
1793 hsai->hdmatx->XferAbortCallback = SAI_DMAAbort;
1799 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1802#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1803 hsai->ErrorCallback(hsai);
1805 HAL_SAI_ErrorCallback(hsai);
1809 else if (hsai->hdmarx != NULL)
1812 hsai->hdmarx->XferAbortCallback = SAI_DMAAbort;
1818 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1821#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1822 hsai->ErrorCallback(hsai);
1824 HAL_SAI_ErrorCallback(hsai);
1833 hsai->Instance->IMR = 0U;
1834 hsai->Instance->CLRFR = 0xFFFFFFFFU;
1837 hsai->State = HAL_SAI_STATE_READY;
1840 hsai->XferCount = 0U;
1843#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1844 hsai->ErrorCallback(hsai);
1846 HAL_SAI_ErrorCallback(hsai);
1851 else if (((itflags & SAI_FLAG_CNRDY) == SAI_FLAG_CNRDY) && ((itsources & SAI_IT_CNRDY) == SAI_IT_CNRDY))
1854 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_CNRDY);
1857 hsai->ErrorCode |= HAL_SAI_ERROR_CNREADY;
1860#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1861 hsai->ErrorCallback(hsai);
1863 HAL_SAI_ErrorCallback(hsai);
1879__weak
void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
1895__weak
void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
1911__weak
void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
1927__weak
void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
1943__weak
void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai)
1978HAL_SAI_StateTypeDef HAL_SAI_GetState(
const SAI_HandleTypeDef *hsai)
1989uint32_t HAL_SAI_GetError(
const SAI_HandleTypeDef *hsai)
1991 return hsai->ErrorCode;
2018static HAL_StatusTypeDef SAI_InitI2S(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
2020 hsai->Init.Protocol = SAI_FREE_PROTOCOL;
2021 hsai->Init.FirstBit = SAI_FIRSTBIT_MSB;
2023 if ((hsai->Init.AudioMode == SAI_MODEMASTER_TX) || (hsai->Init.AudioMode == SAI_MODESLAVE_TX))
2026 hsai->Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE;
2031 hsai->Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE;
2033 hsai->FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION;
2034 hsai->SlotInit.SlotActive = SAI_SLOTACTIVE_ALL;
2035 hsai->SlotInit.FirstBitOffset = 0U;
2036 hsai->SlotInit.SlotNumber = nbslot;
2039 if ((nbslot & 0x1U) != 0U)
2044 if (protocol == SAI_I2S_STANDARD)
2046 hsai->FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW;
2047 hsai->FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
2052 hsai->FrameInit.FSPolarity = SAI_FS_ACTIVE_HIGH;
2053 hsai->FrameInit.FSOffset = SAI_FS_FIRSTBIT;
2059 case SAI_PROTOCOL_DATASIZE_16BIT:
2060 hsai->Init.DataSize = SAI_DATASIZE_16;
2061 hsai->FrameInit.FrameLength = 32U * (nbslot / 2U);
2062 hsai->FrameInit.ActiveFrameLength = 16U * (nbslot / 2U);
2063 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_16B;
2065 case SAI_PROTOCOL_DATASIZE_16BITEXTENDED :
2066 hsai->Init.DataSize = SAI_DATASIZE_16;
2067 hsai->FrameInit.FrameLength = 64U * (nbslot / 2U);
2068 hsai->FrameInit.ActiveFrameLength = 32U * (nbslot / 2U);
2069 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_32B;
2071 case SAI_PROTOCOL_DATASIZE_24BIT:
2072 hsai->Init.DataSize = SAI_DATASIZE_24;
2073 hsai->FrameInit.FrameLength = 64U * (nbslot / 2U);
2074 hsai->FrameInit.ActiveFrameLength = 32U * (nbslot / 2U);
2075 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_32B;
2077 case SAI_PROTOCOL_DATASIZE_32BIT:
2078 hsai->Init.DataSize = SAI_DATASIZE_32;
2079 hsai->FrameInit.FrameLength = 64U * (nbslot / 2U);
2080 hsai->FrameInit.ActiveFrameLength = 32U * (nbslot / 2U);
2081 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_32B;
2086 if (protocol == SAI_I2S_LSBJUSTIFIED)
2088 if (datasize == SAI_PROTOCOL_DATASIZE_16BITEXTENDED)
2090 hsai->SlotInit.FirstBitOffset = 16U;
2092 if (datasize == SAI_PROTOCOL_DATASIZE_24BIT)
2094 hsai->SlotInit.FirstBitOffset = 8U;
2110static HAL_StatusTypeDef SAI_InitPCM(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
2112 hsai->Init.Protocol = SAI_FREE_PROTOCOL;
2113 hsai->Init.FirstBit = SAI_FIRSTBIT_MSB;
2115 if ((hsai->Init.AudioMode == SAI_MODEMASTER_TX) || (hsai->Init.AudioMode == SAI_MODESLAVE_TX))
2118 hsai->Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE;
2123 hsai->Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE;
2125 hsai->FrameInit.FSDefinition = SAI_FS_STARTFRAME;
2126 hsai->FrameInit.FSPolarity = SAI_FS_ACTIVE_HIGH;
2127 hsai->FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
2128 hsai->SlotInit.FirstBitOffset = 0U;
2129 hsai->SlotInit.SlotNumber = nbslot;
2130 hsai->SlotInit.SlotActive = SAI_SLOTACTIVE_ALL;
2132 if (protocol == SAI_PCM_SHORT)
2134 hsai->FrameInit.ActiveFrameLength = 1;
2139 hsai->FrameInit.ActiveFrameLength = 13;
2144 case SAI_PROTOCOL_DATASIZE_16BIT:
2145 hsai->Init.DataSize = SAI_DATASIZE_16;
2146 hsai->FrameInit.FrameLength = 16U * nbslot;
2147 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_16B;
2149 case SAI_PROTOCOL_DATASIZE_16BITEXTENDED :
2150 hsai->Init.DataSize = SAI_DATASIZE_16;
2151 hsai->FrameInit.FrameLength = 32U * nbslot;
2152 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_32B;
2154 case SAI_PROTOCOL_DATASIZE_24BIT :
2155 hsai->Init.DataSize = SAI_DATASIZE_24;
2156 hsai->FrameInit.FrameLength = 32U * nbslot;
2157 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_32B;
2159 case SAI_PROTOCOL_DATASIZE_32BIT:
2160 hsai->Init.DataSize = SAI_DATASIZE_32;
2161 hsai->FrameInit.FrameLength = 32U * nbslot;
2162 hsai->SlotInit.SlotSize = SAI_SLOTSIZE_32B;
2177static void SAI_FillFifo(SAI_HandleTypeDef *hsai)
2180 while (((hsai->Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_FULL) && (hsai->XferCount > 0U))
2182 if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
2184 hsai->Instance->DR = (*hsai->pBuffPtr++);
2186 else if (hsai->Init.DataSize <= SAI_DATASIZE_16)
2188 hsai->Instance->DR = *((uint32_t *)hsai->pBuffPtr);
2189 hsai->pBuffPtr += 2U;
2193 hsai->Instance->DR = *((uint32_t *)hsai->pBuffPtr);
2194 hsai->pBuffPtr += 4U;
2207static uint32_t SAI_InterruptFlag(
const SAI_HandleTypeDef *hsai, uint32_t mode)
2209 uint32_t tmpIT = SAI_IT_OVRUDR;
2211 if (mode == SAI_MODE_IT)
2213 tmpIT |= SAI_IT_FREQ;
2216 if ((hsai->Init.Protocol == SAI_AC97_PROTOCOL) &&
2217 ((hsai->Init.AudioMode == SAI_MODESLAVE_RX) || (hsai->Init.AudioMode == SAI_MODEMASTER_RX)))
2219 tmpIT |= SAI_IT_CNRDY;
2222 if ((hsai->Init.AudioMode == SAI_MODESLAVE_RX) || (hsai->Init.AudioMode == SAI_MODESLAVE_TX))
2224 tmpIT |= SAI_IT_AFSDET | SAI_IT_LFSDET;
2229 tmpIT |= SAI_IT_WCKCFG;
2242 uint32_t count = SAI_DEFAULT_TIMEOUT * (SystemCoreClock / 7U / 1000U);
2246 __HAL_SAI_DISABLE(hsai);
2254 hsai->ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
2259 while ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != RESET);
2270static void SAI_Transmit_IT8Bit(SAI_HandleTypeDef *hsai)
2272 if (hsai->XferCount == 0U)
2276 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2277 hsai->State = HAL_SAI_STATE_READY;
2278#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2279 hsai->TxCpltCallback(hsai);
2281 HAL_SAI_TxCpltCallback(hsai);
2287 hsai->Instance->DR = (*hsai->pBuffPtr++);
2298static void SAI_Transmit_IT16Bit(SAI_HandleTypeDef *hsai)
2300 if (hsai->XferCount == 0U)
2304 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2305 hsai->State = HAL_SAI_STATE_READY;
2306#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2307 hsai->TxCpltCallback(hsai);
2309 HAL_SAI_TxCpltCallback(hsai);
2315 hsai->Instance->DR = *(uint16_t *)hsai->pBuffPtr;
2316 hsai->pBuffPtr += 2U;
2327static void SAI_Transmit_IT32Bit(SAI_HandleTypeDef *hsai)
2329 if (hsai->XferCount == 0U)
2333 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2334 hsai->State = HAL_SAI_STATE_READY;
2335#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2336 hsai->TxCpltCallback(hsai);
2338 HAL_SAI_TxCpltCallback(hsai);
2344 hsai->Instance->DR = *(uint32_t *)hsai->pBuffPtr;
2345 hsai->pBuffPtr += 4U;
2356static void SAI_Receive_IT8Bit(SAI_HandleTypeDef *hsai)
2359 (*hsai->pBuffPtr++) = hsai->Instance->DR;
2363 if (hsai->XferCount == 0U)
2366 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2369 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
2371 hsai->State = HAL_SAI_STATE_READY;
2372#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2373 hsai->RxCpltCallback(hsai);
2375 HAL_SAI_RxCpltCallback(hsai);
2386static void SAI_Receive_IT16Bit(SAI_HandleTypeDef *hsai)
2389 *(uint16_t *)hsai->pBuffPtr = hsai->Instance->DR;
2390 hsai->pBuffPtr += 2U;
2394 if (hsai->XferCount == 0U)
2397 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2400 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
2402 hsai->State = HAL_SAI_STATE_READY;
2403#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2404 hsai->RxCpltCallback(hsai);
2406 HAL_SAI_RxCpltCallback(hsai);
2417static void SAI_Receive_IT32Bit(SAI_HandleTypeDef *hsai)
2420 *(uint32_t *)hsai->pBuffPtr = hsai->Instance->DR;
2421 hsai->pBuffPtr += 4U;
2425 if (hsai->XferCount == 0U)
2428 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2431 __HAL_SAI_CLEAR_FLAG(hsai, SAI_FLAG_OVRUDR);
2433 hsai->State = HAL_SAI_STATE_READY;
2434#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2435 hsai->RxCpltCallback(hsai);
2437 HAL_SAI_RxCpltCallback(hsai);
2450 SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((
DMA_HandleTypeDef *)hdma)->Parent;
2454 hsai->XferCount = 0U;
2457 hsai->Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
2460 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
2462 hsai->State = HAL_SAI_STATE_READY;
2464#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2465 hsai->TxCpltCallback(hsai);
2467 HAL_SAI_TxCpltCallback(hsai);
2479 SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((
DMA_HandleTypeDef *)hdma)->Parent;
2481#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2482 hsai->TxHalfCpltCallback(hsai);
2484 HAL_SAI_TxHalfCpltCallback(hsai);
2496 SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((
DMA_HandleTypeDef *)hdma)->Parent;
2501 hsai->Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
2502 hsai->XferCount = 0U;
2505 __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
2507 hsai->State = HAL_SAI_STATE_READY;
2509#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2510 hsai->RxCpltCallback(hsai);
2512 HAL_SAI_RxCpltCallback(hsai);
2524 SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((
DMA_HandleTypeDef *)hdma)->Parent;
2526#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2527 hsai->RxHalfCpltCallback(hsai);
2529 HAL_SAI_RxHalfCpltCallback(hsai);
2541 SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((
DMA_HandleTypeDef *)hdma)->Parent;
2544 hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
2549 hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
2555 hsai->State = HAL_SAI_STATE_READY;
2558 hsai->XferCount = 0U;
2561#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2562 hsai->ErrorCallback(hsai);
2564 HAL_SAI_ErrorCallback(hsai);
2576 SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((
DMA_HandleTypeDef *)hdma)->Parent;
2579 hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
2582 hsai->Instance->IMR = 0U;
2583 hsai->Instance->CLRFR = 0xFFFFFFFFU;
2585 if (hsai->ErrorCode != HAL_SAI_ERROR_WCKCFG)
2591 SET_BIT(hsai->Instance->CR2, SAI_xCR2_FFLUSH);
2594 hsai->State = HAL_SAI_STATE_READY;
2597 hsai->XferCount = 0U;
2600#if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2601 hsai->ErrorCallback(hsai);
2603 HAL_SAI_ErrorCallback(hsai);
#define HAL_DMA_ERROR_NO_XFER
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
struct __DMA_HandleTypeDef DMA_HandleTypeDef
DMA handle Structure definition.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#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__)