Part Number: TMS320C6748
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!