From 6b346253f229b93e69f823ae6597a24edc3d7cbe Mon Sep 17 00:00:00 2001 From: akhilpanayam Date: Thu, 6 Aug 2015 16:22:22 +0530 Subject: [PATCH] * updated with corrections in serial asynch apis. --- .../mbed/targets/hal/TARGET_Atmel/TARGET_SAM0/serial_api.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM0/serial_api.c b/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM0/serial_api.c index 4f843d23b1..117ad54848 100644 --- a/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM0/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM0/serial_api.c @@ -440,7 +440,7 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b /* Set stopbits, character size and enable transceivers */ - ctrlb = (uint32_t)pSERIAL_S(obj)->stopbits | (uint32_t)pSERIAL_S(obj)->character_size; + ctrlb |= (pSERIAL_S(obj)->stopbits | pSERIAL_S(obj)->character_size); /* Check parity mode bits */ if (pSERIAL_S(obj)->parity != USART_PARITY_NONE) { @@ -950,14 +950,17 @@ int serial_rx_irq_handler_asynch(serial_t *obj) if (error_code & SERCOM_USART_STATUS_FERR) { /* Store the error code and clear flag by writing 1 to it */ _USART(obj).STATUS.reg |= SERCOM_USART_STATUS_FERR; + serial_rx_abort_asynch(obj); return SERIAL_EVENT_RX_FRAMING_ERROR; } else if (error_code & SERCOM_USART_STATUS_BUFOVF) { /* Store the error code and clear flag by writing 1 to it */ _USART(obj).STATUS.reg |= SERCOM_USART_STATUS_BUFOVF; + serial_rx_abort_asynch(obj); return SERIAL_EVENT_RX_OVERFLOW; } else if (error_code & SERCOM_USART_STATUS_PERR) { /* Store the error code and clear flag by writing 1 to it */ _USART(obj).STATUS.reg |= SERCOM_USART_STATUS_PERR; + serial_rx_abort_asynch(obj); return SERIAL_EVENT_RX_PARITY_ERROR; } } @@ -1036,6 +1039,7 @@ void serial_tx_abort_asynch(serial_t *obj) /* Sanity check arguments */ MBED_ASSERT(obj); _USART(obj).INTFLAG.reg = SERCOM_USART_INTFLAG_TXC; + _USART(obj).INTENCLR.reg = SERCOM_USART_INTFLAG_TXC; obj->tx_buff.length = 0; obj->rx_buff.pos = 0; @@ -1047,6 +1051,7 @@ void serial_rx_abort_asynch(serial_t *obj) /* Sanity check arguments */ MBED_ASSERT(obj); _USART(obj).INTFLAG.reg = SERCOM_USART_INTFLAG_RXC; + _USART(obj).INTENCLR.reg = SERCOM_USART_INTFLAG_RXC; obj->rx_buff.length = 0; obj->rx_buff.pos = 0; }