Skip to content
Snippets Groups Projects
Commit 49fe4380 authored by Cristian Maglie's avatar Cristian Maglie
Browse files

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).
parent ea59a7b5
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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) ;
......
......@@ -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();
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment