Using UART component RX Interrupt - Tx Polling

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
Not applicable

Hi all,

I'm a newbie using Cypress platform and i'm currently developing an application where uses rs485 protocol, based on a UART component.

I'm guessing if there's any possibility to use the UART interrupt for RX and using Tx in blocking and polling mode. I mean, i want to check that UART has sent all the data, by checking UART_INTR_TX_UART_DONE without interrupts. Here an example:

uint8_t

Rs485_SendData( uint8_t *txbuf, uint16_t len ) {

uint16_t btosend, bsent;  

    btosend = len;

    bsent = 0;

    En_Tx();

  while( btosend-- ) {

  UART_UartPutChar( *( txbuf + bsent ) );

        bsent++;

  }

     /* Here i want to check by polling if UART_INTR_TX_UART_DONE sets to enable Rx pin of driver */

    En_Rx();

    return bsent;

}  

Any suggest?

Thanks in advance

0 Likes
1 Solution

Your code will work when you use UART_GetTxInterruptSource() (parentheses needed).

Additionally you will need to reset the interrupt cause at end of your handler using UART_ClearTxInterruptSource().

Bob

View solution in original post

4 Replies
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

There is an easy solution: Let the component handle its interrupts.

When the Rx and Tx buffers set to something larger than the internal FIFO size (let's say: 80 bytes) some internal routines will support sending and receiving data using interrupt handlers.

You can check the completeness of the transfers using UART_GetRxBufferSize() or GetTxBufferSize() APIs. Returned is always the actual number of bytes residing in the buffer.

When RxBufferSize() returns != 0 you can retrieve the bytes with the appropriate API.

TxBufferSize() == 0 indicates no more bytes remain to be sent.

Bob

0 Likes
Anonymous
Not applicable

Thanks for your fast response Bob!

But when using rs485, i must to enable rx mode in transceiver just at the end of the UART shift register transmision, thus, polling RxBufferSize() is not enough for a proper operation. I would like to busy check both UART_DONE and UART_TX_FIFO_EMPTY register to be sure that the transmision was succeed.

Could this be correct?

/* Busy wait to transmit data from buffer to tx shift register */

shile( ( UART_GetTxInterruptSource & UART_INTR_TX_EMPTY ) == 0 );

/* Busy wait to transmit all shifted data */

while( ( UART_GetTxInterruptSource & UART_INTR_TX_UART_DONE ) == 0 );

/* Renable rs485 Rx mode */

En_Rx();

Thanks for your attention!

Regards

Gorka

0 Likes

Your code will work when you use UART_GetTxInterruptSource() (parentheses needed).

Additionally you will need to reset the interrupt cause at end of your handler using UART_ClearTxInterruptSource().

Bob

Anonymous
Not applicable

Thanks Bob,

I finally got through interrupts! Thank for your reply!

Regards!

0 Likes