******************************************************************************\r
* @file stm32f7xx_hal_irda.c\r
* @author MCD Application Team\r
- * @version V1.0.0RC1\r
- * @date 24-March-2015\r
+ * @version V1.0.0\r
+ * @date 12-May-2015\r
* @brief IRDA HAL module driver.\r
* This file provides firmware functions to manage the following \r
* functionalities of the IrDA SIR ENDEC block (IrDA):\r
static HAL_StatusTypeDef IRDA_CheckIdleState(IRDA_HandleTypeDef *hirda);\r
static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Timeout);\r
static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda);\r
+static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda);\r
static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda);\r
/**\r
* @}\r
\r
if(hirda->State == HAL_IRDA_STATE_RESET)\r
{\r
+ /* Allocate lock resource and initialize it */\r
+ hirda->Lock = HAL_UNLOCKED;\r
/* Init the low level hardware : GPIO, CLOCK, CORTEX */\r
HAL_IRDA_MspInit(hirda);\r
}\r
{\r
IRDA_Transmit_IT(hirda);\r
} \r
- \r
+\r
+ /* IRDA in mode Transmitter (transmission end) -----------------------------*/\r
+ if((__HAL_IRDA_GET_IT(hirda, IRDA_IT_TC) != RESET) &&(__HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_TC) != RESET))\r
+ {\r
+ IRDA_EndTransmit_IT(hirda);\r
+ } \r
}\r
\r
/**\r
__HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);\r
__HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);\r
\r
- hirda->State= HAL_IRDA_STATE_TIMEOUT;\r
+ hirda->State= HAL_IRDA_STATE_READY;\r
\r
/* Process Unlocked */\r
__HAL_UNLOCK(hirda);\r
__HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);\r
__HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);\r
\r
- hirda->State= HAL_IRDA_STATE_TIMEOUT;\r
+ hirda->State= HAL_IRDA_STATE_READY;\r
\r
/* Process Unlocked */\r
__HAL_UNLOCK(hirda);\r
}\r
}\r
\r
+/**\r
+ * @brief Wraps up transmission in non blocking mode.\r
+ * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains\r
+ * the configuration information for the specified IRDA module.\r
+ * @retval HAL status\r
+ */\r
+static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda)\r
+{\r
+ /* Disable the IRDA Transmit Complete Interrupt */ \r
+ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC);\r
+ \r
+ /* Check if a receive process is ongoing or not */\r
+ if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) \r
+ {\r
+ hirda->State = HAL_IRDA_STATE_BUSY_RX;\r
+ }\r
+ else\r
+ {\r
+ /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */\r
+ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);\r
+\r
+ hirda->State = HAL_IRDA_STATE_READY;\r
+ }\r
+ \r
+ HAL_IRDA_TxCpltCallback(hirda);\r
+ \r
+ return HAL_OK;\r
+}\r
+\r
/**\r
* @brief Receive an amount of data in non blocking mode. \r
* Function called under interruption only, once\r
\r
/**\r
* @brief DMA IRDA Tx transfer completed callback \r
- * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains\r
- * the configuration information for the specified IRDA module.\r
+ * @param hdma: pointer to a DMA_HandleTypeDef structure that contains\r
+ * the configuration information for the specified DMA module.\r
* @retval None\r
*/\r
static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma) \r
{\r
IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
\r
- /* DMA Normal mode */\r
+ /* DMA Normal mode*/\r
if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)\r
{\r
hirda->TxXferCount = 0;\r
- \r
+\r
/* Disable the DMA transfer for transmit request by setting the DMAT bit\r
- in the IRDA CR3 register */\r
- hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAT);\r
- \r
- /* Wait for IRDA TC Flag */\r
- if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, HAL_IRDA_TXDMA_TIMEOUTVALUE) != HAL_OK)\r
- {\r
- /* Timeout Occured */ \r
- hirda->State = HAL_IRDA_STATE_TIMEOUT;\r
- HAL_IRDA_ErrorCallback(hirda);\r
- }\r
- else\r
- {\r
- /* No Timeout */\r
- \r
- if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)\r
- {\r
- hirda->State = HAL_IRDA_STATE_BUSY_RX;\r
- }\r
- else\r
- {\r
- hirda->State = HAL_IRDA_STATE_READY;\r
- }\r
- HAL_IRDA_TxCpltCallback(hirda);\r
- }\r
+ in the IRDA CR3 register */\r
+ hirda->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT);\r
+\r
+ /* Enable the IRDA Transmit Complete Interrupt */ \r
+ __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TC);\r
}\r
/* DMA Circular mode */\r
else\r
{\r
- HAL_IRDA_TxCpltCallback(hirda);\r
+ HAL_IRDA_TxCpltCallback(hirda);\r
}\r
}\r
\r
static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma) \r
{\r
IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
+ \r
/* DMA Normal mode */\r
if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)\r
{\r
hirda->RxXferCount = 0;\r
- \r
+\r
/* Disable the DMA transfer for the receiver request by setting the DMAR bit \r
- in the IRDA CR3 register */\r
+ in the IRDA CR3 register */\r
hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAR);\r
- \r
+\r
if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) \r
{\r
hirda->State = HAL_IRDA_STATE_BUSY_TX;\r
hirda->State = HAL_IRDA_STATE_READY;\r
}\r
}\r
- \r
+\r
HAL_IRDA_RxCpltCallback(hirda);\r
}\r
\r