From 49fe43806d164ca81b45191ad41fb33ba670f02e Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sun, 5 Jul 2015 13:36:52 +0200 Subject: [PATCH] Uart: fix acknowledge of UART errors This fix lock-ups on UART errors (for example when disconnecting and reconnecting RX/TX wires or if the method Serial.begin is called while another device is already transmitting). --- cores/arduino/SERCOM.cpp | 12 +++++++++++- cores/arduino/SERCOM.h | 2 ++ cores/arduino/Uart.cpp | 12 ++++++------ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/cores/arduino/SERCOM.cpp b/cores/arduino/SERCOM.cpp index d54c755a0..7d7e7f9db 100644 --- a/cores/arduino/SERCOM.cpp +++ b/cores/arduino/SERCOM.cpp @@ -30,8 +30,8 @@ SERCOM::SERCOM(Sercom* s) */ void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint32_t baudrate) { - resetUART(); initClockNVIC(); + resetUART(); //Setting the CTRLA register sercom->USART.CTRLA.reg = SERCOM_USART_CTRLA_MODE(mode) | @@ -127,6 +127,16 @@ bool SERCOM::availableDataUART() return sercom->USART.INTFLAG.bit.RXC; } +bool SERCOM::isUARTError() +{ + return sercom->USART.INTFLAG.bit.ERROR; +} + +void SERCOM::acknowledgeUARTError() +{ + sercom->USART.INTFLAG.bit.ERROR = 1; +} + bool SERCOM::isBufferOverflowErrorUART() { //BUFOVF : Buffer Overflow diff --git a/cores/arduino/SERCOM.h b/cores/arduino/SERCOM.h index d64214522..fbd27e624 100644 --- a/cores/arduino/SERCOM.h +++ b/cores/arduino/SERCOM.h @@ -162,6 +162,8 @@ class SERCOM bool isDataRegisterEmptyUART( void ) ; uint8_t readDataUART( void ) ; int writeDataUART(uint8_t data) ; + bool isUARTError() ; + void acknowledgeUARTError() ; /* ========== SPI ========== */ void initSPI(SercomSpiTXPad mosi, SercomRXPad miso, SercomSpiCharSize charSize, SercomDataOrder dataOrder) ; diff --git a/cores/arduino/Uart.cpp b/cores/arduino/Uart.cpp index 094fb71ba..6f24bed9e 100644 --- a/cores/arduino/Uart.cpp +++ b/cores/arduino/Uart.cpp @@ -59,15 +59,15 @@ void Uart::flush() void Uart::IrqHandler() { - if(sercom->availableDataUART()) - { + if (sercom->availableDataUART()) { rxBuffer.store_char(sercom->readDataUART()); } - if( sercom->isBufferOverflowErrorUART() || - sercom->isFrameErrorUART() || - sercom->isParityErrorUART()) - { + if (sercom->isUARTError()) { + sercom->acknowledgeUARTError(); + // TODO: if (sercom->isBufferOverflowErrorUART()) .... + // TODO: if (sercom->isFrameErrorUART()) .... + // TODO: if (sercom->isParityErrorUART()) .... sercom->clearStatusUART(); } }