/** * @brief DMA IRDA Tx transfer completed callback * @param hdma: DMA handle * @retval None */ static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma) { IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; hirda->TxXferCount = 0; /* Disable the DMA transfer for transmit request by setting the DMAT bit in the IRDA CR3 register */ hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAT); /* Wait for IRDA TC Flag */ if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, IRDA_TXDMA_TIMEOUTVALUE) != HAL_OK) { /* Timeout Occured */ HAL_IRDA_ErrorCallback(hirda); } else { /* No Timeout */ if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) { hirda->State = HAL_IRDA_STATE_BUSY_RX; } else { hirda->State = HAL_IRDA_STATE_READY; } HAL_IRDA_TxCpltCallback(hirda); } }
/** * @brief Wraps up transmission in non blocking mode. * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains * the configuration information for the specified IRDA module. * @retval HAL status */ static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda) { /* Disable the IRDA Transmit Complete Interrupt */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC); /* Check if a receive process is ongoing or not */ if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) { hirda->State = HAL_IRDA_STATE_BUSY_RX; } else { /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); /* Disable the IRDA Parity Error Interrupt */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE); hirda->State = HAL_IRDA_STATE_READY; } HAL_IRDA_TxCpltCallback(hirda); return HAL_OK; }
/** * @brief DMA IRDA transmit process complete callback. * @param hdma : DMA handle * @retval None */ static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma) { IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; hirda->TxXferCount = 0; /* Wait for IRDA TC Flag */ if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, IRDA_TIMEOUT_VALUE) != HAL_OK) { /* Timeout Occured */ hirda->State = HAL_IRDA_STATE_TIMEOUT; HAL_IRDA_ErrorCallback(hirda); } else { /* No Timeout */ /* Check if a receive process is ongoing or not */ if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) { hirda->State = HAL_IRDA_STATE_BUSY_RX; } else { hirda->State = HAL_IRDA_STATE_READY; } HAL_IRDA_TxCpltCallback(hirda); } }
/** * @brief Receive an amount of data in non blocking mode. * Function called under interruption only, once * interruptions have been enabled by HAL_IRDA_Transmit_IT() * @param hirda: IRDA handle * @retval HAL status */ static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda) { uint16_t* tmp; if((hirda->State == HAL_IRDA_STATE_BUSY_TX) || (hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)) { __HAL_LOCK(hirda); if(hirda->TxXferCount == 0) { /* Disable the IRDA Transmit Complete Interrupt */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC); if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) { hirda->State = HAL_IRDA_STATE_BUSY_RX; } else { /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); hirda->State = HAL_IRDA_STATE_READY; } /* Call the Process Unlocked before calling the Tx call back API to give the possibiity to start again the Transmission under the Tx call back API */ __HAL_UNLOCK(hirda); HAL_IRDA_TxCpltCallback(hirda); return HAL_OK; } else { if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE)) { tmp = (uint16_t*) hirda->pTxBuffPtr; hirda->Instance->TDR = (*tmp & (uint16_t)0x01FF); hirda->pTxBuffPtr += 2; } else { hirda->Instance->TDR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0xFF); } hirda->TxXferCount--; /* Process Unlocked */ __HAL_UNLOCK(hirda); return HAL_OK; } } else { return HAL_BUSY; } }
/** * @brief Receive an amount of data in non blocking mode. * Function called under interruption only, once * interruptions have been enabled by HAL_IRDA_Transmit_IT() * @param hirda: IRDA handle * @retval HAL status */ static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda) { uint16_t* tmp; if((hirda->State == HAL_IRDA_STATE_BUSY_TX) || (hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)) { if(hirda->TxXferCount == 0) { /* Disable the IRDA Transmit Data Register Empty Interrupt */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE); if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) { hirda->State = HAL_IRDA_STATE_BUSY_RX; } else { /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); hirda->State = HAL_IRDA_STATE_READY; } /* Wait on TC flag to be able to start a second transfer */ if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_IT_TC, RESET, IRDA_TIMEOUT_VALUE) != HAL_OK) { return HAL_TIMEOUT; } HAL_IRDA_TxCpltCallback(hirda); return HAL_OK; } else { if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE)) { tmp = (uint16_t*) hirda->pTxBuffPtr; hirda->Instance->TDR = (*tmp & (uint16_t)0x01FF); hirda->pTxBuffPtr += 2; } else { hirda->Instance->TDR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0xFF); } hirda->TxXferCount--; return HAL_OK; } } else { return HAL_BUSY; } }
/** * @brief Wrap up transmission in non-blocking mode. * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains * the configuration information for the specified IRDA module. * @retval HAL status */ static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda) { /* Disable the IRDA Transmit Complete Interrupt */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC); /* Tx process is ended, restore hirda->gState to Ready */ hirda->gState = HAL_IRDA_STATE_READY; HAL_IRDA_TxCpltCallback(hirda); return HAL_OK; }
/** * @brief DMA IRDA transmit process complete callback. * @param hdma : DMA handle * @retval None */ static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma) { IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; /* DMA Normal mode */ if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) { hirda->TxXferCount = 0; /* Disable the DMA transfer for transmit request by setting the DMAT bit in the IRDA CR3 register */ hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAT); /* Wait for IRDA TC Flag */ if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, IRDA_TIMEOUT_VALUE) != HAL_OK) { /* Timeout occurred */ hirda->State = HAL_IRDA_STATE_TIMEOUT; HAL_IRDA_ErrorCallback(hirda); } else { /* No Timeout */ /* Check if a receive process is ongoing or not */ if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) { hirda->State = HAL_IRDA_STATE_BUSY_RX; } else { hirda->State = HAL_IRDA_STATE_READY; } HAL_IRDA_TxCpltCallback(hirda); } } /* DMA Circular mode */ else { HAL_IRDA_TxCpltCallback(hirda); } }
/** * @brief Receive an amount of data in non blocking mode. * Function called under interruption only, once * interruptions have been enabled by HAL_IRDA_Transmit_IT() * @param hirda: IRDA handle * @retval HAL status */ static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda) { uint16_t* tmp; if((hirda->State == HAL_IRDA_STATE_BUSY_TX) || (hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)) { if(hirda->TxXferCount == 0) { /* Disable the IRDA Transmit Complete Interrupt */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE); if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) { hirda->State = HAL_IRDA_STATE_BUSY_RX; } else { /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); hirda->State = HAL_IRDA_STATE_READY; } HAL_IRDA_TxCpltCallback(hirda); return HAL_OK; } else { if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE)) { tmp = (uint16_t*) hirda->pTxBuffPtr; hirda->Instance->TDR = (*tmp & (uint16_t)0x01FF); hirda->pTxBuffPtr += 2; } else { hirda->Instance->TDR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0xFF); } hirda->TxXferCount--; return HAL_OK; } } else { return HAL_BUSY; } }
/** * @brief DMA IRDA transmit process complete callback. * @param hdma: Pointer to a DMA_HandleTypeDef structure that contains * the configuration information for the specified DMA module. * @retval None */ static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma) { IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; /* DMA Normal mode */ if ( HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC) ) { hirda->TxXferCount = 0; /* Disable the DMA transfer for transmit request by setting the DMAT bit in the IRDA CR3 register */ CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT); /* Enable the IRDA Transmit Complete Interrupt */ __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TC); } /* DMA Circular mode */ else { HAL_IRDA_TxCpltCallback(hirda); } }