This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Linux/PROCESSOR-SDK-AM335X: UART Testing With FPGA

Part Number: PROCESSOR-SDK-AM335X

Tool/software: Linux

We have a custom board based on AM335x Starter kit. Our board is booting successfully. Ethernet is also working fine. Now we want to test UART interface between my processor and FPGA (XILINX ARTIX). My UART1 is connected to FPGA Side.

When i write data to UART which is connected to FPGA, nothing is coming on FPGA Side. This I observed on Vivado.

Same issue when I send data from FPGA. Nothing is received at the processor side. This I observed on Qt.

I am posting my code below. please  check this and suggest me what to do to complete this UART test further. We are using RS232 protocol for communication.

Pinmux:

uart0_pins: pinmux_uart0_pins {
        pinctrl-single,pins = <
            AM33XX_IOPAD(0x970, PIN_INPUT_PULLUP | MUX_MODE0)    /* uart0_rxd.uart0_rxd */
            AM33XX_IOPAD(0x974, PIN_OUTPUT_PULLDOWN | MUX_MODE0)    /* uart0_txd.uart0_txd */
        >;
    };

    uart1_pins: pinmux_uart1_pins {
        pinctrl-single,pins = <
            AM33XX_IOPAD(0x978, PIN_INPUT | MUX_MODE0)        /* uart1_ctsn.uart1_ctsn */
            AM33XX_IOPAD(0x97C, PIN_OUTPUT_PULLDOWN | MUX_MODE0)    /* uart1_rtsn.uart1_rtsn */
            AM33XX_IOPAD(0x980, PIN_INPUT_PULLUP | MUX_MODE0)    /* uart1_rxd.uart1_rxd */
            AM33XX_IOPAD(0x984, PIN_OUTPUT_PULLDOWN | MUX_MODE0)    /* uart1_txd.uart1_txd */
        >;
    };

&uart0 {
    pinctrl-names = "default";
    pinctrl-0 = <&uart0_pins>;

    status = "okay";
};

&uart1 {
    pinctrl-names = "default";
    pinctrl-0 = <&uart1_pins>;

    status = "okay";
};

Linux-Version: ti-processor-sdk-linux-am335x-evm-05.00.00.15.

C Code:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <termios.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>

int g_UARTFile;


int setParameters (int speed, int parity)
{
//    DCB p;
    struct termios tty;
    memset (&tty, 0, sizeof tty);
    if (tcgetattr (g_UARTFile, &tty) != 0)
    {
        fprintf (stderr, "setParameters error %d from tcgetattr\n\n", errno);
        return -1;
    }
    cfsetospeed (&tty, speed);
    cfsetispeed (&tty, speed);
    tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;     // 8-bit chars
    // disable IGNBRK for mismatched speed tests; otherwise receive break
    // as \000 chars
    tty.c_iflag &= ~IGNBRK;         // disable break processing
    tty.c_lflag = 0;                // no signaling chars, no echo,
    // no canonical processing
    tty.c_oflag = 0;                // no remapping, no delays
    tty.c_cc[VMIN]  = 0;            // read doesn't block
    tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout

    tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl

    tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,
    // enable reading
    tty.c_cflag &= ~(PARENB | PARODD);      // shut off parity
    tty.c_cflag |= parity;
    tty.c_cflag &= ~CSTOPB;
    tty.c_cflag &= ~CRTSCTS;
    if (tcsetattr (g_UARTFile, TCSANOW, &tty)!= 0)
    {
        fprintf (stderr, "setParameters error %d from tcsetattr\n\n", errno);
        return -1;
    }
    else
        printf("Successfully set parameters\n\n");
    //return 0;
}

void set_blocking (int should_block)
{
    struct termios tty;
    memset (&tty, 0, sizeof tty);
    if (tcgetattr (g_UARTFile, &tty) != 0)
    {
        fprintf (stderr, "set_blocking error %d from tggetattr\n\n", errno);
        return;
    }

    tty.c_cc[VMIN]  = should_block ? 1 : 0;
    tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout

    if (tcsetattr (g_UARTFile, TCSANOW, &tty) != 0)
        fprintf (stderr, "set_blocking error %d setting term attributes\n\n", errno);
}

void UartOpen()
{
    g_UARTFile = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_SYNC);
    if (g_UARTFile < 0) {
        perror("UART Open Denied\n");
        exit(1);
    }
    printf("UART Open is successful\n\n");
    setParameters(9600, 1);
    set_blocking(0);
    printf("UART is connected successfully!!!!!\n\n");
}

void writeData(){
    unsigned char temp = 'AA';
    char a = 1;
    int spot=0,n_written=0;
    unsigned char cmd[]="INITIALIZE\n";
        while(1){
             int spot=0,n_written=0;
    n_written = write(g_UARTFile,&a,sizeof(a));
    spot += n_written;
    /*int n_written = 0, spot =0;
        do{
            n_written = write(g_UARTFile,&cmd[spot],1);
            spot += n_written;
        }while(cmd[spot-1] != '\n' && n_written > 0);
        if(spot>0)*/
    printf("successfully written %d characters.\n\n",spot);
        }
}

void readData(){
    char response[1024],buf;
    int spot = 0,n;
    memset(response, '\0', sizeof response);

    do{
        n = read(g_UARTFile, &buf,1);
        sprintf(&response[spot],"%c",buf);
        spot+=n;
    }while(buf!='\r' && n >0);

    if(n<0) printf("Error Reading\n\n");
    else if(n==0) printf("Read Nothing!\n\n");
    else printf("Response %s\n\n",response);
}

int main(int argc, char *argv[])
{
    UartOpen();
//    writeData();
    readData();
}