stm32h747/stm32h747i-disco/CM7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sai.c
Go to the documentation of this file.
1 
216 /* Includes ------------------------------------------------------------------*/
217 #include "stm32h7xx_hal.h"
218 
228 #ifdef HAL_SAI_MODULE_ENABLED
229 
230 /* Private typedef -----------------------------------------------------------*/
234 typedef enum
235 {
236  SAI_MODE_DMA,
237  SAI_MODE_IT
238 } SAI_ModeTypedef;
243 /* Private define ------------------------------------------------------------*/
247 #define SAI_DEFAULT_TIMEOUT 4U
248 #define SAI_LONG_TIMEOUT 1000U
249 
253 /* Private macro -------------------------------------------------------------*/
254 /* Private variables ---------------------------------------------------------*/
255 /* Private function prototypes -----------------------------------------------*/
259 static void SAI_FillFifo(SAI_HandleTypeDef *hsai);
260 static uint32_t SAI_InterruptFlag(const SAI_HandleTypeDef *hsai, SAI_ModeTypedef mode);
261 static HAL_StatusTypeDef SAI_InitI2S(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot);
262 static HAL_StatusTypeDef SAI_InitPCM(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot);
263 
264 static HAL_StatusTypeDef SAI_Disable(SAI_HandleTypeDef *hsai);
265 static void SAI_Transmit_IT8Bit(SAI_HandleTypeDef *hsai);
266 static void SAI_Transmit_IT16Bit(SAI_HandleTypeDef *hsai);
267 static void SAI_Transmit_IT32Bit(SAI_HandleTypeDef *hsai);
268 static void SAI_Receive_IT8Bit(SAI_HandleTypeDef *hsai);
269 static void SAI_Receive_IT16Bit(SAI_HandleTypeDef *hsai);
270 static void SAI_Receive_IT32Bit(SAI_HandleTypeDef *hsai);
271 
272 static void SAI_DMATxCplt(DMA_HandleTypeDef *hdma);
273 static void SAI_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
274 static void SAI_DMARxCplt(DMA_HandleTypeDef *hdma);
275 static void SAI_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
276 static void SAI_DMAError(DMA_HandleTypeDef *hdma);
277 static void SAI_DMAAbort(DMA_HandleTypeDef *hdma);
282 /* Exported functions ---------------------------------------------------------*/
331 HAL_StatusTypeDef HAL_SAI_InitProtocol(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
332 {
333  HAL_StatusTypeDef status;
334 
335  /* Check the parameters */
338 
339  switch (protocol)
340  {
341  case SAI_I2S_STANDARD :
342  case SAI_I2S_MSBJUSTIFIED :
343  case SAI_I2S_LSBJUSTIFIED :
344  status = SAI_InitI2S(hsai, protocol, datasize, nbslot);
345  break;
346  case SAI_PCM_LONG :
347  case SAI_PCM_SHORT :
348  status = SAI_InitPCM(hsai, protocol, datasize, nbslot);
349  break;
350  default :
351  status = HAL_ERROR;
352  break;
353  }
354 
355  if (status == HAL_OK)
356  {
357  status = HAL_SAI_Init(hsai);
358  }
359 
360  return status;
361 }
362 
371 {
372  uint32_t tmpregisterGCR;
373  uint32_t ckstr_bits;
374  uint32_t syncen_bits;
375  SAI_TypeDef *SaiBaseAddress;
376 
377  /* Check the SAI handle allocation */
378  if (hsai == NULL)
379  {
380  return HAL_ERROR;
381  }
382 
383  /* check the instance */
385 
386  /* Check the SAI Block parameters */
394 #if defined(SAI_VER_V2_X)
395  /* SAI Peripheral version depends on STM32H7 device revision ID */
396  if (HAL_GetREVID() >= REV_ID_B) /* STM32H7xx Rev.B and above */
397  {
399  }
400 #else /* SAI_VER_V2_1 */
402 #endif /* SAI_VER_V2_X */
411 
412  /* Check the SAI Block Frame parameters */
418 
419  /* Check the SAI Block Slot parameters */
424 
425  /* Check the SAI PDM parameters */
427  if (hsai->Init.PdmInit.Activation == ENABLE)
428  {
431  /* Check that SAI sub-block is SAI1 or SAI4 sub-block A, in master RX mode with free protocol */
432 #if defined(SAI4)
433  if (((hsai->Instance != SAI1_Block_A) && (hsai->Instance != SAI4_Block_A)) ||
434  (hsai->Init.AudioMode != SAI_MODEMASTER_RX) ||
435  (hsai->Init.Protocol != SAI_FREE_PROTOCOL))
436  {
437  return HAL_ERROR;
438  }
439 #else
440  if ((hsai->Instance != SAI1_Block_A) ||
441  (hsai->Init.AudioMode != SAI_MODEMASTER_RX) ||
442  (hsai->Init.Protocol != SAI_FREE_PROTOCOL))
443  {
444  return HAL_ERROR;
445  }
446 #endif /* SAI4 */
447  }
448 
449  /* Get the SAI base address according to the SAI handle */
450  if ((hsai->Instance == SAI1_Block_A) || (hsai->Instance == SAI1_Block_B))
451  {
452  SaiBaseAddress = SAI1;
453  }
454 #if defined(SAI2)
455  else if ((hsai->Instance == SAI2_Block_A) || (hsai->Instance == SAI2_Block_B))
456  {
457  SaiBaseAddress = SAI2;
458  }
459 #endif /* SAI2 */
460 #if defined(SAI3)
461  else if ((hsai->Instance == SAI3_Block_A) || (hsai->Instance == SAI3_Block_B))
462  {
463  SaiBaseAddress = SAI3;
464  }
465 #endif /* SAI3 */
466 #if defined(SAI4)
467  else if ((hsai->Instance == SAI4_Block_A) || (hsai->Instance == SAI4_Block_B))
468  {
469  SaiBaseAddress = SAI4;
470  }
471 #endif /* SAI4 */
472  else
473  {
474  return HAL_ERROR;
475  }
476 
477  if (hsai->State == HAL_SAI_STATE_RESET)
478  {
479  /* Allocate lock resource and initialize it */
480  hsai->Lock = HAL_UNLOCKED;
481 
482 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
483  /* Reset callback pointers to the weak predefined callbacks */
484  hsai->RxCpltCallback = HAL_SAI_RxCpltCallback;
485  hsai->RxHalfCpltCallback = HAL_SAI_RxHalfCpltCallback;
486  hsai->TxCpltCallback = HAL_SAI_TxCpltCallback;
487  hsai->TxHalfCpltCallback = HAL_SAI_TxHalfCpltCallback;
488  hsai->ErrorCallback = HAL_SAI_ErrorCallback;
489 
490  /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
491  if (hsai->MspInitCallback == NULL)
492  {
493  hsai->MspInitCallback = HAL_SAI_MspInit;
494  }
495  hsai->MspInitCallback(hsai);
496 #else
497  /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
498  HAL_SAI_MspInit(hsai);
499 #endif
500  }
501 
502  /* Disable the selected SAI peripheral */
503  if(SAI_Disable(hsai) != HAL_OK)
504  {
505  return HAL_ERROR;
506  }
507 
508  hsai->State = HAL_SAI_STATE_BUSY;
509 
510  /* SAI Block Synchro Configuration -----------------------------------------*/
511  /* This setting must be done with both audio block (A & B) disabled */
512  switch (hsai->Init.SynchroExt)
513  {
514  case SAI_SYNCEXT_DISABLE :
515  tmpregisterGCR = 0;
516  break;
518  tmpregisterGCR = SAI_GCR_SYNCOUT_0;
519  break;
521  tmpregisterGCR = SAI_GCR_SYNCOUT_1;
522  break;
523  default:
524  tmpregisterGCR = 0;
525  break;
526  }
527 
528  switch (hsai->Init.Synchro)
529  {
530  case SAI_ASYNCHRONOUS :
531  syncen_bits = 0;
532  break;
533  case SAI_SYNCHRONOUS :
534  syncen_bits = SAI_xCR1_SYNCEN_0;
535  break;
537  syncen_bits = SAI_xCR1_SYNCEN_1;
538  break;
539 #if defined(SAI2)
541  syncen_bits = SAI_xCR1_SYNCEN_1;
542  tmpregisterGCR |= SAI_GCR_SYNCIN_0;
543  break;
544 #endif /* SAI2 */
545 #if defined(SAI3)
546  case SAI_SYNCHRONOUS_EXT_SAI3 :
547  syncen_bits = SAI_xCR1_SYNCEN_1;
548  tmpregisterGCR |= SAI_GCR_SYNCIN_1;
549  break;
550 #endif /* SAI3 */
551 #if defined(SAI4)
552  case SAI_SYNCHRONOUS_EXT_SAI4 :
553  syncen_bits = SAI_xCR1_SYNCEN_1;
554  tmpregisterGCR |= (SAI_GCR_SYNCIN_1 | SAI_GCR_SYNCIN_0);
555  break;
556 #endif /* SAI4 */
557  default:
558  syncen_bits = 0;
559  break;
560  }
561 
562  /* Set the SAI Block Synchro Configuration */
563  SaiBaseAddress->GCR = tmpregisterGCR;
564 
566  {
567  uint32_t freq = 0;
568  uint32_t tmpval;
569 
570  /* In this case, the MCKDIV value is calculated to get AudioFrequency */
571  if ((hsai->Instance == SAI1_Block_A) || (hsai->Instance == SAI1_Block_B))
572  {
574  }
575 
576 #if defined(SAI2)
577 #if defined(RCC_PERIPHCLK_SAI2)
578  if ((hsai->Instance == SAI2_Block_A) || (hsai->Instance == SAI2_Block_B))
579  {
581  }
582 #else
583  if (hsai->Instance == SAI2_Block_A)
584  {
585  freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI2A);
586  }
587  if (hsai->Instance == SAI2_Block_B)
588  {
589  freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI2B);
590  }
591 #endif /* RCC_PERIPHCLK_SAI2 */
592 #endif /* SAI2 */
593 
594 #if defined(SAI3)
595  if ((hsai->Instance == SAI3_Block_A) || (hsai->Instance == SAI3_Block_B))
596  {
597  freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI3);
598  }
599 #endif /* SAI3 */
600 #if defined(SAI4)
601  if (hsai->Instance == SAI4_Block_A)
602  {
603  freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI4A);
604  }
605  if (hsai->Instance == SAI4_Block_B)
606  {
607  freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI4B);
608  }
609 #endif /* SAI4 */
610 
611  /* Configure Master Clock Divider using the following formula :
612  - If NODIV = 1 :
613  MCKDIV[5:0] = SAI_CK_x / (FS * (FRL + 1))
614  - If NODIV = 0 :
615  MCKDIV[5:0] = SAI_CK_x / (FS * (OSR + 1) * 256) */
617  {
618  /* NODIV = 1 */
619  uint32_t tmpframelength;
620 
621  if (hsai->Init.Protocol == SAI_SPDIF_PROTOCOL)
622  {
623  /* For SPDIF protocol, frame length is set by hardware to 64 */
624  tmpframelength = 64U;
625  }
626  else if (hsai->Init.Protocol == SAI_AC97_PROTOCOL)
627  {
628  /* For AC97 protocol, frame length is set by hardware to 256 */
629  tmpframelength = 256U;
630  }
631  else
632  {
633  /* For free protocol, frame length is set by user */
634  tmpframelength = hsai->FrameInit.FrameLength;
635  }
636 
637  /* (freq x 10) to keep Significant digits */
638  tmpval = (freq * 10U) / (hsai->Init.AudioFrequency * tmpframelength);
639  }
640  else
641  {
642  /* NODIV = 0 */
643  uint32_t tmposr;
644  tmposr = (hsai->Init.MckOverSampling == SAI_MCK_OVERSAMPLING_ENABLE) ? 2U : 1U;
645  /* (freq x 10) to keep Significant digits */
646  tmpval = (freq * 10U) / (hsai->Init.AudioFrequency * tmposr * 256U);
647  }
648  hsai->Init.Mckdiv = tmpval / 10U;
649 
650  /* Round result to the nearest integer */
651  if ((tmpval % 10U) > 8U)
652  {
653  hsai->Init.Mckdiv += 1U;
654  }
655 
656  /* For SPDIF protocol, SAI shall provide a bit clock twice faster the symbol-rate */
657  if (hsai->Init.Protocol == SAI_SPDIF_PROTOCOL)
658  {
659  hsai->Init.Mckdiv = hsai->Init.Mckdiv >> 1;
660  }
661  }
662 
663  /* Check the SAI Block master clock divider parameter */
665 
666  /* Compute CKSTR bits of SAI CR1 according ClockStrobing and AudioMode */
667  if ((hsai->Init.AudioMode == SAI_MODEMASTER_TX) || (hsai->Init.AudioMode == SAI_MODESLAVE_TX))
668  {
669  /* Transmit */
670  ckstr_bits = (hsai->Init.ClockStrobing == SAI_CLOCKSTROBING_RISINGEDGE) ? 0U : SAI_xCR1_CKSTR;
671  }
672  else
673  {
674  /* Receive */
675  ckstr_bits = (hsai->Init.ClockStrobing == SAI_CLOCKSTROBING_RISINGEDGE) ? SAI_xCR1_CKSTR : 0U;
676  }
677 
678  /* SAI Block Configuration -------------------------------------------------*/
679  /* SAI CR1 Configuration */
680 #if defined(SAI_VER_V2_X) /* SAI Peripheral version depends on STM32H7 device revision ID */
681 
682  if (HAL_GetREVID() >= REV_ID_B) /* STM32H7xx Rev.B and above */
683  {
685  SAI_xCR1_LSBFIRST | SAI_xCR1_CKSTR | SAI_xCR1_SYNCEN | \
686  SAI_xCR1_MONO | SAI_xCR1_OUTDRIV | SAI_xCR1_DMAEN | \
687  SAI_xCR1_NODIV | SAI_xCR1_MCKDIV | SAI_xCR1_OSR | \
688  SAI_xCR1_MCKEN);
689 
690  hsai->Instance->CR1 |= (hsai->Init.AudioMode | hsai->Init.Protocol | \
691  hsai->Init.DataSize | hsai->Init.FirstBit | \
692  ckstr_bits | syncen_bits | \
693  hsai->Init.MonoStereoMode | hsai->Init.OutputDrive | \
694  hsai->Init.NoDivider | (hsai->Init.Mckdiv << 20) | \
695  hsai->Init.MckOverSampling | hsai->Init.MckOutput);
696  }
697  else /* STM32H7xx Rev.Y */
698  {
700  SAI_xCR1_LSBFIRST | SAI_xCR1_CKSTR | SAI_xCR1_SYNCEN | \
701  SAI_xCR1_MONO | SAI_xCR1_OUTDRIV | SAI_xCR1_DMAEN | \
702  SAI_xCR1_NODIV | SAI_xCR1_MCKDIV | SAI_xCR1_OSR);
703 
704  hsai->Instance->CR1 |= (hsai->Init.AudioMode | hsai->Init.Protocol | \
705  hsai->Init.DataSize | hsai->Init.FirstBit | \
706  ckstr_bits | syncen_bits | \
707  hsai->Init.MonoStereoMode | hsai->Init.OutputDrive | \
708  hsai->Init.NoDivider | (hsai->Init.Mckdiv << 20) | \
709  hsai->Init.MckOverSampling);
710  }
711 #else /* SAI_VER_V2_1*/
713  SAI_xCR1_LSBFIRST | SAI_xCR1_CKSTR | SAI_xCR1_SYNCEN | \
714  SAI_xCR1_MONO | SAI_xCR1_OUTDRIV | SAI_xCR1_DMAEN | \
715  SAI_xCR1_NODIV | SAI_xCR1_MCKDIV | SAI_xCR1_OSR | \
716  SAI_xCR1_MCKEN);
717 
718  hsai->Instance->CR1 |= (hsai->Init.AudioMode | hsai->Init.Protocol | \
719  hsai->Init.DataSize | hsai->Init.FirstBit | \
720  ckstr_bits | syncen_bits | \
721  hsai->Init.MonoStereoMode | hsai->Init.OutputDrive | \
722  hsai->Init.NoDivider | (hsai->Init.Mckdiv << 20) | \
723  hsai->Init.MckOverSampling | hsai->Init.MckOutput);
724 #endif /* SAI_VER_V2_X */
725 
726  /* SAI CR2 Configuration */
728  hsai->Instance->CR2 |= (hsai->Init.FIFOThreshold | hsai->Init.CompandingMode | hsai->Init.TriState);
729 
730  /* SAI Frame Configuration -----------------------------------------*/
732  SAI_xFRCR_FSPOL | SAI_xFRCR_FSOFF));
733  hsai->Instance->FRCR |= ((hsai->FrameInit.FrameLength - 1U) |
734  hsai->FrameInit.FSOffset |
735  hsai->FrameInit.FSDefinition |
736  hsai->FrameInit.FSPolarity |
737  ((hsai->FrameInit.ActiveFrameLength - 1U) << 8));
738 
739  /* SAI Block_x SLOT Configuration ------------------------------------------*/
740  /* This register has no meaning in AC 97 and SPDIF audio protocol */
742  SAI_xSLOTR_NBSLOT | SAI_xSLOTR_SLOTEN));
743 
744  hsai->Instance->SLOTR |= hsai->SlotInit.FirstBitOffset | hsai->SlotInit.SlotSize | \
745  (hsai->SlotInit.SlotActive << 16) | ((hsai->SlotInit.SlotNumber - 1U) << 8);
746 
747  /* SAI PDM Configuration ---------------------------------------------------*/
748 #if defined(SAI4)
749  if ((hsai->Instance == SAI1_Block_A) || (hsai->Instance == SAI4_Block_A))
750 #else
751  if (hsai->Instance == SAI1_Block_A)
752 #endif /* SAI4 */
753  {
754  /* Disable PDM interface */
755  SaiBaseAddress->PDMCR &= ~(SAI_PDMCR_PDMEN);
756  if (hsai->Init.PdmInit.Activation == ENABLE)
757  {
758  /* Configure and enable PDM interface */
759  SaiBaseAddress->PDMCR = (hsai->Init.PdmInit.ClockEnable |
760  ((hsai->Init.PdmInit.MicPairsNbr - 1U) << SAI_PDMCR_MICNBR_Pos));
761  SaiBaseAddress->PDMCR |= SAI_PDMCR_PDMEN;
762  }
763  }
764 
765  /* Initialize the error code */
767 
768  /* Initialize the SAI state */
769  hsai->State = HAL_SAI_STATE_READY;
770 
771  /* Release Lock */
772  __HAL_UNLOCK(hsai);
773 
774  return HAL_OK;
775 }
776 
784 {
785  SAI_TypeDef *SaiBaseAddress;
786 
787  /* Check the SAI handle allocation */
788  if (hsai == NULL)
789  {
790  return HAL_ERROR;
791  }
792 
793  hsai->State = HAL_SAI_STATE_BUSY;
794 
795  /* Disabled All interrupt and clear all the flag */
796  hsai->Instance->IMR = 0;
797  hsai->Instance->CLRFR = 0xFFFFFFFFU;
798 
799  /* Disable the SAI */
800  if (SAI_Disable(hsai) != HAL_OK)
801  {
802  /* Reset SAI state to ready */
803  hsai->State = HAL_SAI_STATE_READY;
804 
805  /* Release Lock */
806  __HAL_UNLOCK(hsai);
807 
808  return HAL_ERROR;
809  }
810 
811  /* Flush the fifo */
813 
814  /* Disable SAI PDM interface */
815 #if defined(SAI4)
816  if ((hsai->Instance == SAI1_Block_A) || (hsai->Instance == SAI4_Block_A))
817 #else
818  if (hsai->Instance == SAI1_Block_A)
819 #endif /* SAI4 */
820  {
821  /* Get the SAI base address according to the SAI handle */
822 #if defined(SAI4)
823  SaiBaseAddress = (hsai->Instance == SAI1_Block_A) ? SAI1 : SAI4;
824 #else
825  SaiBaseAddress = SAI1;
826 #endif /* SAI4 */
827 
828  /* Reset PDM delays */
829  SaiBaseAddress->PDMDLY = 0U;
830 
831  /* Disable PDM interface */
832  SaiBaseAddress->PDMCR &= ~(SAI_PDMCR_PDMEN);
833  }
834 
835  /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */
836 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
837  if (hsai->MspDeInitCallback == NULL)
838  {
839  hsai->MspDeInitCallback = HAL_SAI_MspDeInit;
840  }
841  hsai->MspDeInitCallback(hsai);
842 #else
843  HAL_SAI_MspDeInit(hsai);
844 #endif
845 
846  /* Initialize the error code */
848 
849  /* Initialize the SAI state */
850  hsai->State = HAL_SAI_STATE_RESET;
851 
852  /* Release Lock */
853  __HAL_UNLOCK(hsai);
854 
855  return HAL_OK;
856 }
857 
864 __weak void HAL_SAI_MspInit(SAI_HandleTypeDef *hsai)
865 {
866  /* Prevent unused argument(s) compilation warning */
867  UNUSED(hsai);
868 
869  /* NOTE : This function should not be modified, when the callback is needed,
870  the HAL_SAI_MspInit could be implemented in the user file
871  */
872 }
873 
880 __weak void HAL_SAI_MspDeInit(SAI_HandleTypeDef *hsai)
881 {
882  /* Prevent unused argument(s) compilation warning */
883  UNUSED(hsai);
884 
885  /* NOTE : This function should not be modified, when the callback is needed,
886  the HAL_SAI_MspDeInit could be implemented in the user file
887  */
888 }
889 
890 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
891 
907 HAL_StatusTypeDef HAL_SAI_RegisterCallback(SAI_HandleTypeDef *hsai,
908  HAL_SAI_CallbackIDTypeDef CallbackID,
909  pSAI_CallbackTypeDef pCallback)
910 {
911  HAL_StatusTypeDef status = HAL_OK;
912 
913  if (pCallback == NULL)
914  {
915  /* update the error code */
916  hsai->ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
917  /* update return status */
918  status = HAL_ERROR;
919  }
920  else
921  {
922  if (HAL_SAI_STATE_READY == hsai->State)
923  {
924  switch (CallbackID)
925  {
926  case HAL_SAI_RX_COMPLETE_CB_ID :
927  hsai->RxCpltCallback = pCallback;
928  break;
929  case HAL_SAI_RX_HALFCOMPLETE_CB_ID :
930  hsai->RxHalfCpltCallback = pCallback;
931  break;
932  case HAL_SAI_TX_COMPLETE_CB_ID :
933  hsai->TxCpltCallback = pCallback;
934  break;
935  case HAL_SAI_TX_HALFCOMPLETE_CB_ID :
936  hsai->TxHalfCpltCallback = pCallback;
937  break;
938  case HAL_SAI_ERROR_CB_ID :
939  hsai->ErrorCallback = pCallback;
940  break;
941  case HAL_SAI_MSPINIT_CB_ID :
942  hsai->MspInitCallback = pCallback;
943  break;
944  case HAL_SAI_MSPDEINIT_CB_ID :
945  hsai->MspDeInitCallback = pCallback;
946  break;
947  default :
948  /* update the error code */
949  hsai->ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
950  /* update return status */
951  status = HAL_ERROR;
952  break;
953  }
954  }
955  else if (HAL_SAI_STATE_RESET == hsai->State)
956  {
957  switch (CallbackID)
958  {
959  case HAL_SAI_MSPINIT_CB_ID :
960  hsai->MspInitCallback = pCallback;
961  break;
962  case HAL_SAI_MSPDEINIT_CB_ID :
963  hsai->MspDeInitCallback = pCallback;
964  break;
965  default :
966  /* update the error code */
967  hsai->ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
968  /* update return status */
969  status = HAL_ERROR;
970  break;
971  }
972  }
973  else
974  {
975  /* update the error code */
976  hsai->ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
977  /* update return status */
978  status = HAL_ERROR;
979  }
980  }
981  return status;
982 }
983 
999 HAL_StatusTypeDef HAL_SAI_UnRegisterCallback(SAI_HandleTypeDef *hsai,
1000  HAL_SAI_CallbackIDTypeDef CallbackID)
1001 {
1002  HAL_StatusTypeDef status = HAL_OK;
1003 
1004  if (HAL_SAI_STATE_READY == hsai->State)
1005  {
1006  switch (CallbackID)
1007  {
1008  case HAL_SAI_RX_COMPLETE_CB_ID :
1009  hsai->RxCpltCallback = HAL_SAI_RxCpltCallback;
1010  break;
1011  case HAL_SAI_RX_HALFCOMPLETE_CB_ID :
1012  hsai->RxHalfCpltCallback = HAL_SAI_RxHalfCpltCallback;
1013  break;
1014  case HAL_SAI_TX_COMPLETE_CB_ID :
1015  hsai->TxCpltCallback = HAL_SAI_TxCpltCallback;
1016  break;
1017  case HAL_SAI_TX_HALFCOMPLETE_CB_ID :
1018  hsai->TxHalfCpltCallback = HAL_SAI_TxHalfCpltCallback;
1019  break;
1020  case HAL_SAI_ERROR_CB_ID :
1021  hsai->ErrorCallback = HAL_SAI_ErrorCallback;
1022  break;
1023  case HAL_SAI_MSPINIT_CB_ID :
1024  hsai->MspInitCallback = HAL_SAI_MspInit;
1025  break;
1026  case HAL_SAI_MSPDEINIT_CB_ID :
1027  hsai->MspDeInitCallback = HAL_SAI_MspDeInit;
1028  break;
1029  default :
1030  /* update the error code */
1031  hsai->ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
1032  /* update return status */
1033  status = HAL_ERROR;
1034  break;
1035  }
1036  }
1037  else if (HAL_SAI_STATE_RESET == hsai->State)
1038  {
1039  switch (CallbackID)
1040  {
1041  case HAL_SAI_MSPINIT_CB_ID :
1042  hsai->MspInitCallback = HAL_SAI_MspInit;
1043  break;
1044  case HAL_SAI_MSPDEINIT_CB_ID :
1045  hsai->MspDeInitCallback = HAL_SAI_MspDeInit;
1046  break;
1047  default :
1048  /* update the error code */
1049  hsai->ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
1050  /* update return status */
1051  status = HAL_ERROR;
1052  break;
1053  }
1054  }
1055  else
1056  {
1057  /* update the error code */
1058  hsai->ErrorCode |= HAL_SAI_ERROR_INVALID_CALLBACK;
1059  /* update return status */
1060  status = HAL_ERROR;
1061  }
1062  return status;
1063 }
1064 #endif /* USE_HAL_SAI_REGISTER_CALLBACKS */
1065 
1121 HAL_StatusTypeDef HAL_SAI_Transmit(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1122 {
1123  uint32_t tickstart = HAL_GetTick();
1124  uint32_t temp;
1125 
1126  if ((pData == NULL) || (Size == 0U))
1127  {
1128  return HAL_ERROR;
1129  }
1130 
1131  if (hsai->State == HAL_SAI_STATE_READY)
1132  {
1133  /* Process Locked */
1134  __HAL_LOCK(hsai);
1135 
1136  hsai->XferSize = Size;
1137  hsai->XferCount = Size;
1138  hsai->pBuffPtr = pData;
1139  hsai->State = HAL_SAI_STATE_BUSY_TX;
1140  hsai->ErrorCode = HAL_SAI_ERROR_NONE;
1141 
1142  /* Check if the SAI is already enabled */
1143  if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1144  {
1145  /* fill the fifo with data before to enabled the SAI */
1146  SAI_FillFifo(hsai);
1147  /* Enable SAI peripheral */
1148  __HAL_SAI_ENABLE(hsai);
1149  }
1150 
1151  while (hsai->XferCount > 0U)
1152  {
1153  /* Write data if the FIFO is not full */
1154  if ((hsai->Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_FULL)
1155  {
1156  if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
1157  {
1158  hsai->Instance->DR = *hsai->pBuffPtr;
1159  hsai->pBuffPtr++;
1160  }
1161  else if (hsai->Init.DataSize <= SAI_DATASIZE_16)
1162  {
1163  temp = (uint32_t)(*hsai->pBuffPtr);
1164  hsai->pBuffPtr++;
1165  temp |= ((uint32_t)(*hsai->pBuffPtr) << 8);
1166  hsai->pBuffPtr++;
1167  hsai->Instance->DR = temp;
1168  }
1169  else
1170  {
1171  temp = (uint32_t)(*hsai->pBuffPtr);
1172  hsai->pBuffPtr++;
1173  temp |= ((uint32_t)(*hsai->pBuffPtr) << 8);
1174  hsai->pBuffPtr++;
1175  temp |= ((uint32_t)(*hsai->pBuffPtr) << 16);
1176  hsai->pBuffPtr++;
1177  temp |= ((uint32_t)(*hsai->pBuffPtr) << 24);
1178  hsai->pBuffPtr++;
1179  hsai->Instance->DR = temp;
1180  }
1181  hsai->XferCount--;
1182  }
1183  else
1184  {
1185  /* Check for the Timeout */
1186  if ((((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) && (Timeout != HAL_MAX_DELAY))
1187  {
1188  /* Update error code */
1190 
1191  /* Clear all the flags */
1192  hsai->Instance->CLRFR = 0xFFFFFFFFU;
1193 
1194  /* Disable SAI peripheral */
1195  /* No need to check return value because state update, unlock and error return will be performed later */
1196  (void) SAI_Disable(hsai);
1197 
1198  /* Flush the fifo */
1200 
1201  /* Change the SAI state */
1202  hsai->State = HAL_SAI_STATE_READY;
1203 
1204  /* Process Unlocked */
1205  __HAL_UNLOCK(hsai);
1206 
1207  return HAL_ERROR;
1208  }
1209  }
1210  }
1211 
1212  hsai->State = HAL_SAI_STATE_READY;
1213 
1214  /* Process Unlocked */
1215  __HAL_UNLOCK(hsai);
1216 
1217  return HAL_OK;
1218  }
1219  else
1220  {
1221  return HAL_BUSY;
1222  }
1223 }
1224 
1234 HAL_StatusTypeDef HAL_SAI_Receive(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1235 {
1236  uint32_t tickstart = HAL_GetTick();
1237  uint32_t temp;
1238 
1239  if ((pData == NULL) || (Size == 0U))
1240  {
1241  return HAL_ERROR;
1242  }
1243 
1244  if (hsai->State == HAL_SAI_STATE_READY)
1245  {
1246  /* Process Locked */
1247  __HAL_LOCK(hsai);
1248 
1249  hsai->pBuffPtr = pData;
1250  hsai->XferSize = Size;
1251  hsai->XferCount = Size;
1252  hsai->State = HAL_SAI_STATE_BUSY_RX;
1253  hsai->ErrorCode = HAL_SAI_ERROR_NONE;
1254 
1255  /* Check if the SAI is already enabled */
1256  if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1257  {
1258  /* Enable SAI peripheral */
1259  __HAL_SAI_ENABLE(hsai);
1260  }
1261 
1262  /* Receive data */
1263  while (hsai->XferCount > 0U)
1264  {
1265  if ((hsai->Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_EMPTY)
1266  {
1267  if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
1268  {
1269  *hsai->pBuffPtr = (uint8_t)hsai->Instance->DR;
1270  hsai->pBuffPtr++;
1271  }
1272  else if (hsai->Init.DataSize <= SAI_DATASIZE_16)
1273  {
1274  temp = hsai->Instance->DR;
1275  *hsai->pBuffPtr = (uint8_t)temp;
1276  hsai->pBuffPtr++;
1277  *hsai->pBuffPtr = (uint8_t)(temp >> 8);
1278  hsai->pBuffPtr++;
1279  }
1280  else
1281  {
1282  temp = hsai->Instance->DR;
1283  *hsai->pBuffPtr = (uint8_t)temp;
1284  hsai->pBuffPtr++;
1285  *hsai->pBuffPtr = (uint8_t)(temp >> 8);
1286  hsai->pBuffPtr++;
1287  *hsai->pBuffPtr = (uint8_t)(temp >> 16);
1288  hsai->pBuffPtr++;
1289  *hsai->pBuffPtr = (uint8_t)(temp >> 24);
1290  hsai->pBuffPtr++;
1291  }
1292  hsai->XferCount--;
1293  }
1294  else
1295  {
1296  /* Check for the Timeout */
1297  if ((((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) && (Timeout != HAL_MAX_DELAY))
1298  {
1299  /* Update error code */
1301 
1302  /* Clear all the flags */
1303  hsai->Instance->CLRFR = 0xFFFFFFFFU;
1304 
1305  /* Disable SAI peripheral */
1306  /* No need to check return value because state update, unlock and error return will be performed later */
1307  (void) SAI_Disable(hsai);
1308 
1309  /* Flush the fifo */
1311 
1312  /* Change the SAI state */
1313  hsai->State = HAL_SAI_STATE_READY;
1314 
1315  /* Process Unlocked */
1316  __HAL_UNLOCK(hsai);
1317 
1318  return HAL_ERROR;
1319  }
1320  }
1321  }
1322 
1323  hsai->State = HAL_SAI_STATE_READY;
1324 
1325  /* Process Unlocked */
1326  __HAL_UNLOCK(hsai);
1327 
1328  return HAL_OK;
1329  }
1330  else
1331  {
1332  return HAL_BUSY;
1333  }
1334 }
1335 
1344 HAL_StatusTypeDef HAL_SAI_Transmit_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
1345 {
1346  if ((pData == NULL) || (Size == 0U))
1347  {
1348  return HAL_ERROR;
1349  }
1350 
1351  if (hsai->State == HAL_SAI_STATE_READY)
1352  {
1353  /* Process Locked */
1354  __HAL_LOCK(hsai);
1355 
1356  hsai->pBuffPtr = pData;
1357  hsai->XferSize = Size;
1358  hsai->XferCount = Size;
1359  hsai->ErrorCode = HAL_SAI_ERROR_NONE;
1360  hsai->State = HAL_SAI_STATE_BUSY_TX;
1361 
1362  if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
1363  {
1364  hsai->InterruptServiceRoutine = SAI_Transmit_IT8Bit;
1365  }
1366  else if (hsai->Init.DataSize <= SAI_DATASIZE_16)
1367  {
1368  hsai->InterruptServiceRoutine = SAI_Transmit_IT16Bit;
1369  }
1370  else
1371  {
1372  hsai->InterruptServiceRoutine = SAI_Transmit_IT32Bit;
1373  }
1374 
1375  /* Fill the fifo before starting the communication */
1376  SAI_FillFifo(hsai);
1377 
1378  /* Enable FRQ and OVRUDR interrupts */
1379  __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
1380 
1381  /* Check if the SAI is already enabled */
1382  if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1383  {
1384  /* Enable SAI peripheral */
1385  __HAL_SAI_ENABLE(hsai);
1386  }
1387  /* Process Unlocked */
1388  __HAL_UNLOCK(hsai);
1389 
1390  return HAL_OK;
1391  }
1392  else
1393  {
1394  return HAL_BUSY;
1395  }
1396 }
1397 
1406 HAL_StatusTypeDef HAL_SAI_Receive_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
1407 {
1408  if ((pData == NULL) || (Size == 0U))
1409  {
1410  return HAL_ERROR;
1411  }
1412 
1413  if (hsai->State == HAL_SAI_STATE_READY)
1414  {
1415  /* Process Locked */
1416  __HAL_LOCK(hsai);
1417 
1418  hsai->pBuffPtr = pData;
1419  hsai->XferSize = Size;
1420  hsai->XferCount = Size;
1421  hsai->ErrorCode = HAL_SAI_ERROR_NONE;
1422  hsai->State = HAL_SAI_STATE_BUSY_RX;
1423 
1424  if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
1425  {
1426  hsai->InterruptServiceRoutine = SAI_Receive_IT8Bit;
1427  }
1428  else if (hsai->Init.DataSize <= SAI_DATASIZE_16)
1429  {
1430  hsai->InterruptServiceRoutine = SAI_Receive_IT16Bit;
1431  }
1432  else
1433  {
1434  hsai->InterruptServiceRoutine = SAI_Receive_IT32Bit;
1435  }
1436 
1437  /* Enable TXE and OVRUDR interrupts */
1438  __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
1439 
1440  /* Check if the SAI is already enabled */
1441  if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1442  {
1443  /* Enable SAI peripheral */
1444  __HAL_SAI_ENABLE(hsai);
1445  }
1446 
1447  /* Process Unlocked */
1448  __HAL_UNLOCK(hsai);
1449 
1450  return HAL_OK;
1451  }
1452  else
1453  {
1454  return HAL_BUSY;
1455  }
1456 }
1457 
1465 {
1466  /* Process Locked */
1467  __HAL_LOCK(hsai);
1468 
1469  /* Pause the audio file playing by disabling the SAI DMA requests */
1470  hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
1471 
1472  /* Process Unlocked */
1473  __HAL_UNLOCK(hsai);
1474 
1475  return HAL_OK;
1476 }
1477 
1485 {
1486  /* Process Locked */
1487  __HAL_LOCK(hsai);
1488 
1489  /* Enable the SAI DMA requests */
1490  hsai->Instance->CR1 |= SAI_xCR1_DMAEN;
1491 
1492  /* If the SAI peripheral is still not enabled, enable it */
1493  if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1494  {
1495  /* Enable SAI peripheral */
1496  __HAL_SAI_ENABLE(hsai);
1497  }
1498 
1499  /* Process Unlocked */
1500  __HAL_UNLOCK(hsai);
1501 
1502  return HAL_OK;
1503 }
1504 
1512 {
1513  HAL_StatusTypeDef status = HAL_OK;
1514 
1515  /* Process Locked */
1516  __HAL_LOCK(hsai);
1517 
1518  /* Disable the SAI DMA request */
1519  hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
1520 
1521  /* Abort the SAI Tx DMA Stream */
1522  if ((hsai->State == HAL_SAI_STATE_BUSY_TX) && (hsai->hdmatx != NULL))
1523  {
1524  if (HAL_DMA_Abort(hsai->hdmatx) != HAL_OK)
1525  {
1526  /* If the DMA Tx errorCode is different from DMA No Transfer then return Error */
1527  if (hsai->hdmatx->ErrorCode != HAL_DMA_ERROR_NO_XFER)
1528  {
1529  status = HAL_ERROR;
1530  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1531  }
1532  }
1533  }
1534 
1535  /* Abort the SAI Rx DMA Stream */
1536  if ((hsai->State == HAL_SAI_STATE_BUSY_RX) && (hsai->hdmarx != NULL))
1537  {
1538  if (HAL_DMA_Abort(hsai->hdmarx) != HAL_OK)
1539  {
1540  /* If the DMA Rx errorCode is different from DMA No Transfer then return Error */
1541  if (hsai->hdmarx->ErrorCode != HAL_DMA_ERROR_NO_XFER)
1542  {
1543  status = HAL_ERROR;
1544  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1545  }
1546  }
1547  }
1548 
1549  /* Disable SAI peripheral */
1550  if (SAI_Disable(hsai) != HAL_OK)
1551  {
1552  status = HAL_ERROR;
1553  }
1554 
1555  /* Flush the fifo */
1557 
1558  /* Set hsai state to ready */
1559  hsai->State = HAL_SAI_STATE_READY;
1560 
1561  /* Process Unlocked */
1562  __HAL_UNLOCK(hsai);
1563 
1564  return status;
1565 }
1566 
1574 {
1575  HAL_StatusTypeDef status = HAL_OK;
1576 
1577  /* Process Locked */
1578  __HAL_LOCK(hsai);
1579 
1580  /* Check SAI DMA is enabled or not */
1581  if ((hsai->Instance->CR1 & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1582  {
1583  /* Disable the SAI DMA request */
1584  hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
1585 
1586  /* Abort the SAI Tx DMA Stream */
1587  if ((hsai->State == HAL_SAI_STATE_BUSY_TX)&& (hsai->hdmatx != NULL))
1588  {
1589  if (HAL_DMA_Abort(hsai->hdmatx) != HAL_OK)
1590  {
1591  /* If the DMA Tx errorCode is different from DMA No Transfer then return Error */
1592  if (hsai->hdmatx->ErrorCode != HAL_DMA_ERROR_NO_XFER)
1593  {
1594  status = HAL_ERROR;
1595  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1596  }
1597  }
1598  }
1599 
1600  /* Abort the SAI Rx DMA Stream */
1601  if ((hsai->State == HAL_SAI_STATE_BUSY_RX) && (hsai->hdmarx != NULL))
1602  {
1603  if (HAL_DMA_Abort(hsai->hdmarx) != HAL_OK)
1604  {
1605  /* If the DMA Rx errorCode is different from DMA No Transfer then return Error */
1606  if (hsai->hdmarx->ErrorCode != HAL_DMA_ERROR_NO_XFER)
1607  {
1608  status = HAL_ERROR;
1609  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1610  }
1611  }
1612  }
1613  }
1614 
1615  /* Disabled All interrupt and clear all the flag */
1616  hsai->Instance->IMR = 0;
1617  hsai->Instance->CLRFR = 0xFFFFFFFFU;
1618 
1619  /* Disable SAI peripheral */
1620  if (SAI_Disable(hsai) != HAL_OK)
1621  {
1622  status = HAL_ERROR;
1623  }
1624 
1625  /* Flush the fifo */
1627 
1628  /* Set hsai state to ready */
1629  hsai->State = HAL_SAI_STATE_READY;
1630 
1631  /* Process Unlocked */
1632  __HAL_UNLOCK(hsai);
1633 
1634  return status;
1635 }
1636 
1645 HAL_StatusTypeDef HAL_SAI_Transmit_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
1646 {
1647  uint32_t tickstart = HAL_GetTick();
1648 
1649  if ((pData == NULL) || (Size == 0U))
1650  {
1651  return HAL_ERROR;
1652  }
1653 
1654  if (hsai->State == HAL_SAI_STATE_READY)
1655  {
1656  /* Process Locked */
1657  __HAL_LOCK(hsai);
1658 
1659  hsai->pBuffPtr = pData;
1660  hsai->XferSize = Size;
1661  hsai->XferCount = Size;
1662  hsai->ErrorCode = HAL_SAI_ERROR_NONE;
1663  hsai->State = HAL_SAI_STATE_BUSY_TX;
1664 
1665  /* Set the SAI Tx DMA Half transfer complete callback */
1666  hsai->hdmatx->XferHalfCpltCallback = SAI_DMATxHalfCplt;
1667 
1668  /* Set the SAI TxDMA transfer complete callback */
1669  hsai->hdmatx->XferCpltCallback = SAI_DMATxCplt;
1670 
1671  /* Set the DMA error callback */
1672  hsai->hdmatx->XferErrorCallback = SAI_DMAError;
1673 
1674  /* Set the DMA Tx abort callback */
1675  hsai->hdmatx->XferAbortCallback = NULL;
1676 
1677  /* Enable the Tx DMA Stream */
1678  if (HAL_DMA_Start_IT(hsai->hdmatx, (uint32_t)hsai->pBuffPtr, (uint32_t)&hsai->Instance->DR, hsai->XferSize) != HAL_OK)
1679  {
1680  __HAL_UNLOCK(hsai);
1681  return HAL_ERROR;
1682  }
1683 
1684  /* Enable the interrupts for error handling */
1685  __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
1686 
1687  /* Enable SAI Tx DMA Request */
1688  hsai->Instance->CR1 |= SAI_xCR1_DMAEN;
1689 
1690  /* Wait untill FIFO is not empty */
1691  while ((hsai->Instance->SR & SAI_xSR_FLVL) == SAI_FIFOSTATUS_EMPTY)
1692  {
1693  /* Check for the Timeout */
1694  if ((HAL_GetTick() - tickstart) > SAI_LONG_TIMEOUT)
1695  {
1696  /* Update error code */
1698 
1699  /* Process Unlocked */
1700  __HAL_UNLOCK(hsai);
1701 
1702  return HAL_TIMEOUT;
1703  }
1704  }
1705 
1706  /* Check if the SAI is already enabled */
1707  if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1708  {
1709  /* Enable SAI peripheral */
1710  __HAL_SAI_ENABLE(hsai);
1711  }
1712 
1713  /* Process Unlocked */
1714  __HAL_UNLOCK(hsai);
1715 
1716  return HAL_OK;
1717  }
1718  else
1719  {
1720  return HAL_BUSY;
1721  }
1722 }
1723 
1732 HAL_StatusTypeDef HAL_SAI_Receive_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
1733 {
1734 
1735  if ((pData == NULL) || (Size == 0U))
1736  {
1737  return HAL_ERROR;
1738  }
1739 
1740  if (hsai->State == HAL_SAI_STATE_READY)
1741  {
1742  /* Process Locked */
1743  __HAL_LOCK(hsai);
1744 
1745  hsai->pBuffPtr = pData;
1746  hsai->XferSize = Size;
1747  hsai->XferCount = Size;
1748  hsai->ErrorCode = HAL_SAI_ERROR_NONE;
1749  hsai->State = HAL_SAI_STATE_BUSY_RX;
1750 
1751  /* Set the SAI Rx DMA Half transfer complete callback */
1752  hsai->hdmarx->XferHalfCpltCallback = SAI_DMARxHalfCplt;
1753 
1754  /* Set the SAI Rx DMA transfer complete callback */
1755  hsai->hdmarx->XferCpltCallback = SAI_DMARxCplt;
1756 
1757  /* Set the DMA error callback */
1758  hsai->hdmarx->XferErrorCallback = SAI_DMAError;
1759 
1760  /* Set the DMA Rx abort callback */
1761  hsai->hdmarx->XferAbortCallback = NULL;
1762 
1763  /* Enable the Rx DMA Stream */
1764  if (HAL_DMA_Start_IT(hsai->hdmarx, (uint32_t)&hsai->Instance->DR, (uint32_t)hsai->pBuffPtr, hsai->XferSize) != HAL_OK)
1765  {
1766  __HAL_UNLOCK(hsai);
1767  return HAL_ERROR;
1768  }
1769 
1770  /* Enable the interrupts for error handling */
1771  __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
1772 
1773  /* Enable SAI Rx DMA Request */
1774  hsai->Instance->CR1 |= SAI_xCR1_DMAEN;
1775 
1776  /* Check if the SAI is already enabled */
1777  if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == 0U)
1778  {
1779  /* Enable SAI peripheral */
1780  __HAL_SAI_ENABLE(hsai);
1781  }
1782 
1783  /* Process Unlocked */
1784  __HAL_UNLOCK(hsai);
1785 
1786  return HAL_OK;
1787  }
1788  else
1789  {
1790  return HAL_BUSY;
1791  }
1792 }
1793 
1802 {
1804 
1805  if (hsai->State != HAL_SAI_STATE_RESET)
1806  {
1808  SET_BIT(hsai->Instance->CR2, SAI_xCR2_MUTE | (uint32_t)val);
1809  return HAL_OK;
1810  }
1811  return HAL_ERROR;
1812 }
1813 
1821 {
1822  if (hsai->State != HAL_SAI_STATE_RESET)
1823  {
1825  return HAL_OK;
1826  }
1827  return HAL_ERROR;
1828 }
1829 
1839 {
1841 
1842  if (hsai->State != HAL_SAI_STATE_RESET)
1843  {
1844  /* set the mute counter */
1846  SET_BIT(hsai->Instance->CR2, (uint32_t)((uint32_t)counter << SAI_xCR2_MUTECNT_Pos));
1847  hsai->mutecallback = callback;
1848  /* enable the IT interrupt */
1850  return HAL_OK;
1851  }
1852  return HAL_ERROR;
1853 }
1854 
1862 {
1863  if (hsai->State != HAL_SAI_STATE_RESET)
1864  {
1865  /* set the mutecallback to NULL */
1866  hsai->mutecallback = NULL;
1867  /* enable the IT interrupt */
1869  return HAL_OK;
1870  }
1871  return HAL_ERROR;
1872 }
1873 
1881 {
1882  if (hsai->State != HAL_SAI_STATE_RESET)
1883  {
1884  uint32_t itflags = hsai->Instance->SR;
1885  uint32_t itsources = hsai->Instance->IMR;
1886  uint32_t cr1config = hsai->Instance->CR1;
1887  uint32_t tmperror;
1888 
1889  /* SAI Fifo request interrupt occured ------------------------------------*/
1890  if (((itflags & SAI_xSR_FREQ) == SAI_xSR_FREQ) && ((itsources & SAI_IT_FREQ) == SAI_IT_FREQ))
1891  {
1892  hsai->InterruptServiceRoutine(hsai);
1893  }
1894  /* SAI Overrun error interrupt occurred ----------------------------------*/
1895  else if (((itflags & SAI_FLAG_OVRUDR) == SAI_FLAG_OVRUDR) && ((itsources & SAI_IT_OVRUDR) == SAI_IT_OVRUDR))
1896  {
1897  /* Clear the SAI Overrun flag */
1899  /* Get the SAI error code */
1900  tmperror = ((hsai->State == HAL_SAI_STATE_BUSY_RX) ? HAL_SAI_ERROR_OVR : HAL_SAI_ERROR_UDR);
1901  /* Change the SAI error code */
1902  hsai->ErrorCode |= tmperror;
1903  /* the transfer is not stopped, we will forward the information to the user and we let the user decide what needs to be done */
1904 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1905  hsai->ErrorCallback(hsai);
1906 #else
1907  HAL_SAI_ErrorCallback(hsai);
1908 #endif
1909  }
1910  /* SAI mutedet interrupt occurred ----------------------------------*/
1911  else if (((itflags & SAI_FLAG_MUTEDET) == SAI_FLAG_MUTEDET) && ((itsources & SAI_IT_MUTEDET) == SAI_IT_MUTEDET))
1912  {
1913  /* Clear the SAI mutedet flag */
1915  /* call the call back function */
1916  if (hsai->mutecallback != NULL)
1917  {
1918  /* inform the user that an RX mute event has been detected */
1919  hsai->mutecallback();
1920  }
1921  }
1922  /* SAI AFSDET interrupt occurred ----------------------------------*/
1923  else if (((itflags & SAI_FLAG_AFSDET) == SAI_FLAG_AFSDET) && ((itsources & SAI_IT_AFSDET) == SAI_IT_AFSDET))
1924  {
1925  /* Clear the SAI AFSDET flag */
1927 
1928  /* Change the SAI error code */
1930 
1931  /* Check SAI DMA is enabled or not */
1932  if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1933  {
1934  /* Abort the SAI DMA Streams */
1935  if (hsai->hdmatx != NULL)
1936  {
1937  /* Set the DMA Tx abort callback */
1938  hsai->hdmatx->XferAbortCallback = SAI_DMAAbort;
1939 
1940  /* Abort DMA in IT mode */
1941  if (HAL_DMA_Abort_IT(hsai->hdmatx) != HAL_OK)
1942  {
1943  /* Update SAI error code */
1944  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1945 
1946  /* Call SAI error callback */
1947 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1948  hsai->ErrorCallback(hsai);
1949 #else
1950  HAL_SAI_ErrorCallback(hsai);
1951 #endif
1952  }
1953  }
1954  if (hsai->hdmarx != NULL)
1955  {
1956  /* Set the DMA Rx abort callback */
1957  hsai->hdmarx->XferAbortCallback = SAI_DMAAbort;
1958 
1959  /* Abort DMA in IT mode */
1960  if (HAL_DMA_Abort_IT(hsai->hdmarx) != HAL_OK)
1961  {
1962  /* Update SAI error code */
1963  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
1964 
1965  /* Call SAI error callback */
1966 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1967  hsai->ErrorCallback(hsai);
1968 #else
1969  HAL_SAI_ErrorCallback(hsai);
1970 #endif
1971  }
1972  }
1973  }
1974  else
1975  {
1976  /* Abort SAI */
1977  /* No need to check return value because HAL_SAI_ErrorCallback will be called later */
1978  (void) HAL_SAI_Abort(hsai);
1979 
1980  /* Set error callback */
1981 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
1982  hsai->ErrorCallback(hsai);
1983 #else
1984  HAL_SAI_ErrorCallback(hsai);
1985 #endif
1986  }
1987  }
1988  /* SAI LFSDET interrupt occurred ----------------------------------*/
1989  else if (((itflags & SAI_FLAG_LFSDET) == SAI_FLAG_LFSDET) && ((itsources & SAI_IT_LFSDET) == SAI_IT_LFSDET))
1990  {
1991  /* Clear the SAI LFSDET flag */
1993 
1994  /* Change the SAI error code */
1996 
1997  /* Check SAI DMA is enabled or not */
1998  if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
1999  {
2000  /* Abort the SAI DMA Streams */
2001  if (hsai->hdmatx != NULL)
2002  {
2003  /* Set the DMA Tx abort callback */
2004  hsai->hdmatx->XferAbortCallback = SAI_DMAAbort;
2005 
2006  /* Abort DMA in IT mode */
2007  if (HAL_DMA_Abort_IT(hsai->hdmatx) != HAL_OK)
2008  {
2009  /* Update SAI error code */
2010  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
2011 
2012  /* Call SAI error callback */
2013 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2014  hsai->ErrorCallback(hsai);
2015 #else
2016  HAL_SAI_ErrorCallback(hsai);
2017 #endif
2018  }
2019  }
2020  if (hsai->hdmarx != NULL)
2021  {
2022  /* Set the DMA Rx abort callback */
2023  hsai->hdmarx->XferAbortCallback = SAI_DMAAbort;
2024 
2025  /* Abort DMA in IT mode */
2026  if (HAL_DMA_Abort_IT(hsai->hdmarx) != HAL_OK)
2027  {
2028  /* Update SAI error code */
2029  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
2030 
2031  /* Call SAI error callback */
2032 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2033  hsai->ErrorCallback(hsai);
2034 #else
2035  HAL_SAI_ErrorCallback(hsai);
2036 #endif
2037  }
2038  }
2039  }
2040  else
2041  {
2042  /* Abort SAI */
2043  /* No need to check return value because HAL_SAI_ErrorCallback will be called later */
2044  (void) HAL_SAI_Abort(hsai);
2045 
2046  /* Set error callback */
2047 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2048  hsai->ErrorCallback(hsai);
2049 #else
2050  HAL_SAI_ErrorCallback(hsai);
2051 #endif
2052  }
2053  }
2054  /* SAI WCKCFG interrupt occurred ----------------------------------*/
2055  else if (((itflags & SAI_FLAG_WCKCFG) == SAI_FLAG_WCKCFG) && ((itsources & SAI_IT_WCKCFG) == SAI_IT_WCKCFG))
2056  {
2057  /* Clear the SAI WCKCFG flag */
2059 
2060  /* Change the SAI error code */
2062 
2063  /* Check SAI DMA is enabled or not */
2064  if ((cr1config & SAI_xCR1_DMAEN) == SAI_xCR1_DMAEN)
2065  {
2066  /* Abort the SAI DMA Streams */
2067  if (hsai->hdmatx != NULL)
2068  {
2069  /* Set the DMA Tx abort callback */
2070  hsai->hdmatx->XferAbortCallback = SAI_DMAAbort;
2071 
2072  /* Abort DMA in IT mode */
2073  if (HAL_DMA_Abort_IT(hsai->hdmatx) != HAL_OK)
2074  {
2075  /* Update SAI error code */
2076  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
2077 
2078  /* Call SAI error callback */
2079 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2080  hsai->ErrorCallback(hsai);
2081 #else
2082  HAL_SAI_ErrorCallback(hsai);
2083 #endif
2084  }
2085  }
2086  if (hsai->hdmarx != NULL)
2087  {
2088  /* Set the DMA Rx abort callback */
2089  hsai->hdmarx->XferAbortCallback = SAI_DMAAbort;
2090 
2091  /* Abort DMA in IT mode */
2092  if (HAL_DMA_Abort_IT(hsai->hdmarx) != HAL_OK)
2093  {
2094  /* Update SAI error code */
2095  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
2096 
2097  /* Call SAI error callback */
2098 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2099  hsai->ErrorCallback(hsai);
2100 #else
2101  HAL_SAI_ErrorCallback(hsai);
2102 #endif
2103  }
2104  }
2105  }
2106  else
2107  {
2108  /* If WCKCFG occurs, SAI audio block is automatically disabled */
2109  /* Disable all interrupts and clear all flags */
2110  hsai->Instance->IMR = 0U;
2111  hsai->Instance->CLRFR = 0xFFFFFFFFU;
2112  /* Set the SAI state to ready to be able to start again the process */
2113  hsai->State = HAL_SAI_STATE_READY;
2114 
2115  /* Initialize XferCount */
2116  hsai->XferCount = 0U;
2117 
2118  /* SAI error Callback */
2119 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2120  hsai->ErrorCallback(hsai);
2121 #else
2122  HAL_SAI_ErrorCallback(hsai);
2123 #endif
2124  }
2125  }
2126  /* SAI CNRDY interrupt occurred ----------------------------------*/
2127  else if (((itflags & SAI_FLAG_CNRDY) == SAI_FLAG_CNRDY) && ((itsources & SAI_IT_CNRDY) == SAI_IT_CNRDY))
2128  {
2129  /* Clear the SAI CNRDY flag */
2131  /* Change the SAI error code */
2133  /* the transfer is not stopped, we will forward the information to the user and we let the user decide what needs to be done */
2134 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2135  hsai->ErrorCallback(hsai);
2136 #else
2137  HAL_SAI_ErrorCallback(hsai);
2138 #endif
2139  }
2140  else
2141  {
2142  /* Nothing to do */
2143  }
2144  }
2145 }
2146 
2153 __weak void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
2154 {
2155  /* Prevent unused argument(s) compilation warning */
2156  UNUSED(hsai);
2157 
2158  /* NOTE : This function should not be modified, when the callback is needed,
2159  the HAL_SAI_TxCpltCallback could be implemented in the user file
2160  */
2161 }
2162 
2170 {
2171  /* Prevent unused argument(s) compilation warning */
2172  UNUSED(hsai);
2173 
2174  /* NOTE : This function should not be modified, when the callback is needed,
2175  the HAL_SAI_TxHalfCpltCallback could be implemented in the user file
2176  */
2177 }
2178 
2185 __weak void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
2186 {
2187  /* Prevent unused argument(s) compilation warning */
2188  UNUSED(hsai);
2189 
2190  /* NOTE : This function should not be modified, when the callback is needed,
2191  the HAL_SAI_RxCpltCallback could be implemented in the user file
2192  */
2193 }
2194 
2202 {
2203  /* Prevent unused argument(s) compilation warning */
2204  UNUSED(hsai);
2205 
2206  /* NOTE : This function should not be modified, when the callback is needed,
2207  the HAL_SAI_RxHalfCpltCallback could be implemented in the user file
2208  */
2209 }
2210 
2217 __weak void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai)
2218 {
2219  /* Prevent unused argument(s) compilation warning */
2220  UNUSED(hsai);
2221 
2222  /* NOTE : This function should not be modified, when the callback is needed,
2223  the HAL_SAI_ErrorCallback could be implemented in the user file
2224  */
2225 }
2226 
2253 {
2254  return hsai->State;
2255 }
2256 
2263 uint32_t HAL_SAI_GetError(SAI_HandleTypeDef *hsai)
2264 {
2265  return hsai->ErrorCode;
2266 }
2267 
2292 static HAL_StatusTypeDef SAI_InitI2S(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
2293 {
2294  HAL_StatusTypeDef status = HAL_OK;
2295 
2297  hsai->Init.FirstBit = SAI_FIRSTBIT_MSB;
2298  /* Compute ClockStrobing according AudioMode */
2299  if ((hsai->Init.AudioMode == SAI_MODEMASTER_TX) || (hsai->Init.AudioMode == SAI_MODESLAVE_TX))
2300  {
2301  /* Transmit */
2303  }
2304  else
2305  {
2306  /* Receive */
2308  }
2311  hsai->SlotInit.FirstBitOffset = 0;
2312  hsai->SlotInit.SlotNumber = nbslot;
2313 
2314  /* in IS2 the number of slot must be even */
2315  if ((nbslot & 0x1U) != 0U)
2316  {
2317  return HAL_ERROR;
2318  }
2319 
2320  if (protocol == SAI_I2S_STANDARD)
2321  {
2324  }
2325  else
2326  {
2327  /* SAI_I2S_MSBJUSTIFIED or SAI_I2S_LSBJUSTIFIED */
2330  }
2331 
2332  /* Frame definition */
2333  switch (datasize)
2334  {
2336  hsai->Init.DataSize = SAI_DATASIZE_16;
2337  hsai->FrameInit.FrameLength = 32U * (nbslot / 2U);
2338  hsai->FrameInit.ActiveFrameLength = 16U * (nbslot / 2U);
2340  break;
2342  hsai->Init.DataSize = SAI_DATASIZE_16;
2343  hsai->FrameInit.FrameLength = 64U * (nbslot / 2U);
2344  hsai->FrameInit.ActiveFrameLength = 32U * (nbslot / 2U);
2346  break;
2348  hsai->Init.DataSize = SAI_DATASIZE_24;
2349  hsai->FrameInit.FrameLength = 64U * (nbslot / 2U);
2350  hsai->FrameInit.ActiveFrameLength = 32U * (nbslot / 2U);
2352  break;
2354  hsai->Init.DataSize = SAI_DATASIZE_32;
2355  hsai->FrameInit.FrameLength = 64U * (nbslot / 2U);
2356  hsai->FrameInit.ActiveFrameLength = 32U * (nbslot / 2U);
2358  break;
2359  default :
2360  status = HAL_ERROR;
2361  break;
2362  }
2363  if (protocol == SAI_I2S_LSBJUSTIFIED)
2364  {
2365  if (datasize == SAI_PROTOCOL_DATASIZE_16BITEXTENDED)
2366  {
2367  hsai->SlotInit.FirstBitOffset = 16;
2368  }
2369  if (datasize == SAI_PROTOCOL_DATASIZE_24BIT)
2370  {
2371  hsai->SlotInit.FirstBitOffset = 8;
2372  }
2373  }
2374  return status;
2375 }
2376 
2387 static HAL_StatusTypeDef SAI_InitPCM(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
2388 {
2389  HAL_StatusTypeDef status = HAL_OK;
2390 
2392  hsai->Init.FirstBit = SAI_FIRSTBIT_MSB;
2393  /* Compute ClockStrobing according AudioMode */
2394  if ((hsai->Init.AudioMode == SAI_MODEMASTER_TX) || (hsai->Init.AudioMode == SAI_MODESLAVE_TX))
2395  {
2396  /* Transmit */
2398  }
2399  else
2400  {
2401  /* Receive */
2403  }
2407  hsai->SlotInit.FirstBitOffset = 0;
2408  hsai->SlotInit.SlotNumber = nbslot;
2410 
2411  if (protocol == SAI_PCM_SHORT)
2412  {
2413  hsai->FrameInit.ActiveFrameLength = 1;
2414  }
2415  else
2416  {
2417  /* SAI_PCM_LONG */
2418  hsai->FrameInit.ActiveFrameLength = 13;
2419  }
2420 
2421  switch (datasize)
2422  {
2424  hsai->Init.DataSize = SAI_DATASIZE_16;
2425  hsai->FrameInit.FrameLength = 16U * nbslot;
2427  break;
2429  hsai->Init.DataSize = SAI_DATASIZE_16;
2430  hsai->FrameInit.FrameLength = 32U * nbslot;
2432  break;
2434  hsai->Init.DataSize = SAI_DATASIZE_24;
2435  hsai->FrameInit.FrameLength = 32U * nbslot;
2437  break;
2439  hsai->Init.DataSize = SAI_DATASIZE_32;
2440  hsai->FrameInit.FrameLength = 32U * nbslot;
2442  break;
2443  default :
2444  status = HAL_ERROR;
2445  break;
2446  }
2447 
2448  return status;
2449 }
2450 
2457 static void SAI_FillFifo(SAI_HandleTypeDef *hsai)
2458 {
2459  uint32_t temp;
2460 
2461  /* fill the fifo with data before to enabled the SAI */
2462  while (((hsai->Instance->SR & SAI_xSR_FLVL) != SAI_FIFOSTATUS_FULL) && (hsai->XferCount > 0U))
2463  {
2464  if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))
2465  {
2466  hsai->Instance->DR = *hsai->pBuffPtr;
2467  hsai->pBuffPtr++;
2468  }
2469  else if (hsai->Init.DataSize <= SAI_DATASIZE_16)
2470  {
2471  temp = (uint32_t)(*hsai->pBuffPtr);
2472  hsai->pBuffPtr++;
2473  temp |= ((uint32_t)(*hsai->pBuffPtr) << 8);
2474  hsai->pBuffPtr++;
2475  hsai->Instance->DR = temp;
2476  }
2477  else
2478  {
2479  temp = (uint32_t)(*hsai->pBuffPtr);
2480  hsai->pBuffPtr++;
2481  temp |= ((uint32_t)(*hsai->pBuffPtr) << 8);
2482  hsai->pBuffPtr++;
2483  temp |= ((uint32_t)(*hsai->pBuffPtr) << 16);
2484  hsai->pBuffPtr++;
2485  temp |= ((uint32_t)(*hsai->pBuffPtr) << 24);
2486  hsai->pBuffPtr++;
2487  hsai->Instance->DR = temp;
2488  }
2489  hsai->XferCount--;
2490  }
2491 }
2492 
2500 static uint32_t SAI_InterruptFlag(const SAI_HandleTypeDef *hsai, SAI_ModeTypedef mode)
2501 {
2502  uint32_t tmpIT = SAI_IT_OVRUDR;
2503 
2504  if (mode == SAI_MODE_IT)
2505  {
2506  tmpIT |= SAI_IT_FREQ;
2507  }
2508 
2509  if ((hsai->Init.Protocol == SAI_AC97_PROTOCOL) &&
2510  ((hsai->Init.AudioMode == SAI_MODESLAVE_RX) || (hsai->Init.AudioMode == SAI_MODEMASTER_RX)))
2511  {
2512  tmpIT |= SAI_IT_CNRDY;
2513  }
2514 
2515  if ((hsai->Init.AudioMode == SAI_MODESLAVE_RX) || (hsai->Init.AudioMode == SAI_MODESLAVE_TX))
2516  {
2517  tmpIT |= SAI_IT_AFSDET | SAI_IT_LFSDET;
2518  }
2519  else
2520  {
2521  /* hsai has been configured in master mode */
2522  tmpIT |= SAI_IT_WCKCFG;
2523  }
2524  return tmpIT;
2525 }
2526 
2533 static HAL_StatusTypeDef SAI_Disable(SAI_HandleTypeDef *hsai)
2534 {
2535  uint32_t count = SAI_DEFAULT_TIMEOUT * (SystemCoreClock / 7U / 1000U);
2536  HAL_StatusTypeDef status = HAL_OK;
2537 
2538  /* Disable the SAI instance */
2539  __HAL_SAI_DISABLE(hsai);
2540 
2541  do
2542  {
2543  /* Check for the Timeout */
2544  if (count == 0U)
2545  {
2546  /* Update error code */
2548  status = HAL_TIMEOUT;
2549  break;
2550  }
2551  count--;
2552  }
2553  while ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != 0U);
2554 
2555  return status;
2556 }
2557 
2564 static void SAI_Transmit_IT8Bit(SAI_HandleTypeDef *hsai)
2565 {
2566  if (hsai->XferCount == 0U)
2567  {
2568  /* Handle the end of the transmission */
2569  /* Disable FREQ and OVRUDR interrupts */
2570  __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2571  hsai->State = HAL_SAI_STATE_READY;
2572 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2573  hsai->TxCpltCallback(hsai);
2574 #else
2575  HAL_SAI_TxCpltCallback(hsai);
2576 #endif
2577  }
2578  else
2579  {
2580  /* Write data on DR register */
2581  hsai->Instance->DR = *hsai->pBuffPtr;
2582  hsai->pBuffPtr++;
2583  hsai->XferCount--;
2584  }
2585 }
2586 
2593 static void SAI_Transmit_IT16Bit(SAI_HandleTypeDef *hsai)
2594 {
2595  if (hsai->XferCount == 0U)
2596  {
2597  /* Handle the end of the transmission */
2598  /* Disable FREQ and OVRUDR interrupts */
2599  __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2600  hsai->State = HAL_SAI_STATE_READY;
2601 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2602  hsai->TxCpltCallback(hsai);
2603 #else
2604  HAL_SAI_TxCpltCallback(hsai);
2605 #endif
2606  }
2607  else
2608  {
2609  /* Write data on DR register */
2610  uint32_t temp;
2611  temp = (uint32_t)(*hsai->pBuffPtr);
2612  hsai->pBuffPtr++;
2613  temp |= ((uint32_t)(*hsai->pBuffPtr) << 8);
2614  hsai->pBuffPtr++;
2615  hsai->Instance->DR = temp;
2616  hsai->XferCount--;
2617  }
2618 }
2619 
2626 static void SAI_Transmit_IT32Bit(SAI_HandleTypeDef *hsai)
2627 {
2628  if (hsai->XferCount == 0U)
2629  {
2630  /* Handle the end of the transmission */
2631  /* Disable FREQ and OVRUDR interrupts */
2632  __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2633  hsai->State = HAL_SAI_STATE_READY;
2634 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2635  hsai->TxCpltCallback(hsai);
2636 #else
2637  HAL_SAI_TxCpltCallback(hsai);
2638 #endif
2639  }
2640  else
2641  {
2642  /* Write data on DR register */
2643  uint32_t temp;
2644  temp = (uint32_t)(*hsai->pBuffPtr);
2645  hsai->pBuffPtr++;
2646  temp |= ((uint32_t)(*hsai->pBuffPtr) << 8);
2647  hsai->pBuffPtr++;
2648  temp |= ((uint32_t)(*hsai->pBuffPtr) << 16);
2649  hsai->pBuffPtr++;
2650  temp |= ((uint32_t)(*hsai->pBuffPtr) << 24);
2651  hsai->pBuffPtr++;
2652  hsai->Instance->DR = temp;
2653  hsai->XferCount--;
2654  }
2655 }
2656 
2663 static void SAI_Receive_IT8Bit(SAI_HandleTypeDef *hsai)
2664 {
2665  /* Receive data */
2666  *hsai->pBuffPtr = (uint8_t)hsai->Instance->DR;
2667  hsai->pBuffPtr++;
2668  hsai->XferCount--;
2669 
2670  /* Check end of the transfer */
2671  if (hsai->XferCount == 0U)
2672  {
2673  /* Disable TXE and OVRUDR interrupts */
2674  __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2675 
2676  /* Clear the SAI Overrun flag */
2678 
2679  hsai->State = HAL_SAI_STATE_READY;
2680 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2681  hsai->RxCpltCallback(hsai);
2682 #else
2683  HAL_SAI_RxCpltCallback(hsai);
2684 #endif
2685  }
2686 }
2687 
2694 static void SAI_Receive_IT16Bit(SAI_HandleTypeDef *hsai)
2695 {
2696  uint32_t temp;
2697 
2698  /* Receive data */
2699  temp = hsai->Instance->DR;
2700  *hsai->pBuffPtr = (uint8_t)temp;
2701  hsai->pBuffPtr++;
2702  *hsai->pBuffPtr = (uint8_t)(temp >> 8);
2703  hsai->pBuffPtr++;
2704  hsai->XferCount--;
2705 
2706  /* Check end of the transfer */
2707  if (hsai->XferCount == 0U)
2708  {
2709  /* Disable TXE and OVRUDR interrupts */
2710  __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2711 
2712  /* Clear the SAI Overrun flag */
2714 
2715  hsai->State = HAL_SAI_STATE_READY;
2716 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2717  hsai->RxCpltCallback(hsai);
2718 #else
2719  HAL_SAI_RxCpltCallback(hsai);
2720 #endif
2721  }
2722 }
2723 
2730 static void SAI_Receive_IT32Bit(SAI_HandleTypeDef *hsai)
2731 {
2732  uint32_t temp;
2733 
2734  /* Receive data */
2735  temp = hsai->Instance->DR;
2736  *hsai->pBuffPtr = (uint8_t)temp;
2737  hsai->pBuffPtr++;
2738  *hsai->pBuffPtr = (uint8_t)(temp >> 8);
2739  hsai->pBuffPtr++;
2740  *hsai->pBuffPtr = (uint8_t)(temp >> 16);
2741  hsai->pBuffPtr++;
2742  *hsai->pBuffPtr = (uint8_t)(temp >> 24);
2743  hsai->pBuffPtr++;
2744  hsai->XferCount--;
2745 
2746  /* Check end of the transfer */
2747  if (hsai->XferCount == 0U)
2748  {
2749  /* Disable TXE and OVRUDR interrupts */
2750  __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));
2751 
2752  /* Clear the SAI Overrun flag */
2754 
2755  hsai->State = HAL_SAI_STATE_READY;
2756 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2757  hsai->RxCpltCallback(hsai);
2758 #else
2759  HAL_SAI_RxCpltCallback(hsai);
2760 #endif
2761  }
2762 }
2763 
2770 static void SAI_DMATxCplt(DMA_HandleTypeDef *hdma)
2771 {
2772  SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2773 
2774  if (hdma->Init.Mode != DMA_CIRCULAR)
2775  {
2776  hsai->XferCount = 0;
2777 
2778  /* Disable SAI Tx DMA Request */
2779  hsai->Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
2780 
2781  /* Stop the interrupts error handling */
2782  __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
2783 
2784  hsai->State = HAL_SAI_STATE_READY;
2785  }
2786 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2787  hsai->TxCpltCallback(hsai);
2788 #else
2789  HAL_SAI_TxCpltCallback(hsai);
2790 #endif
2791 }
2792 
2799 static void SAI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
2800 {
2801  SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2802 
2803 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2804  hsai->TxHalfCpltCallback(hsai);
2805 #else
2807 #endif
2808 }
2809 
2816 static void SAI_DMARxCplt(DMA_HandleTypeDef *hdma)
2817 {
2818  SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2819 
2820  if (hdma->Init.Mode != DMA_CIRCULAR)
2821  {
2822  /* Disable Rx DMA Request */
2823  hsai->Instance->CR1 &= (uint32_t)(~SAI_xCR1_DMAEN);
2824  hsai->XferCount = 0;
2825 
2826  /* Stop the interrupts error handling */
2827  __HAL_SAI_DISABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));
2828 
2829  hsai->State = HAL_SAI_STATE_READY;
2830  }
2831 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2832  hsai->RxCpltCallback(hsai);
2833 #else
2834  HAL_SAI_RxCpltCallback(hsai);
2835 #endif
2836 }
2837 
2844 static void SAI_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
2845 {
2846  SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2847 
2848 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2849  hsai->RxHalfCpltCallback(hsai);
2850 #else
2852 #endif
2853 }
2854 
2861 static void SAI_DMAError(DMA_HandleTypeDef *hdma)
2862 {
2863  SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2864 
2865  /* Ignore DMA FIFO error */
2866  if (HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE)
2867  {
2868  /* Set SAI error code */
2869  hsai->ErrorCode |= HAL_SAI_ERROR_DMA;
2870 
2871  /* Disable the SAI DMA request */
2872  hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
2873 
2874  /* Disable SAI peripheral */
2875  /* No need to check return value because state will be updated and HAL_SAI_ErrorCallback will be called later */
2876  (void) SAI_Disable(hsai);
2877 
2878  /* Set the SAI state ready to be able to start again the process */
2879  hsai->State = HAL_SAI_STATE_READY;
2880 
2881  /* Initialize XferCount */
2882  hsai->XferCount = 0U;
2883 
2884  /* SAI error Callback */
2885 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2886  hsai->ErrorCallback(hsai);
2887 #else
2888  HAL_SAI_ErrorCallback(hsai);
2889 #endif
2890  }
2891 }
2892 
2899 static void SAI_DMAAbort(DMA_HandleTypeDef *hdma)
2900 {
2901  SAI_HandleTypeDef *hsai = (SAI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2902 
2903  /* Disable DMA request */
2904  hsai->Instance->CR1 &= ~SAI_xCR1_DMAEN;
2905 
2906  /* Disable all interrupts and clear all flags */
2907  hsai->Instance->IMR = 0U;
2908  hsai->Instance->CLRFR = 0xFFFFFFFFU;
2909 
2910  if (hsai->ErrorCode != HAL_SAI_ERROR_WCKCFG)
2911  {
2912  /* Disable SAI peripheral */
2913  /* No need to check return value because state will be updated and HAL_SAI_ErrorCallback will be called later */
2914  (void) SAI_Disable(hsai);
2915 
2916  /* Flush the fifo */
2918  }
2919  /* Set the SAI state to ready to be able to start again the process */
2920  hsai->State = HAL_SAI_STATE_READY;
2921 
2922  /* Initialize XferCount */
2923  hsai->XferCount = 0U;
2924 
2925  /* SAI error Callback */
2926 #if (USE_HAL_SAI_REGISTER_CALLBACKS == 1)
2927  hsai->ErrorCallback(hsai);
2928 #else
2929  HAL_SAI_ErrorCallback(hsai);
2930 #endif
2931 }
2932 
2937 #endif /* HAL_SAI_MODULE_ENABLED */
2938 
2946 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
SAI_xCR2_CPL
#define SAI_xCR2_CPL
Definition: stm32f469xx.h:15462
__SAI_HandleTypeDef::mutecallback
SAIcallback mutecallback
Definition: stm32f7xx_hal_sai.h:211
HAL_SAI_DisableRxMuteMode
HAL_StatusTypeDef HAL_SAI_DisableRxMuteMode(SAI_HandleTypeDef *hsai)
IS_SAI_BLOCK_PROTOCOL
#define IS_SAI_BLOCK_PROTOCOL(PROTOCOL)
Definition: stm32f7xx_hal_sai.h:775
SAI_FS_STARTFRAME
#define SAI_FS_STARTFRAME
Definition: stm32f7xx_hal_sai.h:420
SAI_PROTOCOL_DATASIZE_24BIT
#define SAI_PROTOCOL_DATASIZE_24BIT
Definition: stm32f7xx_hal_sai.h:312
assert_param
#define assert_param(expr)
Include module's header file.
Definition: stm32f407/stm32f407g-disc1/Inc/stm32f4xx_hal_conf.h:353
SAI_xCR1_CKSTR
#define SAI_xCR1_CKSTR
Definition: stm32f469xx.h:15397
SAI_InitTypeDef::MonoStereoMode
uint32_t MonoStereoMode
Definition: stm32f7xx_hal_sai.h:105
HAL_SAI_DisableTxMuteMode
HAL_StatusTypeDef HAL_SAI_DisableTxMuteMode(SAI_HandleTypeDef *hsai)
SAI_PCM_LONG
#define SAI_PCM_LONG
Definition: stm32f7xx_hal_sai.h:301
SAI_IT_AFSDET
#define SAI_IT_AFSDET
Definition: stm32f7xx_hal_sai.h:538
HAL_StatusTypeDef
HAL_StatusTypeDef
HAL Status structures definition
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:40
IS_SAI_BLOCK_MUTE_COUNTER
#define IS_SAI_BLOCK_MUTE_COUNTER(COUNTER)
Definition: stm32f7xx_hal_sai.h:803
SAI_FREE_PROTOCOL
#define SAI_FREE_PROTOCOL
Definition: stm32f7xx_hal_sai.h:350
SAI3
#define SAI3
Definition: MIMXRT1052.h:20674
SAI4_Block_A
#define SAI4_Block_A
Definition: stm32h735xx.h:2614
SAI_Block_TypeDef::SLOTR
__IO uint32_t SLOTR
Definition: stm32f469xx.h:853
SAI_xCR2_FTH
#define SAI_xCR2_FTH
Definition: stm32f469xx.h:15432
SAI_InitTypeDef::ClockStrobing
uint32_t ClockStrobing
Definition: stm32f7xx_hal_sai.h:126
SAI_FLAG_MUTEDET
#define SAI_FLAG_MUTEDET
Definition: stm32f7xx_hal_sai.h:548
HAL_SAI_MspInit
void HAL_SAI_MspInit(SAI_HandleTypeDef *hsai)
Definition: stm32h7xx_hal_msp.c:398
SAI_InitTypeDef::Mckdiv
uint32_t Mckdiv
Definition: stm32f7xx_hal_sai.h:100
HAL_SAI_DMAStop
HAL_StatusTypeDef HAL_SAI_DMAStop(SAI_HandleTypeDef *hsai)
SAI_xCR1_OUTDRIV
#define SAI_xCR1_OUTDRIV
Definition: stm32f469xx.h:15410
SAI_CLOCKSTROBING_FALLINGEDGE
#define SAI_CLOCKSTROBING_FALLINGEDGE
Definition: stm32f7xx_hal_sai.h:382
SAI_IT_CNRDY
#define SAI_IT_CNRDY
Definition: stm32f7xx_hal_sai.h:537
SAI_InitTypeDef::CompandingMode
uint32_t CompandingMode
Definition: stm32f7xx_hal_sai.h:108
SAI_xCR1_SYNCEN
#define SAI_xCR1_SYNCEN
Definition: stm32f469xx.h:15401
HAL_RCCEx_GetPeriphCLKFreq
uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk)
SAI_FLAG_CNRDY
#define SAI_FLAG_CNRDY
Definition: stm32f7xx_hal_sai.h:551
SAI_GCR_SYNCIN_0
#define SAI_GCR_SYNCIN_0
Definition: stm32f469xx.h:15363
SAI_FLAG_LFSDET
#define SAI_FLAG_LFSDET
Definition: stm32f7xx_hal_sai.h:553
__DMA_HandleTypeDef::XferHalfCpltCallback
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:153
SAI_xCR2_MUTE
#define SAI_xCR2_MUTE
Definition: stm32f469xx.h:15445
SAI_FrameInitTypeDef::ActiveFrameLength
uint32_t ActiveFrameLength
Definition: stm32f7xx_hal_sai.h:146
__DMA_HandleTypeDef
DMA handle Structure definition.
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:139
NULL
#define NULL
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/speex_resampler/thirdparty/resample.c:92
SAI_TypeDef::PDMCR
__IO uint32_t PDMCR
Definition: stm32h735xx.h:1375
__SAI_HandleTypeDef::hdmatx
DMA_HandleTypeDef * hdmatx
Definition: stm32f7xx_hal_sai.h:207
HAL_SAI_DMAPause
HAL_StatusTypeDef HAL_SAI_DMAPause(SAI_HandleTypeDef *hsai)
SAI_xCR1_DMAEN
#define SAI_xCR1_DMAEN
Definition: stm32f469xx.h:15416
SAI_GCR_SYNCOUT_1
#define SAI_GCR_SYNCOUT_1
Definition: stm32f469xx.h:15370
IS_SAI_BLOCK_COMPANDING_MODE
#define IS_SAI_BLOCK_COMPANDING_MODE(MODE)
Definition: stm32f7xx_hal_sai.h:808
__SAI_HandleTypeDef::ErrorCode
__IO uint32_t ErrorCode
Definition: stm32f7xx_hal_sai.h:219
SAI_xCR1_SYNCEN_0
#define SAI_xCR1_SYNCEN_0
Definition: stm32f469xx.h:15402
HAL_UNLOCKED
@ HAL_UNLOCKED
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:53
IS_SAI_BLOCK_FRAME_LENGTH
#define IS_SAI_BLOCK_FRAME_LENGTH(LENGTH)
Definition: stm32f7xx_hal_sai.h:847
SAI_InitTypeDef::AudioFrequency
uint32_t AudioFrequency
Definition: stm32f7xx_hal_sai.h:97
SAI_FrameInitTypeDef::FSDefinition
uint32_t FSDefinition
Definition: stm32f7xx_hal_sai.h:151
SAI_FIFOSTATUS_FULL
#define SAI_FIFOSTATUS_FULL
Definition: stm32f7xx_hal_sai.h:566
__DMA_HandleTypeDef::ErrorCode
__IO uint32_t ErrorCode
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:163
HAL_DMA_Abort_IT
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
HAL_SAI_DeInit
HAL_StatusTypeDef HAL_SAI_DeInit(SAI_HandleTypeDef *hsai)
__SAI_HandleTypeDef::pBuffPtr
uint8_t * pBuffPtr
Definition: stm32f7xx_hal_sai.h:201
IS_SAI_BLOCK_SLOT_SIZE
#define IS_SAI_BLOCK_SLOT_SIZE(SIZE)
Definition: stm32f7xx_hal_sai.h:830
SAI_IT_OVRUDR
#define SAI_IT_OVRUDR
Definition: stm32f7xx_hal_sai.h:533
HAL_SAI_ERROR_WCKCFG
#define HAL_SAI_ERROR_WCKCFG
Definition: stm32f7xx_hal_sai.h:275
HAL_SAI_ERROR_TIMEOUT
#define HAL_SAI_ERROR_TIMEOUT
Definition: stm32f7xx_hal_sai.h:276
SAI_Block_TypeDef::SR
__IO uint32_t SR
Definition: stm32f469xx.h:855
SAI_PCM_SHORT
#define SAI_PCM_SHORT
Definition: stm32f7xx_hal_sai.h:302
SAI_Block_TypeDef::IMR
__IO uint32_t IMR
Definition: stm32f469xx.h:854
SAI_IT_LFSDET
#define SAI_IT_LFSDET
Definition: stm32f7xx_hal_sai.h:539
IS_SAI_SLOT_ACTIVE
#define IS_SAI_SLOT_ACTIVE(ACTIVE)
Definition: stm32f7xx_hal_sai.h:826
SAI_xCR2_MUTECNT_Pos
#define SAI_xCR2_MUTECNT_Pos
Definition: stm32f469xx.h:15450
IS_SAI_AUDIO_FREQUENCY
#define IS_SAI_AUDIO_FREQUENCY(AUDIO)
Definition: stm32f7xx_hal_sai.h:764
SAI_SYNCEXT_DISABLE
#define SAI_SYNCEXT_DISABLE
Definition: stm32f7xx_hal_sai.h:288
__DMA_HandleTypeDef::XferAbortCallback
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:161
IS_SAI_PDM_CLOCK_ENABLE
#define IS_SAI_PDM_CLOCK_ENABLE(CLOCK)
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:860
HAL_DMA_ERROR_NO_XFER
#define HAL_DMA_ERROR_NO_XFER
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:192
HAL_SAI_GetState
HAL_SAI_StateTypeDef HAL_SAI_GetState(SAI_HandleTypeDef *hsai)
SAI_FS_CHANNEL_IDENTIFICATION
#define SAI_FS_CHANNEL_IDENTIFICATION
Definition: stm32f7xx_hal_sai.h:421
SAI_InitTypeDef::Protocol
uint32_t Protocol
Definition: stm32f7xx_hal_sai.h:117
SAI_PDMCR_PDMEN
#define SAI_PDMCR_PDMEN
Definition: stm32h735xx.h:18113
__DMA_HandleTypeDef::Init
DMA_InitTypeDef Init
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:143
HAL_ERROR
@ HAL_ERROR
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:43
__SAI_HandleTypeDef::State
__IO HAL_SAI_StateTypeDef State
Definition: stm32f7xx_hal_sai.h:217
CLEAR_BIT
#define CLEAR_BIT(REG, BIT)
Definition: stm32f407/stm32f407g-disc1/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h:214
HAL_GetTick
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:323
HAL_SAI_STATE_READY
@ HAL_SAI_STATE_READY
Definition: stm32f7xx_hal_sai.h:51
SAI_xSR_FREQ
#define SAI_xSR_FREQ
Definition: stm32f469xx.h:15569
DMA_CIRCULAR
#define DMA_CIRCULAR
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:282
HAL_SAI_Receive
HAL_StatusTypeDef HAL_SAI_Receive(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size, uint32_t Timeout)
SAI_SlotInitTypeDef::SlotNumber
uint32_t SlotNumber
Definition: stm32f7xx_hal_sai.h:177
SAI_xFRCR_FSDEF
#define SAI_xFRCR_FSDEF
Definition: stm32f469xx.h:15496
SAI_InitTypeDef::MckOutput
uint32_t MckOutput
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:95
HAL_SAI_ERROR_AFSDET
#define HAL_SAI_ERROR_AFSDET
Definition: stm32f7xx_hal_sai.h:272
HAL_SAI_IRQHandler
void HAL_SAI_IRQHandler(SAI_HandleTypeDef *hsai)
IS_SAI_BLOCK_FIRST_BIT
#define IS_SAI_BLOCK_FIRST_BIT(BIT)
Definition: stm32f7xx_hal_sai.h:786
__SAI_HandleTypeDef::hdmarx
DMA_HandleTypeDef * hdmarx
Definition: stm32f7xx_hal_sai.h:209
IS_SAI_PDM_MIC_PAIRS_NUMBER
#define IS_SAI_PDM_MIC_PAIRS_NUMBER(VALUE)
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:858
__SAI_HandleTypeDef::Instance
SAI_Block_TypeDef * Instance
Definition: stm32f7xx_hal_sai.h:193
__SAI_HandleTypeDef::XferSize
uint16_t XferSize
Definition: stm32f7xx_hal_sai.h:203
IS_SAI_ALL_INSTANCE
#define IS_SAI_ALL_INSTANCE(PERIPH)
Definition: stm32f469xx.h:19803
SAI_InitTypeDef::FIFOThreshold
uint32_t FIFOThreshold
Definition: stm32f7xx_hal_sai.h:94
ENABLE
@ ENABLE
Definition: stm32f407/stm32f407g-disc1/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h:194
SAI_xCR1_MCKDIV
#define SAI_xCR1_MCKDIV
Definition: stm32f469xx.h:15423
SAI_IT_MUTEDET
#define SAI_IT_MUTEDET
Definition: stm32f7xx_hal_sai.h:534
SAI_MODEMASTER_RX
#define SAI_MODEMASTER_RX
Definition: stm32f7xx_hal_sai.h:339
SAI_InitTypeDef::SynchroExt
uint32_t SynchroExt
Definition: stm32f7xx_hal_sai.h:74
SAI1_Block_A
#define SAI1_Block_A
Definition: stm32f469xx.h:1334
HAL_SAI_ERROR_DMA
#define HAL_SAI_ERROR_DMA
Definition: stm32f7xx_hal_sai.h:277
HAL_OK
@ HAL_OK
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:42
SAI1
#define SAI1
Definition: MIMXRT1052.h:20666
SAI_FrameInitTypeDef::FSOffset
uint32_t FSOffset
Definition: stm32f7xx_hal_sai.h:157
IS_SAI_BLOCK_NODIVIDER
#define IS_SAI_BLOCK_NODIVIDER(NODIVIDER)
Definition: stm32f7xx_hal_sai.h:800
SAI_xFRCR_FSOFF
#define SAI_xFRCR_FSOFF
Definition: stm32f469xx.h:15502
SAI_InitTypeDef::Synchro
uint32_t Synchro
Definition: stm32f7xx_hal_sai.h:71
IS_SAI_BLOCK_MUTE_VALUE
#define IS_SAI_BLOCK_MUTE_VALUE(VALUE)
Definition: stm32f7xx_hal_sai.h:805
SAI_SYNCHRONOUS
#define SAI_SYNCHRONOUS
Definition: stm32f7xx_hal_sai.h:392
IS_FUNCTIONAL_STATE
#define IS_FUNCTIONAL_STATE(STATE)
Definition: stm32f407/stm32f407g-disc1/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h:196
HAL_SAI_ERROR_UDR
#define HAL_SAI_ERROR_UDR
Definition: stm32f7xx_hal_sai.h:271
SAI_SLOTSIZE_32B
#define SAI_SLOTSIZE_32B
Definition: stm32f7xx_hal_sai.h:449
SAI_xCR1_SAIEN
#define SAI_xCR1_SAIEN
Definition: stm32f469xx.h:15413
HAL_SAI_STATE_BUSY_RX
@ HAL_SAI_STATE_BUSY_RX
Definition: stm32f7xx_hal_sai.h:54
UNUSED
#define UNUSED(x)
Definition: porcupine/demo/c/dr_libs/old/dr.h:92
SAI4
#define SAI4
Definition: stm32h735xx.h:2613
__HAL_SAI_CLEAR_FLAG
#define __HAL_SAI_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clear the specified SAI pending flag.
Definition: stm32f7xx_hal_sai.h:655
SAI2_Block_B
#define SAI2_Block_B
Definition: stm32f769xx.h:1612
SAI_FLAG_OVRUDR
#define SAI_FLAG_OVRUDR
Definition: stm32f7xx_hal_sai.h:547
SAI_xCR2_FFLUSH
#define SAI_xCR2_FFLUSH
Definition: stm32f469xx.h:15439
SAI_DATASIZE_32
#define SAI_DATASIZE_32
Definition: stm32f7xx_hal_sai.h:365
SAI_DATASIZE_8
#define SAI_DATASIZE_8
Definition: stm32f7xx_hal_sai.h:360
IS_SAI_BLOCK_SYNCEXT
#define IS_SAI_BLOCK_SYNCEXT(STATE)
Definition: stm32f7xx_hal_sai.h:749
HAL_SAI_InitProtocol
HAL_StatusTypeDef HAL_SAI_InitProtocol(SAI_HandleTypeDef *hsai, uint32_t protocol, uint32_t datasize, uint32_t nbslot)
SAI_FLAG_AFSDET
#define SAI_FLAG_AFSDET
Definition: stm32f7xx_hal_sai.h:552
__SAI_HandleTypeDef::Init
SAI_InitTypeDef Init
Definition: stm32f7xx_hal_sai.h:195
IS_SAI_BLOCK_FIFO_THRESHOLD
#define IS_SAI_BLOCK_FIFO_THRESHOLD(THRESHOLD)
Definition: stm32f7xx_hal_sai.h:814
SAI_AC97_PROTOCOL
#define SAI_AC97_PROTOCOL
Definition: stm32f7xx_hal_sai.h:352
IS_SAI_PROTOCOL_DATASIZE
#define IS_SAI_PROTOCOL_DATASIZE(DATASIZE)
Definition: stm32f7xx_hal_sai.h:759
__SAI_HandleTypeDef
Definition: stm32f7xx_hal_sai.h:191
__SAI_HandleTypeDef::Lock
HAL_LockTypeDef Lock
Definition: stm32f7xx_hal_sai.h:215
HAL_SAI_RxHalfCpltCallback
void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
Half reception complete callback.
Definition: stm32f769i_discovery_audio.c:1593
SAI_InitTypeDef::OutputDrive
uint32_t OutputDrive
Definition: stm32f7xx_hal_sai.h:80
HAL_SAI_ERROR_LFSDET
#define HAL_SAI_ERROR_LFSDET
Definition: stm32f7xx_hal_sai.h:273
IS_SAI_BLOCK_CLOCK_STROBING
#define IS_SAI_BLOCK_CLOCK_STROBING(CLOCK)
Definition: stm32f7xx_hal_sai.h:789
__HAL_LOCK
#define __HAL_LOCK(__HANDLE__)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:93
SAI_NOCOMPANDING
#define SAI_NOCOMPANDING
Definition: stm32f7xx_hal_sai.h:512
SAI_xSLOTR_FBOFF
#define SAI_xSLOTR_FBOFF
Definition: stm32f469xx.h:15509
SAI_InitTypeDef::NoDivider
uint32_t NoDivider
Definition: stm32f7xx_hal_sai.h:85
HAL_GetREVID
uint32_t HAL_GetREVID(void)
Returns the device revision identifier.
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:450
HAL_SAI_ERROR_OVR
#define HAL_SAI_ERROR_OVR
Definition: stm32f7xx_hal_sai.h:270
HAL_SAI_GetError
uint32_t HAL_SAI_GetError(SAI_HandleTypeDef *hsai)
SAI_AUDIO_FREQUENCY_MCKDIV
#define SAI_AUDIO_FREQUENCY_MCKDIV
Definition: stm32f7xx_hal_sai.h:330
HAL_SAI_DMAResume
HAL_StatusTypeDef HAL_SAI_DMAResume(SAI_HandleTypeDef *hsai)
SystemCoreClock
uint32_t SystemCoreClock
Definition: system_MIMXRT1052.c:69
__SAI_HandleTypeDef::XferCount
uint16_t XferCount
Definition: stm32f7xx_hal_sai.h:205
HAL_SAI_RxCpltCallback
void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
Reception complete callback.
Definition: stm32f769i_discovery_audio.c:1605
SAI4_Block_B
#define SAI4_Block_B
Definition: stm32h735xx.h:2615
IS_SAI_BLOCK_FIRSTBIT_OFFSET
#define IS_SAI_BLOCK_FIRSTBIT_OFFSET(OFFSET)
Definition: stm32f7xx_hal_sai.h:834
SAI_I2S_MSBJUSTIFIED
#define SAI_I2S_MSBJUSTIFIED
Definition: stm32f7xx_hal_sai.h:299
SAI_MASTERDIVIDER_DISABLE
#define SAI_MASTERDIVIDER_DISABLE
Definition: stm32f7xx_hal_sai.h:412
SAI_SPDIF_PROTOCOL
#define SAI_SPDIF_PROTOCOL
Definition: stm32f7xx_hal_sai.h:351
HAL_SAI_Transmit_IT
HAL_StatusTypeDef HAL_SAI_Transmit_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
count
size_t count
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_common/ma_test_common.c:31
SAI_TypeDef::PDMDLY
__IO uint32_t PDMDLY
Definition: stm32h735xx.h:1376
SAI_MODESLAVE_RX
#define SAI_MODESLAVE_RX
Definition: stm32f7xx_hal_sai.h:341
SAI_SLOTACTIVE_ALL
#define SAI_SLOTACTIVE_ALL
Definition: stm32f7xx_hal_sai.h:474
HAL_SAI_ErrorCallback
void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai)
SAI error callbacks.
Definition: stm32469i_discovery_audio.c:628
HAL_BUSY
@ HAL_BUSY
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:44
HAL_DMA_Start_IT
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
SAI_FS_FIRSTBIT
#define SAI_FS_FIRSTBIT
Definition: stm32f7xx_hal_sai.h:438
IS_SAI_BLOCK_FS_DEFINITION
#define IS_SAI_BLOCK_FS_DEFINITION(DEFINITION)
Definition: stm32f7xx_hal_sai.h:842
HAL_SAI_TxHalfCpltCallback
void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
Tx Half Transfer completed callbacks.
Definition: stm32469i_discovery_audio.c:617
SAI2_Block_A
#define SAI2_Block_A
Definition: stm32f769xx.h:1611
HAL_SAI_EnableTxMuteMode
HAL_StatusTypeDef HAL_SAI_EnableTxMuteMode(SAI_HandleTypeDef *hsai, uint16_t val)
SAI_TypeDef::GCR
__IO uint32_t GCR
Definition: stm32f469xx.h:845
SAI_InitTypeDef::TriState
uint32_t TriState
Definition: stm32f7xx_hal_sai.h:111
SAI_InitTypeDef::MckOverSampling
uint32_t MckOverSampling
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:123
RCC_PERIPHCLK_SAI2
#define RCC_PERIPHCLK_SAI2
Definition: stm32f7xx_hal_rcc_ex.h:257
__HAL_UNLOCK
#define __HAL_UNLOCK(__HANDLE__)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:105
IS_SAI_BLOCK_MASTER_DIVIDER
#define IS_SAI_BLOCK_MASTER_DIVIDER(DIVIDER)
Definition: stm32f7xx_hal_sai.h:845
__HAL_SAI_ENABLE_IT
#define __HAL_SAI_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enable or disable the specified SAI interrupts.
Definition: stm32f7xx_hal_sai.h:608
SAI_IT_WCKCFG
#define SAI_IT_WCKCFG
Definition: stm32f7xx_hal_sai.h:535
__HAL_SAI_DISABLE
#define __HAL_SAI_DISABLE(__HANDLE__)
Definition: stm32f7xx_hal_sai.h:658
HAL_MAX_DELAY
#define HAL_MAX_DELAY
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:61
SAI_xCR2_COMP
#define SAI_xCR2_COMP
Definition: stm32f469xx.h:15466
SAI_xCR1_MODE
#define SAI_xCR1_MODE
Definition: stm32f469xx.h:15375
SAI_MODEMASTER_TX
#define SAI_MODEMASTER_TX
Definition: stm32f7xx_hal_sai.h:338
HAL_DMA_Abort
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
__SAI_HandleTypeDef::InterruptServiceRoutine
void(* InterruptServiceRoutine)(struct __SAI_HandleTypeDef *hsai)
Definition: stm32f7xx_hal_sai.h:213
SAI_InitTypeDef::DataSize
uint32_t DataSize
Definition: stm32f7xx_hal_sai.h:120
IS_SAI_BLOCK_FS_OFFSET
#define IS_SAI_BLOCK_FS_OFFSET(OFFSET)
Definition: stm32f7xx_hal_sai.h:836
SAI_xCR2_MUTEVAL
#define SAI_xCR2_MUTEVAL
Definition: stm32f469xx.h:15448
SAI_IT_FREQ
#define SAI_IT_FREQ
Definition: stm32f7xx_hal_sai.h:536
SAI_I2S_LSBJUSTIFIED
#define SAI_I2S_LSBJUSTIFIED
Definition: stm32f7xx_hal_sai.h:300
SAI_DATASIZE_24
#define SAI_DATASIZE_24
Definition: stm32f7xx_hal_sai.h:364
SAI_xCR2_MUTECNT
#define SAI_xCR2_MUTECNT
Definition: stm32f469xx.h:15452
SAI_SlotInitTypeDef::SlotSize
uint32_t SlotSize
Definition: stm32f7xx_hal_sai.h:174
IS_SAI_BLOCK_MODE
#define IS_SAI_BLOCK_MODE(MODE)
Definition: stm32f7xx_hal_sai.h:770
HAL_SAI_Transmit
HAL_StatusTypeDef HAL_SAI_Transmit(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size, uint32_t Timeout)
IS_SAI_SUPPORTED_PROTOCOL
#define IS_SAI_SUPPORTED_PROTOCOL(PROTOCOL)
Definition: stm32f7xx_hal_sai.h:753
SAI_SYNCHRONOUS_EXT_SAI2
#define SAI_SYNCHRONOUS_EXT_SAI2
Definition: stm32f7xx_hal_sai.h:394
SAI_SYNCEXT_OUTBLOCKA_ENABLE
#define SAI_SYNCEXT_OUTBLOCKA_ENABLE
Definition: stm32f7xx_hal_sai.h:289
SAI_SlotInitTypeDef::SlotActive
uint32_t SlotActive
Definition: stm32f7xx_hal_sai.h:180
SAI_PdmInitTypeDef::Activation
FunctionalState Activation
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:67
HAL_SAI_TxCpltCallback
void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
Tx Transfer completed callbacks.
Definition: stm32469i_discovery_audio.c:606
__HAL_SAI_ENABLE
#define __HAL_SAI_ENABLE(__HANDLE__)
Definition: stm32f7xx_hal_sai.h:657
SAI_FIRSTBIT_MSB
#define SAI_FIRSTBIT_MSB
Definition: stm32f7xx_hal_sai.h:373
SAI_Block_TypeDef::CR2
__IO uint32_t CR2
Definition: stm32f469xx.h:851
SAI_SlotInitTypeDef::FirstBitOffset
uint32_t FirstBitOffset
Definition: stm32f7xx_hal_sai.h:171
HAL_TIMEOUT
@ HAL_TIMEOUT
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:45
HAL_SAI_Receive_DMA
HAL_StatusTypeDef HAL_SAI_Receive_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
SAI3_Block_A
#define SAI3_Block_A
Definition: stm32h747xx.h:2571
SAI_Block_TypeDef::CLRFR
__IO uint32_t CLRFR
Definition: stm32f469xx.h:856
SAI_DATASIZE_16
#define SAI_DATASIZE_16
Definition: stm32f7xx_hal_sai.h:362
RCC_PERIPHCLK_SAI1
#define RCC_PERIPHCLK_SAI1
Definition: stm32f7xx_hal_rcc_ex.h:256
SAI_FIFOSTATUS_EMPTY
#define SAI_FIFOSTATUS_EMPTY
Definition: stm32f7xx_hal_sai.h:561
HAL_SAI_STATE_BUSY_TX
@ HAL_SAI_STATE_BUSY_TX
Definition: stm32f7xx_hal_sai.h:53
SAI_PDMCR_MICNBR_Pos
#define SAI_PDMCR_MICNBR_Pos
Definition: stm32h735xx.h:18115
SAI_FrameInitTypeDef::FSPolarity
uint32_t FSPolarity
Definition: stm32f7xx_hal_sai.h:154
__DMA_HandleTypeDef::XferCpltCallback
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:151
SAI_GCR_SYNCIN_1
#define SAI_GCR_SYNCIN_1
Definition: stm32f469xx.h:15364
SAI_xFRCR_FSALL
#define SAI_xFRCR_FSALL
Definition: stm32f469xx.h:15485
SAI_PdmInitTypeDef::ClockEnable
uint32_t ClockEnable
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:70
SAI_FLAG_WCKCFG
#define SAI_FLAG_WCKCFG
Definition: stm32f7xx_hal_sai.h:549
IS_SAI_BLOCK_DATASIZE
#define IS_SAI_BLOCK_DATASIZE(DATASIZE)
Definition: stm32f7xx_hal_sai.h:779
HAL_SAI_StateTypeDef
HAL_SAI_StateTypeDef
HAL State structures definition.
Definition: stm32f7xx_hal_sai.h:48
SAI_xCR1_OSR
#define SAI_xCR1_OSR
Definition: stm32h735xx.h:17918
SAI3_Block_B
#define SAI3_Block_B
Definition: stm32h747xx.h:2572
IS_SAI_BLOCK_ACTIVE_FRAME
#define IS_SAI_BLOCK_ACTIVE_FRAME(LENGTH)
Definition: stm32f7xx_hal_sai.h:849
SAI_FS_ACTIVE_LOW
#define SAI_FS_ACTIVE_LOW
Definition: stm32f7xx_hal_sai.h:429
SAI_ASYNCHRONOUS
#define SAI_ASYNCHRONOUS
Definition: stm32f7xx_hal_sai.h:391
HAL_SAI_ERROR_CNREADY
#define HAL_SAI_ERROR_CNREADY
Definition: stm32f7xx_hal_sai.h:274
HAL_SAI_Init
HAL_StatusTypeDef HAL_SAI_Init(SAI_HandleTypeDef *hsai)
SAI_xSR_FLVL
#define SAI_xSR_FLVL
Definition: stm32f469xx.h:15582
SAI_PROTOCOL_DATASIZE_32BIT
#define SAI_PROTOCOL_DATASIZE_32BIT
Definition: stm32f7xx_hal_sai.h:313
HAL_SAI_STATE_BUSY
@ HAL_SAI_STATE_BUSY
Definition: stm32f7xx_hal_sai.h:52
IS_SAI_MONO_STEREO_MODE
#define IS_SAI_MONO_STEREO_MODE(MODE)
Definition: stm32f7xx_hal_sai.h:823
SAI_xCR1_SYNCEN_1
#define SAI_xCR1_SYNCEN_1
Definition: stm32f469xx.h:15403
HAL_DMA_GetError
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
SAI_PROTOCOL_DATASIZE_16BITEXTENDED
#define SAI_PROTOCOL_DATASIZE_16BITEXTENDED
Definition: stm32f7xx_hal_sai.h:311
REV_ID_B
#define REV_ID_B
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal.h:61
SAI_Block_TypeDef::FRCR
__IO uint32_t FRCR
Definition: stm32f469xx.h:852
SAI_xCR1_PRTCFG
#define SAI_xCR1_PRTCFG
Definition: stm32f469xx.h:15381
HAL_SAI_Receive_IT
HAL_StatusTypeDef HAL_SAI_Receive_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
SAI_InitTypeDef::AudioMode
uint32_t AudioMode
Definition: stm32f7xx_hal_sai.h:68
DMA_InitTypeDef::Mode
uint32_t Mode
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:70
IS_SAI_BLOCK_SYNCHRO
#define IS_SAI_BLOCK_SYNCHRO(SYNCHRO)
Definition: stm32f7xx_hal_sai.h:792
SET_BIT
#define SET_BIT(REG, BIT)
Definition: stm32f407/stm32f407g-disc1/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h:212
SAI_Block_TypeDef::DR
__IO uint32_t DR
Definition: stm32f469xx.h:857
IS_SAI_BLOCK_TRISTATE_MANAGEMENT
#define IS_SAI_BLOCK_TRISTATE_MANAGEMENT(STATE)
Definition: stm32f7xx_hal_sai.h:820
IS_SAI_BLOCK_FS_POLARITY
#define IS_SAI_BLOCK_FS_POLARITY(POLARITY)
Definition: stm32f7xx_hal_sai.h:839
SAI_SYNCHRONOUS_EXT_SAI1
#define SAI_SYNCHRONOUS_EXT_SAI1
Definition: stm32f7xx_hal_sai.h:393
IS_SAI_BLOCK_OUTPUT_DRIVE
#define IS_SAI_BLOCK_OUTPUT_DRIVE(DRIVE)
Definition: stm32f7xx_hal_sai.h:797
SAI_CLOCKSTROBING_RISINGEDGE
#define SAI_CLOCKSTROBING_RISINGEDGE
Definition: stm32f7xx_hal_sai.h:383
__HAL_SAI_DISABLE_IT
#define __HAL_SAI_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Definition: stm32f7xx_hal_sai.h:609
SAI_FrameInitTypeDef::FrameLength
uint32_t FrameLength
Definition: stm32f7xx_hal_sai.h:140
SAI1_Block_B
#define SAI1_Block_B
Definition: stm32f469xx.h:1335
IS_SAI_BLOCK_MCK_OUTPUT
#define IS_SAI_BLOCK_MCK_OUTPUT(VALUE)
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:903
HAL_SAI_STATE_RESET
@ HAL_SAI_STATE_RESET
Definition: stm32f7xx_hal_sai.h:50
HAL_DMA_ERROR_FE
#define HAL_DMA_ERROR_FE
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:188
SAIcallback
void(* SAIcallback)(void)
SAI Callback prototype.
Definition: stm32f7xx_hal_sai.h:60
SAI2
#define SAI2
Definition: MIMXRT1052.h:20670
HAL_SAI_MspDeInit
void HAL_SAI_MspDeInit(SAI_HandleTypeDef *hsai)
Definition: stm32h7xx_hal_msp.c:456
HAL_SAI_Abort
HAL_StatusTypeDef HAL_SAI_Abort(SAI_HandleTypeDef *hsai)
SAI_MCK_OVERSAMPLING_ENABLE
#define SAI_MCK_OVERSAMPLING_ENABLE
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:373
SAI_xSLOTR_SLOTSZ
#define SAI_xSLOTR_SLOTSZ
Definition: stm32f469xx.h:15518
SAI_FS_ACTIVE_HIGH
#define SAI_FS_ACTIVE_HIGH
Definition: stm32f7xx_hal_sai.h:430
SAI_I2S_STANDARD
#define SAI_I2S_STANDARD
Definition: stm32f7xx_hal_sai.h:298
__SAI_HandleTypeDef::SlotInit
SAI_SlotInitTypeDef SlotInit
Definition: stm32f7xx_hal_sai.h:199
IS_SAI_BLOCK_SLOT_NUMBER
#define IS_SAI_BLOCK_SLOT_NUMBER(NUMBER)
Definition: stm32f7xx_hal_sai.h:828
__SAI_HandleTypeDef::FrameInit
SAI_FrameInitTypeDef FrameInit
Definition: stm32f7xx_hal_sai.h:197
SAI_GCR_SYNCOUT_0
#define SAI_GCR_SYNCOUT_0
Definition: stm32f469xx.h:15369
SAI_xCR1_DS
#define SAI_xCR1_DS
Definition: stm32f469xx.h:15387
IS_SAI_BLOCK_MCK_OVERSAMPLING
#define IS_SAI_BLOCK_MCK_OVERSAMPLING(VALUE)
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:855
SAI_FS_BEFOREFIRSTBIT
#define SAI_FS_BEFOREFIRSTBIT
Definition: stm32f7xx_hal_sai.h:439
SAI_MODESLAVE_TX
#define SAI_MODESLAVE_TX
Definition: stm32f7xx_hal_sai.h:340
HAL_SAI_ERROR_NONE
#define HAL_SAI_ERROR_NONE
Definition: stm32f7xx_hal_sai.h:269
SAI_xSLOTR_SLOTEN
#define SAI_xSLOTR_SLOTEN
Definition: stm32f469xx.h:15532
SAI_xFRCR_FRL
#define SAI_xFRCR_FRL
Definition: stm32f469xx.h:15473
SAI_InitTypeDef::FirstBit
uint32_t FirstBit
Definition: stm32f7xx_hal_sai.h:123
SAI_SLOTSIZE_16B
#define SAI_SLOTSIZE_16B
Definition: stm32f7xx_hal_sai.h:448
SAI_SYNCEXT_OUTBLOCKB_ENABLE
#define SAI_SYNCEXT_OUTBLOCKB_ENABLE
Definition: stm32f7xx_hal_sai.h:290
HAL_SAI_Transmit_DMA
HAL_StatusTypeDef HAL_SAI_Transmit_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
__DMA_HandleTypeDef::XferErrorCallback
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h:159
SAI_TypeDef
Serial Audio Interface.
Definition: stm32f469xx.h:843
HAL_SAI_EnableRxMuteMode
HAL_StatusTypeDef HAL_SAI_EnableRxMuteMode(SAI_HandleTypeDef *hsai, SAIcallback callback, uint16_t counter)
SAI_Block_TypeDef::CR1
__IO uint32_t CR1
Definition: stm32f469xx.h:850
SAI_PROTOCOL_DATASIZE_16BIT
#define SAI_PROTOCOL_DATASIZE_16BIT
Definition: stm32f7xx_hal_sai.h:310
SAI_PdmInitTypeDef::MicPairsNbr
uint32_t MicPairsNbr
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:68
SAI_InitTypeDef::PdmInit
SAI_PdmInitTypeDef PdmInit
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h:135


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:14:55