I am using Uart1 for both transmitting and receiving data on c5517. And it may receive and transmit at the same time.
I use the interrupt mode. Sometimes, I can’t transmit all the data(the interrupt did not come?)
There is only one uart isr on 5517. In the Isr routine,gennerally IIR register is used to tell which interrupt comes. But in IIR, INTID bits only indicates one interrupt source. What if two interrupts come?
I use LSR state register to do some additional handle.But the problem still exits. I still can’t transmit all the frame data. Why?
void uartISR(){
//interrupt for UART(INT6)
Uint16 eventId=UART_getEventId(hUart);
Uint16 Lsr,id;
IRQ_disable(UART_EVENT);
if (((void (*)(void))(hUart->UART_isrDispatchTable[eventId])))
{
((void (*)(void))(hUart->UART_isrDispatchTable[eventId]))();
}
//the function above only handle one interrupt,so I add some additional handling
Lsr = CSL_FEXT(hUart->uartRegs->LSR,UART_LSR_THRE);
if(Lsr && eventId != UART_EVT_TBEI_IID && glTxOv){
id = UART_EVT_TBEI_IID;
/** Transmitter holding register empty interrupt identification value*/
if (((void (*)(void))(hUart->UART_isrDispatchTable[id])))
{
((void (*)(void))(hUart->UART_isrDispatchTable[id]))();
}
}
Lsr = CSL_FEXT(hUart->uartRegs->LSR,UART_LSR_DR);
if(Lsr && eventId != UART_EVT_RBI_IID){
id = UART_EVT_RBI_IID;
/** Received data available interrupt identification value*/
if (((void (*)(void))(hUart->UART_isrDispatchTable[id])))
{
((void (*)(void))(hUart->UART_isrDispatchTable[id]))();
}
}
IRQ_enable(UART_EVENT);
}
void UartTxStr()
{
//transmit 1byte data
CSL_Status status;
char TxData;
UartTxPos--;
glTxOv = 1;
TxData=UartTxBuff[UartTxPos];
UtFrmCtrl.SendState = UART_SEND_BUSY;
status = UART_fputc(hUart,TxData,0);
}
void uart_txIsr()
{/** transmiter holding register empty interrupt*/
//uart tx interrupt
if (UartTxPos > 0){
UartTxStr();
}else{//frame transmision over
UtFrmCtrl.SendState = UART_SEND_IDLE;
}
glTxOv = 0;
}