Announcements

Equip yourself to optimize PSoc4 MCUs for Evs at the EV Webinar. Click here to register.

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

PSoC™ 4 Forum Discussions

FaBa_506136
Level 2
Level 2
5 replies posted 5 questions asked 5 sign-ins

Hi everyone.

i have a problem with the uart of the micro CY8C4126AXI-S433.

Immediately after the chip is programmed, the uart works correctly.

But if I turn the microart off and on again, the Uart does not receive, the rx_fifo_not_empty interrupt is not activated.

This is my initialization:

Uart_Start ();

uart_rx_isr_StartEx (uart_rx_isr);

this is isr

CY_ISR (uart_rx_isr)

{

    

Uart_ClearRxInterruptSource (Uart_INTR_RX_NOT_EMPTY); // clear interrupt

       

    // check UART Rx Buffer size

    if (0! = Uart_GET_RX_FIFO_ENTRIES)

    {

     / * Get the character from terminal * /

     RxBuffer [RxCounter ++] = (char8) Uart_RX_FIFO_RD_REG;

    }

}

0 Likes
1 Solution
MotooTanaka
Level 9
Level 9
First comment on KBA 1000 replies posted 750 replies posted

Hi,

I tried with a TSoC board, which has CY8C4146LQI-S433.

As this device is the closest one I have.

As far as I tested, the interrupt was working after power cycle.

But one issue I encountered was when the power got cycled,

KitProg and PC's COM port were not quite ready

before PSoC started writing something onto the UART.

So I needed to add

     CyDelay(1000) ;

after

     UART_Start() ;

and before the first output.

Schematic

000-schematic.JPG

Pins

001-pins.JPG

main.c

=============

#include "project.h"

#include "stdio.h"

#define RX_BUF_LEN 128

volatile int RxCounter = 0 ;

char RxBuffer[RX_BUF_LEN] ;

#define STR_LEN 64

char str[STR_LEN+1] ;

CY_ISR(uart_rx_isr)

{

    UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY) ;

   

    if (0 != UART_GET_RX_FIFO_ENTRIES) {

        /* Get character from terminal */

        RxBuffer[RxCounter++] = (char)UART_RX_FIFO_RD_REG ;

    }

}

void splash(char *title)

{

    UART_UartPutString("\x1b[2J\x1b[;H") ;

    UART_UartPutString(title) ;

    snprintf(str, STR_LEN, " (%s %s)\n\r",__DATE__, __TIME__) ;

    UART_UartPutString(str) ;

}

int main(void)

{

    uint8_t c ;

   

    CyGlobalIntEnable; /* Enable global interrupts. */

   

    uart_rx_isr_ClearPending() ;

    uart_rx_isr_StartEx(uart_rx_isr) ;

   

    UART_Start() ;

   

    CyDelay(1000) ;

   

    splash("UART Rx Int Test") ;

    for(;;)

    {

        if (RxCounter > 0) {

            c = RxBuffer[--RxCounter] ;

            switch(c) {

            case 0:

            case 0xFF:

                break ;

            case '\r':

            case '\n':

                UART_UartPutString("\r\n") ;

                break ;

            default:

                UART_UartPutChar(c) ;

                break ;

            }

        }  

    }

}

=============

Attached is my project with CY8C4146LQI-S433.

To test with your device please

(1) Use "Device Selector..." to change the device to "CY8C4126AXI-S433"

(2) Change pins to match with your hardware.

moto

View solution in original post

0 Likes
2 Replies
MotooTanaka
Level 9
Level 9
First comment on KBA 1000 replies posted 750 replies posted

Hi,

I tried with a TSoC board, which has CY8C4146LQI-S433.

As this device is the closest one I have.

As far as I tested, the interrupt was working after power cycle.

But one issue I encountered was when the power got cycled,

KitProg and PC's COM port were not quite ready

before PSoC started writing something onto the UART.

So I needed to add

     CyDelay(1000) ;

after

     UART_Start() ;

and before the first output.

Schematic

000-schematic.JPG

Pins

001-pins.JPG

main.c

=============

#include "project.h"

#include "stdio.h"

#define RX_BUF_LEN 128

volatile int RxCounter = 0 ;

char RxBuffer[RX_BUF_LEN] ;

#define STR_LEN 64

char str[STR_LEN+1] ;

CY_ISR(uart_rx_isr)

{

    UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY) ;

   

    if (0 != UART_GET_RX_FIFO_ENTRIES) {

        /* Get character from terminal */

        RxBuffer[RxCounter++] = (char)UART_RX_FIFO_RD_REG ;

    }

}

void splash(char *title)

{

    UART_UartPutString("\x1b[2J\x1b[;H") ;

    UART_UartPutString(title) ;

    snprintf(str, STR_LEN, " (%s %s)\n\r",__DATE__, __TIME__) ;

    UART_UartPutString(str) ;

}

int main(void)

{

    uint8_t c ;

   

    CyGlobalIntEnable; /* Enable global interrupts. */

   

    uart_rx_isr_ClearPending() ;

    uart_rx_isr_StartEx(uart_rx_isr) ;

   

    UART_Start() ;

   

    CyDelay(1000) ;

   

    splash("UART Rx Int Test") ;

    for(;;)

    {

        if (RxCounter > 0) {

            c = RxBuffer[--RxCounter] ;

            switch(c) {

            case 0:

            case 0xFF:

                break ;

            case '\r':

            case '\n':

                UART_UartPutString("\r\n") ;

                break ;

            default:

                UART_UartPutChar(c) ;

                break ;

            }

        }  

    }

}

=============

Attached is my project with CY8C4146LQI-S433.

To test with your device please

(1) Use "Device Selector..." to change the device to "CY8C4126AXI-S433"

(2) Change pins to match with your hardware.

moto

0 Likes

Hi Motoo,

Thanks very much for your help. I solved the problem

Fausto