示例#1
0
/**
 ****************************************************************************************
 * @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
}
示例#2
0
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);
}
示例#3
0
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);
}
示例#4
0
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
            }
        }
    }
}