summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2018-12-27 15:38:29 -0500
committerGitHub <noreply@github.com>2018-12-27 15:38:29 -0500
commitdcdd82ce859bbf753c834a0008b85cfe42cbe371 (patch)
tree52a787f034ae34fc819418cb5ff276b81fec0223
parentddf0d3fc5335e076f150f3e5fe506a6978eb35b3 (diff)
parent3ee766bc013aa3b3bb03606f6a0df03d8cf260e5 (diff)
Merge pull request #1428 from hathach/nrf52_esp83266_uart_bug
Nrf52 esp83266 uart bug
-rw-r--r--ports/nrf/common-hal/busio/UART.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/ports/nrf/common-hal/busio/UART.c b/ports/nrf/common-hal/busio/UART.c
index a291af578..912956369 100644
--- a/ports/nrf/common-hal/busio/UART.c
+++ b/ports/nrf/common-hal/busio/UART.c
@@ -67,21 +67,27 @@ static void ringbuf_clear(ringbuf_t *r)
r->iput = r->iget = 0;
}
+// will overwrite old data
+static void ringbuf_put_n(ringbuf_t* r, uint8_t* buf, uint8_t bufsize)
+{
+ for(uint8_t i=0; i < bufsize; i++) {
+ if ( ringbuf_put(r, buf[i]) < 0 ) {
+ // if full overwrite old data
+ (void) ringbuf_get(r);
+ ringbuf_put(r, buf[i]);
+ }
+ }
+}
+
static void uart_callback_irq (const nrfx_uarte_event_t * event, void * context) {
busio_uart_obj_t* self = (busio_uart_obj_t*) context;
switch ( event->type ) {
case NRFX_UARTE_EVT_RX_DONE:
- for(uint8_t i=0; i < event->data.rxtx.bytes; i++) {
- if ( ringbuf_put(&self->rbuf, event->data.rxtx.p_data[i]) < 0 ) {
- // if full overwrite old data
- (void) ringbuf_get(&self->rbuf);
- ringbuf_put(&self->rbuf, event->data.rxtx.p_data[i]);
- }
- }
+ ringbuf_put_n(&self->rbuf, event->data.rxtx.p_data, event->data.rxtx.bytes);
// keep receiving
- _VERIFY_ERR(nrfx_uarte_rx(&self->uarte, &self->rx_char, 1));
+ (void) nrfx_uarte_rx(&self->uarte, &self->rx_char, 1);
break;
case NRFX_UARTE_EVT_TX_DONE:
@@ -89,7 +95,13 @@ static void uart_callback_irq (const nrfx_uarte_event_t * event, void * context)
break;
case NRFX_UARTE_EVT_ERROR:
- // Handle error
+ // Possible Error source is Overrun, Parity, Framing, Break
+ // uint32_t errsrc = event->data.error.error_mask;
+
+ ringbuf_put_n(&self->rbuf, event->data.error.rxtx.p_data, event->data.error.rxtx.bytes);
+
+ // Keep receiving
+ (void) nrfx_uarte_rx(&self->uarte, &self->rx_char, 1);
break;
default: