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 #endif
void UART0_IRQHandler() 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) { /* Explicitly clear TX flag to prevent interrupt from firing
irtype = 1; immediately after returning from ISR. This ensures that the
} else if((NRF_UART0->INTENSET & 0x04) && NRF_UART0->EVENTS_RXDRDY) { last interrupt in a transmission sequence is correcly handled.
irtype = 2; */
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 #ifdef __cplusplus
@ -238,6 +244,18 @@ int serial_getc(serial_t *obj)
} }
void serial_putc(serial_t *obj, int c) void serial_putc(serial_t *obj, int c)
{
/* In interrupt mode, send character immediately. Otherwise, block until
UART is ready to receive next character before sending.
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)) { while (!serial_writable(obj)) {
} }
@ -245,6 +263,7 @@ void serial_putc(serial_t *obj, int c)
obj->uart->EVENTS_TXDRDY = 0; obj->uart->EVENTS_TXDRDY = 0;
obj->uart->TXD = (uint8_t)c; obj->uart->TXD = (uint8_t)c;
} }
}
int serial_readable(serial_t *obj) int serial_readable(serial_t *obj)
{ {