/***************************************************************************//** * @brief * Reset USART/UART to same state as after a HW reset. * * @param[in] usart * Pointer to USART/UART peripheral register block. ******************************************************************************/ void USART_Reset(USART_TypeDef *usart) { /* Make sure the module exists on the selected chip */ EFM_ASSERT(USART_REF_VALID(usart) || UART_REF_VALID(usart)); /* Make sure disabled first, before resetting other registers */ usart->CMD = USART_CMD_RXDIS | USART_CMD_TXDIS | USART_CMD_MASTERDIS | USART_CMD_RXBLOCKDIS | USART_CMD_TXTRIDIS | USART_CMD_CLEARTX | USART_CMD_CLEARRX; usart->CTRL = _USART_CTRL_RESETVALUE; usart->FRAME = _USART_FRAME_RESETVALUE; usart->TRIGCTRL = _USART_TRIGCTRL_RESETVALUE; usart->CLKDIV = _USART_CLKDIV_RESETVALUE; usart->IEN = _USART_IEN_RESETVALUE; usart->IFC = _USART_IFC_MASK; usart->ROUTE = _USART_ROUTE_RESETVALUE; if (USART_IRDA_VALID(usart)) { usart->IRCTRL = _USART_IRCTRL_RESETVALUE; } #if defined(_USART_INPUT_RESETVALUE) usart->INPUT = _USART_INPUT_RESETVALUE; #endif #if defined(_USART_I2SCTRL_RESETVALUE) if (USART_I2S_VALID(usart)) { usart->I2SCTRL = _USART_I2SCTRL_RESETVALUE; } #endif }
/***************************************************************************//** * @brief * Init USART for asynchronous IrDA mode. * * @details * This function will configure basic settings in order to operate in * asynchronous IrDA mode. * * Special control setup not covered by this function must be done after * using this function by direct modification of the CTRL and IRCTRL * registers. * * Notice that pins used by the USART/UART module must be properly configured * by the user explicitly, in order for the USART/UART to work as intended. * (When configuring pins, one should remember to consider the sequence of * configuration, in order to avoid unintended pulses/glitches on output * pins.) * * @param[in] usart * Pointer to USART peripheral register block. * * @param[in] init * Pointer to initialization structure used to configure async IrDA setup. * * @note * Not all USART instances support IrDA. See the datasheet for your device. * ******************************************************************************/ void USARTn_InitIrDA(USART_TypeDef *usart, const USART_InitIrDA_TypeDef *init) { EFM_ASSERT(USART_IRDA_VALID(usart)); /* Init USART as async device */ USART_InitAsync(usart, &(init->async)); /* Set IrDA modulation to RZI (return-to-zero-inverted) */ usart->CTRL |= USART_CTRL_TXINV; /* Invert Rx signal before demodulator if enabled */ if (init->irRxInv) { usart->CTRL |= USART_CTRL_RXINV; } /* Configure IrDA */ usart->IRCTRL |= (uint32_t)init->irPw | (uint32_t)init->irPrsSel | ((uint32_t)init->irFilt << _USART_IRCTRL_IRFILT_SHIFT) | ((uint32_t)init->irPrsEn << _USART_IRCTRL_IRPRSEN_SHIFT); /* Enable IrDA */ usart->IRCTRL |= USART_IRCTRL_IREN; }