189#ifdef HAL_I2S_MODULE_ENABLED
202#define I2S_TIMEOUT_FLAG 100U
269 uint32_t packetlength;
272#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
300#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
304#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
305 hi2s->TxRxCpltCallback = HAL_I2SEx_TxRxCpltCallback;
309#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
310 hi2s->TxRxHalfCpltCallback = HAL_I2SEx_TxRxHalfCpltCallback;
314 if (hi2s->MspInitCallback == NULL)
320 hi2s->MspInitCallback(hi2s);
331 CLEAR_BIT(hi2s->
Instance->I2SCFGR, (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CKPOL | \
332 SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC | SPI_I2SCFGR_I2SCFG | \
333 SPI_I2SCFGR_I2SE | SPI_I2SCFGR_I2SMOD));
356 packetlength = packetlength * 2U;
360#if defined(I2S_APB1_APB2_FEATURE)
361 if (IS_I2S_APB1_INSTANCE(hi2s->
Instance))
379 tmp = (uint32_t)(((((i2sclk / (packetlength * 4U)) * 10U) / hi2s->
Init.
AudioFreq)) + 5U);
383 tmp = (uint32_t)(((((i2sclk / (packetlength * 8U)) * 10U) / hi2s->
Init.
AudioFreq)) + 5U);
389 tmp = (uint32_t)(((((i2sclk / packetlength) * 10U) / hi2s->
Init.
AudioFreq)) + 5U);
396 i2sodd = (uint32_t)(tmp & (uint32_t)1U);
399 i2sdiv = (uint32_t)((tmp - i2sodd) / 2U);
402 i2sodd = (uint32_t)(i2sodd << 8U);
412 if ((i2sdiv < 2U) || (i2sdiv > 0xFFU))
422 hi2s->
Instance->I2SPR = (uint32_t)((uint32_t)i2sdiv | (uint32_t)(i2sodd | (uint32_t)hi2s->
Init.
MCLKOutput));
426 MODIFY_REG(hi2s->
Instance->I2SCFGR, (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | \
427 SPI_I2SCFGR_CKPOL | SPI_I2SCFGR_I2SSTD | \
428 SPI_I2SCFGR_PCMSYNC | SPI_I2SCFGR_I2SCFG | \
429 SPI_I2SCFGR_I2SE | SPI_I2SCFGR_I2SMOD), \
430 (SPI_I2SCFGR_I2SMOD | hi2s->
Init.
Mode | \
434#if defined(SPI_I2SCFGR_ASTRTEN)
438 SET_BIT(hi2s->
Instance->I2SCFGR, SPI_I2SCFGR_ASTRTEN);
442#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
453 CLEAR_BIT(I2SxEXT(hi2s->
Instance)->I2SCFGR, (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CKPOL | \
454 SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC | SPI_I2SCFGR_I2SCFG | \
455 SPI_I2SCFGR_I2SE | SPI_I2SCFGR_I2SMOD));
456 I2SxEXT(hi2s->
Instance)->I2SPR = 2U;
459 tmpreg = I2SxEXT(hi2s->
Instance)->I2SCFGR;
472 tmpreg |= (uint16_t)((uint16_t)SPI_I2SCFGR_I2SMOD | \
479 WRITE_REG(I2SxEXT(hi2s->
Instance)->I2SCFGR, tmpreg);
511#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
512 if (hi2s->MspDeInitCallback == NULL)
518 hi2s->MspDeInitCallback(hi2s);
565#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
576 pI2S_CallbackTypeDef pCallback)
580 if (pCallback == NULL)
583 hi2s->
ErrorCode |= HAL_I2S_ERROR_INVALID_CALLBACK;
594 case HAL_I2S_TX_COMPLETE_CB_ID :
595 hi2s->TxCpltCallback = pCallback;
598 case HAL_I2S_RX_COMPLETE_CB_ID :
599 hi2s->RxCpltCallback = pCallback;
602#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
603 case HAL_I2S_TX_RX_COMPLETE_CB_ID :
604 hi2s->TxRxCpltCallback = pCallback;
608 case HAL_I2S_TX_HALF_COMPLETE_CB_ID :
609 hi2s->TxHalfCpltCallback = pCallback;
612 case HAL_I2S_RX_HALF_COMPLETE_CB_ID :
613 hi2s->RxHalfCpltCallback = pCallback;
616#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
617 case HAL_I2S_TX_RX_HALF_COMPLETE_CB_ID :
618 hi2s->TxRxHalfCpltCallback = pCallback;
622 case HAL_I2S_ERROR_CB_ID :
623 hi2s->ErrorCallback = pCallback;
626 case HAL_I2S_MSPINIT_CB_ID :
627 hi2s->MspInitCallback = pCallback;
630 case HAL_I2S_MSPDEINIT_CB_ID :
631 hi2s->MspDeInitCallback = pCallback;
636 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_INVALID_CALLBACK);
647 case HAL_I2S_MSPINIT_CB_ID :
648 hi2s->MspInitCallback = pCallback;
651 case HAL_I2S_MSPDEINIT_CB_ID :
652 hi2s->MspDeInitCallback = pCallback;
657 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_INVALID_CALLBACK);
667 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_INVALID_CALLBACK);
697 case HAL_I2S_TX_COMPLETE_CB_ID :
701 case HAL_I2S_RX_COMPLETE_CB_ID :
705#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
706 case HAL_I2S_TX_RX_COMPLETE_CB_ID :
707 hi2s->TxRxCpltCallback = HAL_I2SEx_TxRxCpltCallback;
711 case HAL_I2S_TX_HALF_COMPLETE_CB_ID :
715 case HAL_I2S_RX_HALF_COMPLETE_CB_ID :
719#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
720 case HAL_I2S_TX_RX_HALF_COMPLETE_CB_ID :
721 hi2s->TxRxHalfCpltCallback = HAL_I2SEx_TxRxHalfCpltCallback;
725 case HAL_I2S_ERROR_CB_ID :
729 case HAL_I2S_MSPINIT_CB_ID :
733 case HAL_I2S_MSPDEINIT_CB_ID :
739 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_INVALID_CALLBACK);
750 case HAL_I2S_MSPINIT_CB_ID :
754 case HAL_I2S_MSPDEINIT_CB_ID :
760 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_INVALID_CALLBACK);
770 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_INVALID_CALLBACK);
844 uint32_t tmpreg_cfgr;
846 if ((pData == NULL) || (Size == 0U))
864 tmpreg_cfgr = hi2s->
Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);
877 tmpreg_cfgr = hi2s->
Instance->I2SCFGR;
880 if ((hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
962 uint32_t tmpreg_cfgr;
964 if ((pData == NULL) || (Size == 0U))
982 tmpreg_cfgr = hi2s->
Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);
996 if ((hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
1059 uint32_t tmpreg_cfgr;
1061 if ((pData == NULL) || (Size == 0U))
1079 tmpreg_cfgr = hi2s->
Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);
1098 if ((hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
1125 uint32_t tmpreg_cfgr;
1127 if ((pData == NULL) || (Size == 0U))
1145 tmpreg_cfgr = hi2s->
Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);
1164 if ((hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
1189 uint32_t tmpreg_cfgr;
1191 if ((pData == NULL) || (Size == 0U))
1209 tmpreg_cfgr = hi2s->
Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);
1251 SET_BIT(hi2s->
Instance->CR2, SPI_CR2_TXDMAEN);
1280 uint32_t tmpreg_cfgr;
1282 if ((pData == NULL) || (Size == 0U))
1300 tmpreg_cfgr = hi2s->
Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);
1348 SET_BIT(hi2s->
Instance->CR2, SPI_CR2_RXDMAEN);
1375 CLEAR_BIT(hi2s->
Instance->CR2, SPI_CR2_TXDMAEN);
1380 CLEAR_BIT(hi2s->
Instance->CR2, SPI_CR2_RXDMAEN);
1382#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
1386 CLEAR_BIT(hi2s->
Instance->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN));
1387 CLEAR_BIT(I2SxEXT(hi2s->
Instance)->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN));
1415 SET_BIT(hi2s->
Instance->CR2, SPI_CR2_TXDMAEN);
1420 SET_BIT(hi2s->
Instance->CR2, SPI_CR2_RXDMAEN);
1422#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
1426 SET_BIT(hi2s->
Instance->CR2, (SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN));
1427 SET_BIT(I2SxEXT(hi2s->
Instance)->CR2, (SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN));
1430 if ((I2SxEXT(hi2s->
Instance)->I2SCFGR & SPI_I2SCFGR_I2SE) == 0U)
1433 __HAL_I2SEXT_ENABLE(hi2s);
1463#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
1476 if (hi2s->
hdmatx != NULL)
1511 CLEAR_BIT(hi2s->
Instance->CR2, SPI_CR2_TXDMAEN);
1513#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
1518 if (hi2s->
hdmarx != NULL)
1529 __HAL_I2SEXT_DISABLE(hi2s);
1532 __HAL_I2SEXT_CLEAR_OVRFLAG(hi2s);
1535 CLEAR_BIT(I2SxEXT(hi2s->
Instance)->CR2, SPI_CR2_RXDMAEN);
1549 READ_REG(I2SxEXT(hi2s->
Instance)->DR);
1558 if (hi2s->
hdmarx != NULL)
1567#if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
1572 if (hi2s->
hdmatx != NULL)
1585 while (__HAL_I2SEXT_GET_FLAG(hi2s,
I2S_FLAG_TXE) != SET)
1599 while (__HAL_I2SEXT_GET_FLAG(hi2s,
I2S_FLAG_BSY) != RESET)
1613 __HAL_I2SEXT_DISABLE(hi2s);
1616 __HAL_I2SEXT_CLEAR_UDRFLAG(hi2s);
1619 CLEAR_BIT(I2SxEXT(hi2s->
Instance)->CR2, SPI_CR2_TXDMAEN);
1630 CLEAR_BIT(hi2s->
Instance->CR2, SPI_CR2_RXDMAEN);
1810 CLEAR_BIT(hi2s->
Instance->CR2, SPI_CR2_TXDMAEN);
1816#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
1817 hi2s->TxCpltCallback(hi2s);
1834#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
1835 hi2s->TxHalfCpltCallback(hi2s);
1855 CLEAR_BIT(hi2s->
Instance->CR2, SPI_CR2_RXDMAEN);
1860#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
1861 hi2s->RxCpltCallback(hi2s);
1878#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
1879 hi2s->RxHalfCpltCallback(hi2s);
1896 CLEAR_BIT(hi2s->
Instance->CR2, (SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN));
1905#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
1906 hi2s->ErrorCallback(hi2s);
1932#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
1933 hi2s->TxCpltCallback(hi2s);
1960#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
1961 hi2s->RxCpltCallback(hi2s);
1976 __IO uint32_t i2ssr = hi2s->
Instance->SR;
2002#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
2003 hi2s->ErrorCallback(hi2s);
2033#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
2034 hi2s->ErrorCallback(hi2s);
2064 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define I2S_AUDIOFREQ_DEFAULT
#define HAL_I2S_ERROR_BUSY_LINE_RX
#define HAL_I2S_ERROR_UDR
#define HAL_I2S_ERROR_NONE
#define HAL_I2S_ERROR_DMA
#define HAL_I2S_ERROR_PRESCALER
#define HAL_I2S_ERROR_TIMEOUT
#define HAL_I2S_ERROR_OVR
void HAL_I2S_MspInit(I2S_HandleTypeDef *hi2s)
I2S MSP Init.
void HAL_I2S_MspDeInit(I2S_HandleTypeDef *hi2s)
I2S MSP DeInit.
HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s)
Initializes the I2S according to the specified parameters in the I2S_InitTypeDef and create the assoc...
HAL_StatusTypeDef HAL_I2S_DeInit(I2S_HandleTypeDef *hi2s)
DeInitializes the I2S peripheral.
HAL_StatusTypeDef HAL_I2S_Receive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
Receive an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_I2S_DMAPause(I2S_HandleTypeDef *hi2s)
Pauses the audio DMA Stream/Channel playing from the Media.
HAL_StatusTypeDef HAL_I2S_Receive(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size, uint32_t Timeout)
Receive an amount of data in blocking mode.
HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
Transmit an amount of data in non-blocking mode with Interrupt.
void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
Tx Transfer Half completed callbacks.
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
Rx Transfer completed callbacks.
HAL_StatusTypeDef HAL_I2S_Transmit_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
Transmit an amount of data in non-blocking mode with DMA.
void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s)
Tx Transfer completed callbacks.
HAL_StatusTypeDef HAL_I2S_DMAResume(I2S_HandleTypeDef *hi2s)
Resumes the audio DMA Stream/Channel playing from the Media.
void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s)
I2S error callbacks.
HAL_StatusTypeDef HAL_I2S_Receive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
Receive an amount of data in non-blocking mode with DMA.
void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
Rx Transfer half completed callbacks.
HAL_StatusTypeDef HAL_I2S_Transmit(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size, uint32_t Timeout)
Transmit an amount of data in blocking mode.
void HAL_I2S_IRQHandler(I2S_HandleTypeDef *hi2s)
This function handles I2S interrupt request.
HAL_StatusTypeDef HAL_I2S_DMAStop(I2S_HandleTypeDef *hi2s)
Stops the audio DMA Stream/Channel playing from the Media.
uint32_t HAL_I2S_GetError(I2S_HandleTypeDef *hi2s)
Return the I2S error code.
HAL_I2S_StateTypeDef HAL_I2S_GetState(I2S_HandleTypeDef *hi2s)
Return the I2S state.
HAL_I2S_StateTypeDef
HAL State structures definition.
@ HAL_I2S_STATE_BUSY_TX_RX
#define __HAL_I2S_ENABLE(__HANDLE__)
Enable the specified SPI peripheral (in I2S mode).
#define __HAL_I2S_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__)
Checks if the specified I2S interrupt source is enabled or disabled.
#define __HAL_I2S_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Disable the specified I2S interrupts.
#define __HAL_I2S_GET_FLAG(__HANDLE__, __FLAG__)
Checks whether the specified I2S flag is set or not.
#define __HAL_I2S_CLEAR_OVRFLAG(__HANDLE__)
Clears the I2S OVR pending flag.
#define __HAL_I2S_DISABLE(__HANDLE__)
Disable the specified SPI peripheral (in I2S mode).
#define __HAL_I2S_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enable the specified I2S interrupts.
#define __HAL_I2S_CLEAR_UDRFLAG(__HANDLE__)
Clears the I2S UDR pending flag.
#define I2S_FULLDUPLEXMODE_ENABLE
#define I2S_MCLKOUTPUT_ENABLE
#define I2S_MODE_SLAVE_RX
#define I2S_MODE_MASTER_TX
#define I2S_MODE_SLAVE_TX
#define I2S_MODE_MASTER_RX
static void I2S_DMATxCplt(DMA_HandleTypeDef *hdma)
DMA I2S transmit process complete callback.
static HAL_StatusTypeDef I2S_WaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag, FlagStatus State, uint32_t Timeout)
This function handles I2S Communication Timeout.
static void I2S_Receive_IT(I2S_HandleTypeDef *hi2s)
Receive an amount of data in non-blocking mode with Interrupt.
static void I2S_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
DMA I2S transmit process half complete callback.
static void I2S_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
DMA I2S receive process half complete callback.
static void I2S_Transmit_IT(I2S_HandleTypeDef *hi2s)
Transmit an amount of data in non-blocking mode with Interrupt.
static void I2S_IRQHandler(I2S_HandleTypeDef *hi2s)
This function handles I2S interrupt request.
static void I2S_DMAError(DMA_HandleTypeDef *hdma)
DMA I2S communication error callback.
static void I2S_DMARxCplt(DMA_HandleTypeDef *hdma)
DMA I2S receive process complete callback.
#define IS_I2S_CLOCKSOURCE(CLOCK)
#define IS_I2S_MCLK_OUTPUT(__OUTPUT__)
#define IS_I2S_FULLDUPLEX_MODE(MODE)
#define IS_I2S_STANDARD(__STANDARD__)
#define IS_I2S_AUDIO_FREQ(__FREQ__)
#define IS_I2S_MODE(__MODE__)
Checks if I2S Mode parameter is in allowed range.
#define IS_I2S_CPOL(__CPOL__)
Checks if I2S Serial clock steady state parameter is in allowed range.
#define IS_I2S_DATA_FORMAT(__FORMAT__)
#define I2S_STANDARD_PCM_SHORT
#define I2S_STANDARD_PCM_LONG
uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk)
Return the peripheral clock frequency for a given peripheral(SAI..)
#define RCC_PERIPHCLK_I2S_APB1
#define RCC_PERIPHCLK_I2S_APB2
#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_IS_BIT_CLR(REG, BIT)
#define __HAL_LOCK(__HANDLE__)
DMA handle Structure definition.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
I2S handle Structure definition.
__IO uint16_t RxXferCount
DMA_HandleTypeDef * hdmarx
__IO uint16_t TxXferCount
DMA_HandleTypeDef * hdmatx
__IO HAL_LockTypeDef Lock
void(* IrqHandlerISR)(struct __I2S_HandleTypeDef *hi2s)
__IO HAL_I2S_StateTypeDef State