Hi,
I'm trying to receive an unknown length data over UART by EDMA. Basically, Is it possible by using RX-Timeout interrupt?
To do it, I wrote the following code (pseue-code) :
#define UART_RX_EDMA_LEN 64 #define UART_RX_TRIG_LEN 8 uint8 uart_rx_buff[8KB]; uint32 uart_rx_buff_cnt = 0; uint8 edma_uart_rx_buff[UART_RX_EDMA_LEN]; uart_init(){ uart_enable_interrupt(UART_INT_RHR_RX_TIME_OUT); //Set IER uart_fifo_configure(UART_RX_TRIG_LEN, UART_TX_TRIG_LEN ); // Set UART RX/TX FIFO trigger threshold ... } start_uart_receive(){ edma_rx_param_set.src = edma_uart_rx_buff; edma_rx_param_set.aCnt = 1; edma_rx_param_set.bCnt = UART_RX_TRIG_LEN; edma_rx_param_set.cCnt = UART_RX_EDMA_LEN / UART_RX_TRIG_LEN; edma_rx_param_set.opt = (1 << EDMA3CC_OPT_SYNCDIM_SHIFT); edma_rx_param_set.opt |= ((edmaUartnRxTccNum << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC); edma_rx_param_set.opt |= (1 << EDMA3CC_OPT_TCINTEN_SHIFT); ... } edma_uart_rx_isr(){ memcpy(uart_rx_buff[uart_rx_buff_cnt], edma_uart_rx_buff, UART_RX_EDMA_LEN); uart_rx_buff_cnt += UART_RX_EDMA_LEN; } uart_isr(){ uint8 interrupt_src = uart_get_int_src(); // Get IIR if(interrupt_src == UART_SRC_INT_RX_TIME_OUT){ EdmaParamSet edma_param_set_uart_rx; uint8 uart_fifo_chars[UART_RX_TRIG_LEN]; uint32 uart_fifo_length; edma_get_paramset(edmaUartnRxTccNum, &edma_param_set_uart_rx); uint32 edma_uart_recvd_len = UART_RX_EDMA_LEN - edma_param_set_uart_rx.bCnt * edma_param_set_uart_rx.cCnt; memcpy(uart_rx_buff[uart_rx_buff_cnt], edma_uart_rx_buff, edma_uart_recvd_len); //Appends not completed EDMA transfer data uart_rx_buff_cnt += edma_uart_recvd_len; uart_fifo_length = uart_read_fifo(uart_fifo_chars); memcpy(uart_rx_buff[uart_rx_buff_cnt], uart_fifo_chars, uart_fifo_length); //Appends FIFO chars uart_rx_buff_cnt += uart_fifo_length; uart_rx_receive_cb(uart_rx_buff, uart_rx_buff_cnt); } }
According to the device TRM, setting `RHRIT` bit in IER register, causes enabling two interrupt: RHR interrupt and RX-Timeout interrupt.
But there are some unusual behaviors during sending data to the device UART.
1) When sent data length is a multiple of `UART_RX_TRIG_LEN`(=8), (8, 16, 24,...) Rx timeout interrupt does not occurs! and an unusual interrupt occurs with IER.IT_TYPE = 0! In the TRM mentioned that it is a Modem Interrupt. While MSR did not change and I expected IER.IT_TYPE = 6 or 2.
2) When sent data length is higher than 8, multiple interrupts occurs, some Modem-Interrupt (Data length / 8 times with unchanged MSR like the case 1) in addition with a RX-Timeout interrupt at the end.
3) When sent data length is lower than `UART_RX_TRIG_LEN`(=8), Rx timeout interrupts occurs successfully.
Cases 2 and 3 are acceptable, but in case 1 , I can not detect end of data.
TIA!