2007-01-18 04:15 AM
2011-05-17 12:34 AM
Hello!
I have a problem with the UART-Interrupt. When he arives I read the char or I write the char. Then I clear manualy the Interrupt Flag, but sometimes the Interrupt arrives immediately again and so I lose one char. See: void UART1_IRQHandler(void) { if (UART_GetFlagStatus(UART1, UART_RawIT_Receive) == SET)//Receive Interrrupt? { isr_scia_receive(); // Read 1 char and rec_cnt + 1 UART_ClearITPendingBit(UART1, UART_IT_Receive); // Receive Flag clear } else if (UART_GetFlagStatus(UART1, UART_RawIT_Transmit) == SET) // Transmit Interrupt ? { isr_scia_transmit(); // Send 1 char and trans_cnt - 1 UART_ClearITPendingBit(UART1, UART_IT_Transmit);// Transmit Flag Clear } } I do not use the UART-FIFOS, one interrupt = one char. Is there something wrong?2011-05-17 12:34 AM
1. remove the word else in the transmit interrupt int section
2. use the Flag UART_IT_Receive not RAW_.. for receive interrupt 3. use the Flag UART_IT_ReceiveTimeOut for receive interrupt (may be this is only important if you use the rx hardware fifo 4. use the Flag UART_IT_Transmit not RAW.. for transmit interrupt2011-05-17 12:34 AM
Hello Barricade!
Thanks. Your Info was my first try. With this it works much more instability. But I found something. I also use the CPU-timer-interrupt 0. It arrives every 5ms. When I disable the CPU-Timer, the UART works. I think theres is a problem with the UART-Flags, when an asynchronous interrrupt happens. CPU-Timer Interrupt = VIC0 UART-Interrupt = VIC1 Best regards.2011-05-17 12:34 AM
Hello,
I got exactly the samme problem. when I use UART Interup (on VIC1) And a Timer or a Ethernet interupt (on VIC0) I lose chars. To solve this problem I had to set the UART Interups on fast interupt (FIQ) Regards2011-05-17 12:34 AM
Hello acorchia,
and what will you do if you need more then one uart ? I think this is not the right way.2011-05-17 12:34 AM
Hello feig,
please check using of the hardware fifo's. This works fine for me with all 3 uarts.2011-05-17 12:34 AM
Hello
Actualy I use 3 Uart (2 at 250Kbauts and 1 at 38000 bauts), all of them use the fifo, and at each interupt, i check UART_GetITStatus(TheUART, UART_PROGIO_IT_FLAGS) == RESET for each Uart (actualy this is inlined just one bit test , very fast). This is working very well with full loaded Uart 1 & 2 , Uart 3 is just a console and a Ethernet connection that analyse 2560 Udp frame /Sec. I had to modifie the Ethernet driver to make it work on interupt. Regards2011-05-17 12:34 AM
Hello Barricade.
Yes, the check of the harware-fifos works better than the check of the uart-interrupt-flags. But I have to load a File in a FPGA which has a size of 3MB, in this case I lose one or two char. The problem is the FPGA-File is then useless. When I disable the Timer-Interrupt it works fine. Can I change the priority of the interrupt controller VIC0 and VIC1? So that the UART-Interrupt has an higher priority as the CPU-Timer-interrupt 0? Is it right, that I can only change the priorty of the lines in one interrupt controller? Regards.2011-05-17 12:34 AM
Hello feig,
any good news to this problem, I'm also fighting now with this problem, is this still open or have you it solved ? Best regards