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:使用 FPGA 进行 UART 测试

Guru**** 2042910 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/746931/linux-processor-sdk-am335x-uart-testing-with-fpga

器件型号:PROCESSOR-SDK-AM335X

工具/软件:Linux

我们有一个基于 AM335x 入门套件的定制板。 我们的板正在成功引导。 以太网也运行正常。 现在、我们要测试我的处理器和 FPGA (Xilinx Artix)之间的 UART 接口。 我的 UART1连接到 FPGA 侧。

当我将数据写入连接到 FPGA 的 UART 时、FPGA 端什么都没有。 我在 Vivado 看到了这一点。

从 FPGA 发送数据时出现同样的问题。 处理器端未接收到任何内容。 我在 Qt 上观察到的这一点。

我在下面发布我的代码。 请 检查此项并建议我如何进一步完成此 UART 测试。 我们使用 RS232协议进行通信。

引脚多路复用:

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 下拉| 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 下拉| MUX_MODE0)   /* uart1_rtsn.uart1_rtsn *
         AM33XX_IOPAD (0x980、PIN_INPUT_PULLUP | MUX_MODE0)   /* uart1_Rxd.uart1_RxD *
         AM33XX_IOPAD (0x984、PIN_OUTPUT 下拉| MUX_MODE0)   /* uart1_TXD.uart1_TXD *
      >;
   };

uart0{(&U)
   pinctrl-names ="default";
   pinctrl-0 =<&uart0_PINs>;

   状态="正常";
};

uart1{(&U)
   pinctrl-names ="default";
   pinctrl-0 =<uart1_PINs>;

   状态="正常";
};

Linux 版本:TI-processor-SDK-Linux-AM335x-EVM-05.00.15。

C 代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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"errno);
返回-1;
}
cfsetospeed (&tty、速度);
cfsetispeed (&tty、speed);
tty.c_cflag =(tty.c_cflag 和~CSIZE)| CS8; // 8位字符
//针对速度不匹配的测试禁用 IGNBRK;否则接收中断
//作为\000字符
tty.c_iflag &=~IGNBRK; //禁用中断处理
tty.c_lflag = 0; //无信令字符、无回波、
//无规范处理
tty.c_oflag = 0; //无重映射,无延迟
tty.c_cc[Vmin]= 0; //读取不会阻止
tty.c_cc[VTIME]= 5; // 0.5秒读取超时

tty.c_iflag &=~(IXON | IXOFF | IXANY);//关闭 XON/XOFF 控制器

tty.c_cflag |=(CLOCAL | CREAD);//忽略调制解调器控件,
//启用读取
tty.c_cflag &=~(PARENB | PARODD); //关闭奇偶校验
tty.c_cflag |=奇偶校验;
tty.c_cflag &=~CSTOPB;
tty.c_cflag &=~CRTSCTS;
if (tcsetattr (g_UARTFile、TCSANOW、&tty)!= 0)
{
fprintf (stderr、"tcsetattr 中的 setParameters error %d、\n\n"、errno);
返回-1;
}
其他
printf ("成功设置参数\n");
//return 0;
}

void set_blocking (int 应该_block)
{
struct termios tty;
memset (&tty、0、sizeof tty);
if (tcgetattr (g_UARTFile、&tty)!= 0)
{
fprintf (stderr、"set_blocking error %d from tggetattr\n"errno);
返回;
}

tty.c_cc[Vmin]=应该_BLOCK? 1:0;
tty.c_cc[VTIME]= 5; // 0.5秒读取超时

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 打开被拒绝\n");
退出(1);
}
printf ("UART 打开成功\n\n");
setParameters (9600、1);
SET_BLOCKING (0);
printf ("UART 已成功连接!!!!! \n\n");
}

void writeData(){
unsigned char temp ='AA';
字符 A = 1;
int Spot = 0、n_written = 0;
unsigned char cmd[]="initialize\n";
while (1){
int Spot = 0、n_written = 0;
n_write=写入(g_UARTFile、&a、sizeof (a)));
Spot += n_written;
/*int n_written = 0、Spot = 0;
执行{
n_write=写入(g_UARTFile、&cmd[spot、1);
Spot += n_written;
}while (cmd[spot-1]!='\n'&& n_written >0);
if (spot >0)*/
printf ("已成功写入%d 个字符。\n\n"、Spot);
}
}

空 ReadData(){
字符响应[1024]、buf;
int Spot = 0、n;
memset (响应、'\0'、sizeof 响应);

执行{
N =读取(g_UARTFile、&buf、1);
sprintf (&response [spot、"%c"、buf);
Spot += n;
}while (buf!='\r\n>0);

if (n<0) printf ("读取错误\n\n");
否则、如果(n=0) printf ("读取任何内容!\n\n");
否则 printf ("响应%s\n"\n、响应);
}

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很高兴地说,当我向 FPGA 写入数据(即 writeData())时,此代码工作正常。
    问题是、在我们的 FPGA 代码中、我们分配了 Tx 到 Tx 和 Rx 到 Rx 引脚。 现在写入操作正常。

    现在、我希望从 FPGA 接收数据。 请检查我的 ReadData()函数,并建议我如何使用非阻塞模式读取数据。 即 Read()必须等到某些数据到达。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vamsi、

    我建议您从用户空间验证 UART1引脚多路复用器。 您可以使用 devmem2工具读取控制模块寄存器值、并检查这些值是否符合预期。

    接下来、您可以检查 AM335x UART1引脚上是否存在预期信号。 您可以连接示波器并探测引脚。 确保 FPGA 在这些引脚上生成预期的数据/信号。

    另请检查以下指针:

    software-dl.ti.com/.../Foundational_Components_Kernel_Drivers.html

    processors.wiki.ti.com/.../AM335x-PSP_04.06.00.11_Features_and_Performance_Guide

    此致、
    帕维尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢 Pavel、

    我将对其进行检查并告知您状态。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您没有其他与主题相关的问题、请关闭/验证/解决此主题。

    此致、
    帕维尔