95 #ifdef HAL_I2S_MODULE_ENABLED
102 #if defined (SPI_I2S_FULLDUPLEX_SUPPORT)
130 static HAL_StatusTypeDef I2SEx_FullDuplexWaitFlagStateUntilTimeout(
I2S_HandleTypeDef *hi2s,
219 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
227 tmp1 = hi2s->
Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);
232 if ((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B))
251 tmp1 = hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG;
253 if ((tmp1 == I2S_MODE_MASTER_TX) || (tmp1 == I2S_MODE_SLAVE_TX))
260 __HAL_I2SEXT_ENABLE(hi2s);
263 __HAL_I2S_ENABLE(hi2s);
266 if ((hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_TX)
270 __HAL_I2SEXT_CLEAR_OVRFLAG(hi2s);
278 if (I2SEx_FullDuplexWaitFlagStateUntilTimeout(hi2s, I2S_FLAG_TXE, SET, Timeout,
I2S_USE_I2S) != HAL_OK)
281 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_TIMEOUT);
293 if ((__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_UDR) == SET) && (tmp1 == I2S_MODE_SLAVE_TX))
296 __HAL_I2S_CLEAR_UDRFLAG(hi2s);
299 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_UDR);
305 if (I2SEx_FullDuplexWaitFlagStateUntilTimeout(hi2s, I2S_FLAG_RXNE, SET, Timeout,
I2S_USE_I2SEXT) != HAL_OK)
308 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_TIMEOUT);
316 (*pRxData++) = I2SxEXT(hi2s->
Instance)->DR;
320 if (__HAL_I2SEXT_GET_FLAG(hi2s, I2S_FLAG_OVR) == SET)
323 __HAL_I2S_CLEAR_OVRFLAG(hi2s);
326 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_OVR);
335 I2SxEXT(hi2s->
Instance)->DR = (*pTxData++);
339 __HAL_I2SEXT_ENABLE(hi2s);
342 __HAL_I2S_ENABLE(hi2s);
345 if ((hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX)
349 __HAL_I2S_CLEAR_OVRFLAG(hi2s);
357 if (I2SEx_FullDuplexWaitFlagStateUntilTimeout(hi2s, I2S_FLAG_TXE, SET, Timeout,
I2S_USE_I2SEXT) != HAL_OK)
360 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_TIMEOUT);
368 I2SxEXT(hi2s->
Instance)->DR = (*pTxData++);
372 if ((__HAL_I2SEXT_GET_FLAG(hi2s, I2S_FLAG_UDR) == SET) && (tmp1 == I2S_MODE_SLAVE_RX))
375 __HAL_I2S_CLEAR_UDRFLAG(hi2s);
378 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_UDR);
384 if (I2SEx_FullDuplexWaitFlagStateUntilTimeout(hi2s, I2S_FLAG_RXNE, SET, Timeout,
I2S_USE_I2S) != HAL_OK)
387 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_TIMEOUT);
399 if (__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_OVR) == SET)
402 __HAL_I2S_CLEAR_OVRFLAG(hi2s);
405 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_OVR);
414 if (hi2s->
ErrorCode != HAL_I2S_ERROR_NONE)
451 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
462 tmp1 = hi2s->
Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);
467 if ((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B))
486 if ((hi2s->
Init.
Mode == I2S_MODE_MASTER_TX) || (hi2s->
Init.
Mode == I2S_MODE_SLAVE_TX))
489 __HAL_I2SEXT_ENABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
492 __HAL_I2S_ENABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
501 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
507 __HAL_I2SEXT_ENABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
510 __HAL_I2S_ENABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
519 __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
525 __HAL_I2SEXT_ENABLE(hi2s);
528 __HAL_I2S_ENABLE(hi2s);
553 uint32_t *tmp = NULL;
561 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
572 tmp1 = hi2s->
Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN);
577 if ((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B))
613 tmp1 = hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG;
615 if ((tmp1 == I2S_MODE_MASTER_TX) || (tmp1 == I2S_MODE_SLAVE_TX))
618 tmp = (uint32_t *)&pRxData;
622 SET_BIT(I2SxEXT(hi2s->
Instance)->CR2, SPI_CR2_RXDMAEN);
625 tmp = (uint32_t *)&pTxData;
629 SET_BIT(hi2s->
Instance->CR2, SPI_CR2_TXDMAEN);
634 if ((hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX)
638 __HAL_I2S_CLEAR_OVRFLAG(hi2s);
641 tmp = (uint32_t *)&pTxData;
645 SET_BIT(I2SxEXT(hi2s->
Instance)->CR2, SPI_CR2_TXDMAEN);
648 tmp = (uint32_t *)&pRxData;
652 SET_BIT(hi2s->
Instance->CR2, SPI_CR2_RXDMAEN);
657 if ((hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE)
660 __HAL_I2SEXT_ENABLE(hi2s);
662 __HAL_I2S_ENABLE(hi2s);
675 __IO uint32_t i2ssr = hi2s->
Instance->SR;
676 __IO uint32_t i2sextsr = I2SxEXT(hi2s->
Instance)->SR;
677 __IO uint32_t i2scr2 = hi2s->
Instance->CR2;
678 __IO uint32_t i2sextcr2 = I2SxEXT(hi2s->
Instance)->CR2;
681 if ((hi2s->
Init.
Mode == I2S_MODE_MASTER_TX) || (hi2s->
Init.
Mode == I2S_MODE_SLAVE_TX))
684 if (((i2ssr & I2S_FLAG_TXE) == I2S_FLAG_TXE) && ((i2scr2 & I2S_IT_TXE) != RESET))
688 I2SEx_TxISR_I2S(hi2s);
692 if (((i2sextsr & I2S_FLAG_RXNE) == I2S_FLAG_RXNE) && ((i2sextcr2 & I2S_IT_RXNE) != RESET))
696 I2SEx_RxISR_I2SExt(hi2s);
700 if (((i2sextsr & I2S_FLAG_OVR) == I2S_FLAG_OVR) && ((i2sextcr2 & I2S_IT_ERR) != RESET))
703 __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
706 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
709 __HAL_I2S_CLEAR_OVRFLAG(hi2s);
715 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_OVR);
717 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
725 if (((i2ssr & I2S_FLAG_UDR) == I2S_FLAG_UDR) && ((i2scr2 & I2S_IT_ERR) != RESET))
728 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
731 __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
734 __HAL_I2S_CLEAR_UDRFLAG(hi2s);
740 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_UDR);
742 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
753 if (((i2sextsr & I2S_FLAG_TXE) == I2S_FLAG_TXE) && ((i2sextcr2 & I2S_IT_TXE) != RESET))
757 I2SEx_TxISR_I2SExt(hi2s);
761 if (((i2ssr & I2S_FLAG_RXNE) == I2S_FLAG_RXNE) && ((i2scr2 & I2S_IT_RXNE) != RESET))
765 I2SEx_RxISR_I2S(hi2s);
769 if (((i2ssr & I2S_FLAG_OVR) == I2S_FLAG_OVR) && ((i2scr2 & I2S_IT_ERR) != RESET))
772 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
775 __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
781 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_OVR);
783 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
791 if (((i2sextsr & I2S_FLAG_UDR) == I2S_FLAG_UDR) && ((i2sextcr2 & I2S_IT_ERR) != RESET))
794 __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
797 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
803 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_UDR);
805 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
867 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
885 if (hdma->
Init.Mode == DMA_NORMAL)
887 if (((hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_TX) || \
888 ((hi2s->
Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_TX))
891 CLEAR_BIT(I2SxEXT(hi2s->
Instance)->CR2, SPI_CR2_RXDMAEN);
892 CLEAR_BIT(hi2s->
Instance->CR2, SPI_CR2_TXDMAEN);
896 CLEAR_BIT(hi2s->
Instance->CR2, SPI_CR2_RXDMAEN);
897 CLEAR_BIT(I2SxEXT(hi2s->
Instance)->CR2, SPI_CR2_TXDMAEN);
907 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
924 CLEAR_BIT(hi2s->
Instance->CR2, (SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN));
925 CLEAR_BIT(I2SxEXT(hi2s->
Instance)->CR2, (SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN));
933 SET_BIT(hi2s->
ErrorCode, HAL_I2S_ERROR_DMA);
935 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
956 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
962 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
985 __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR));
991 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
1014 __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
1020 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
1043 __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR));
1049 #if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
1067 static HAL_StatusTypeDef I2SEx_FullDuplexWaitFlagStateUntilTimeout(
I2S_HandleTypeDef *hi2s,
1078 while (((__HAL_I2S_GET_FLAG(hi2s, Flag)) ? SET : RESET) != State)
1080 if (Timeout != HAL_MAX_DELAY)
1082 if ((Timeout == 0U) || ((
HAL_GetTick() - tickstart) > Timeout))
1098 while (((__HAL_I2SEXT_GET_FLAG(hi2s, Flag)) ? SET : RESET) != State)
1100 if (Timeout != HAL_MAX_DELAY)
1102 if ((Timeout == 0U) || ((
HAL_GetTick() - tickstart) > Timeout))
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.
void HAL_I2SEx_TxRxCpltCallback(I2S_HandleTypeDef *hi2s)
Tx and Rx Transfer completed callback.
void HAL_I2SEx_TxRxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
Tx and Rx Transfer half completed callback.
void HAL_I2SEx_FullDuplex_IRQHandler(I2S_HandleTypeDef *hi2s)
This function handles I2S/I2Sext interrupt requests in full-duplex mode.
HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size)
Full-Duplex Transmit/Receive data in non-blocking mode using Interrupt.
HAL_StatusTypeDef HAL_I2SEx_TransmitReceive(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size, uint32_t Timeout)
Full-Duplex Transmit/Receive data in blocking mode.
HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size)
Full-Duplex Transmit/Receive data in non-blocking mode using DMA.
void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s)
I2S error callbacks.
__IO uint16_t RxXferCount
void(* TxRxHalfCpltCallback)(struct __I2S_HandleTypeDef *hi2s)
DMA_HandleTypeDef * hdmarx
__IO uint16_t TxXferCount
void(* TxRxCpltCallback)(struct __I2S_HandleTypeDef *hi2s)
DMA_HandleTypeDef * hdmatx
__IO HAL_I2S_StateTypeDef State
void(* ErrorCallback)(struct __I2S_HandleTypeDef *hi2s)
@ HAL_I2S_STATE_BUSY_TX_RX
I2S handle Structure definition.
This file contains all the functions prototypes for the HAL module driver.
DMA handle Structure definition.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)