Fixed interrupt handler in serial_api.c for the Nordic NRF51. The last byte sent in a sequence would not correctly clear the interrupt flag.

pull/1047/head
Marcus Chang 2015-04-16 13:27:49 +01:00
parent 29ab478a78
commit e34e16d311
1 changed files with 30 additions and 11 deletions

View File

@ -162,14 +162,20 @@ extern "C" {
#endif
void UART0_IRQHandler()
{
uint32_t irtype = 0;
if((NRF_UART0->INTENSET & UART_INTENSET_TXDRDY_Msk) && NRF_UART0->EVENTS_TXDRDY)
{
uart_irq(1, 0);
if((NRF_UART0->INTENSET & 0x80) && NRF_UART0->EVENTS_TXDRDY) {
irtype = 1;
} else if((NRF_UART0->INTENSET & 0x04) && NRF_UART0->EVENTS_RXDRDY) {
irtype = 2;
/* Explicitly clear TX flag to prevent interrupt from firing
immediately after returning from ISR. This ensures that the
last interrupt in a transmission sequence is correcly handled.
*/
NRF_UART0->EVENTS_TXDRDY = 0;
}
else if((NRF_UART0->INTENSET & UART_INTENSET_RXDRDY_Msk) && NRF_UART0->EVENTS_RXDRDY)
{
uart_irq(2, 0);
}
uart_irq(irtype, 0);
}
#ifdef __cplusplus
@ -239,11 +245,24 @@ int serial_getc(serial_t *obj)
void serial_putc(serial_t *obj, int c)
{
while (!serial_writable(obj)) {
}
/* In interrupt mode, send character immediately. Otherwise, block until
UART is ready to receive next character before sending.
obj->uart->EVENTS_TXDRDY = 0;
obj->uart->TXD = (uint8_t)c;
The TXDRDY flag is cleared in interrupt handler to ensure that it is
cleared even if there are no more characters to send.
*/
if (NRF_UART0->INTENSET & UART_INTENSET_TXDRDY_Msk)
{
obj->uart->TXD = (uint8_t)c;
}
else
{
while (!serial_writable(obj)) {
}
obj->uart->EVENTS_TXDRDY = 0;
obj->uart->TXD = (uint8_t)c;
}
}
int serial_readable(serial_t *obj)