工具/软件: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();
}