/** **************************************************************************************** * @brief Start a data reception. * @param[in] UART QN_UART0 or QN_UART1 * @param[in,out] bufptr Pointer to the RX buffer * @param[in] size Size of the expected reception * @param[in] rx_callback Callback for end of reception * @description * This function is used to read Rx data from RX FIFO and the data will be stored in bufptr. * As soon as the end of the data transfer is detected, the callback function is executed. * ***************************************************************************************** */ void uart_read(QN_UART_TypeDef *UART, uint8_t *bufptr, uint32_t size, void (*rx_callback)(void)) { #if CONFIG_ENABLE_DRIVER_UART0==TRUE if (UART == QN_UART0) { #if UART_RX_DMA_EN==TRUE dma_rx(DMA_TRANS_BYTE, DMA_UART0_RX, (uint32_t)bufptr, size, rx_callback); #else //Store environment parameters uart0_env.rx.size = size; uart0_env.rx.bufptr = bufptr; #if UART_CALLBACK_EN==TRUE uart0_env.rx.callback = rx_callback; #endif #if CONFIG_UART0_RX_ENABLE_INTERRUPT==TRUE // Enable UART and all RX int uart_rx_int_enable(UART, MASK_ENABLE); #else // Start data transmission uart_receive_data(UART, &uart0_env); #endif #endif } #endif #if CONFIG_ENABLE_DRIVER_UART1==TRUE if (UART == QN_UART1) { #if UART_RX_DMA_EN==TRUE dma_rx(DMA_TRANS_BYTE, DMA_UART1_RX, (uint32_t)bufptr, size, rx_callback); #else //Store environment parameters uart1_env.rx.size = size; uart1_env.rx.bufptr = bufptr; #if UART_CALLBACK_EN==TRUE uart1_env.rx.callback = rx_callback; #endif #if CONFIG_UART1_RX_ENABLE_INTERRUPT==TRUE // Enable UART and all RX int uart_rx_int_enable(UART, MASK_ENABLE); #else // Start data transmission uart_receive_data(UART, &uart1_env); #endif #endif } #endif }
void com_event_uart_rx_frame_handler(void) { uart_rx_int_enable(QN_COM_UART, MASK_DISABLE); //disable uart rx interrupt struct app_uart_data_ind *com_data = ke_msg_alloc(APP_COM_UART_RX_DONE_IND, TASK_APP, TASK_APP, com_env.com_rx_len+1); com_data->len=com_env.com_rx_len; memcpy(com_data->data,com_env.com_rx_buf,com_env.com_rx_len); ke_msg_send(com_data); ke_timer_clear(APP_COM_RX_TIMEOUT_TIMER, TASK_APP); ke_evt_clear(1UL << EVENT_UART_RX_FRAME_ID); }
int app_com_rx_timeout_handler(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { uart_rx_int_enable(QN_COM_UART, MASK_DISABLE); //disable uart rx interrupt struct app_uart_data_ind *com_data = ke_msg_alloc(APP_COM_UART_RX_DONE_IND, TASK_APP, TASK_APP, com_env.com_rx_len+1); com_data->len=com_env.com_rx_len; memcpy(com_data->data,com_env.com_rx_buf,com_env.com_rx_len); ke_msg_send(com_data); return (KE_MSG_CONSUMED); }
void UART1_RX_IRQHandler(void) { uint32_t reg; reg = uart_uart_GetIntFlag(QN_UART1); if ( reg & UART_MASK_BE_IF ) { // Break error interrupt // clear interrupt uart_uart_ClrIntFlag(QN_UART1, UART_MASK_BE_IF); } else if ( reg & UART_MASK_PE_IF ) { // Parity error interrupt // clear interrupt uart_uart_ClrIntFlag(QN_UART1, UART_MASK_PE_IF); } else if ( reg & UART_MASK_FE_IF ) { // Framing error interrupt // clear interrupt uart_uart_ClrIntFlag(QN_UART1, UART_MASK_FE_IF); } else if ( reg & UART_MASK_OE_IF ) { // Overrun error interrupt // clear interrupt uart_uart_ClrIntFlag(QN_UART1, UART_MASK_OE_IF); } else if ( reg & UART_MASK_RX_IF ) { // RX FIFO is not empty interrupt // clear interrupt reg = uart_uart_GetRXD(QN_UART1); if (uart1_env.rx.size > 0) { *uart1_env.rx.bufptr++ = reg; uart1_env.rx.size--; if (uart1_env.rx.size == 0) { // Disable UART all rx int uart_rx_int_enable(QN_UART1, MASK_DISABLE); #if UART_CALLBACK_EN==TRUE // Call end of reception callback if(uart1_env.rx.callback != NULL) { uart1_env.rx.callback(); } #endif } } } }