工具与软件:
嗨、大家好;
我最近在 AM625上遇到了 ti-processor-sdk-linux-rt-am62xx-evm-08.06.00.42的 UART 问题。
我编写了一个应用程序(catch_rtk.c)、通过 UART3接收 GPS 数据、包括 GSV、GSA 和原始数据。 UART3的波特率为921600。 GPS 模块提供41kb/s 的数据。
也许由于大量的数据,我发现,偶尔会错过一些数据。 而且,我已经排除了 GPS 模块。 我跟踪 UART 8250驱动程序代码。 我在函数 UART_INSERT _CHAR 中发现发生了溢出错误(寄存器 UART_LSR 的位 RX_OE)。
我发现不使用 DMA、而是使用 FIFO。
up.port.fifosize = 64;
up.tx_loadsz = 64;
我想修改 RX FIFO 触发电平以避免错误。 如果可以、请告诉我如何修改。
原因是未使用 DMA。 我已尝试 UART DMA。 我在文件中配置 UART3 DTS
arch/arm64/boot/dts/ti/k3-am62-main.dtsi。
main_uart3:串行@2830000{
Compatible ="ti、am64-uart"、"ti、am654-uart";
REG =<0x00 0x02830000 0x00 0x100>;
中断= ;
电源域=<&K3_PDS 154 TI_SCI_PD_Exclusive>;
时钟=<&K3_CLKS 154 0>;
时钟名称="fclk";
DMA =<&MAIN_pktdma 0x4403 0>、<&MAIN_pktdma 0xc403 0>;
DMA-names ="Rx"、"TX";
};
我使用同一个应用程序接收 GPS 数据超过12小时。 不幸的是、我发现有缺失
两个数据在多个地方。 目前我不知道通过 DMA 模式的根模式吗?
我想知道 DMA 模式是否可以优化?
请给我一些建议。
catch_rtk.c 源代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define RTK_DEV_FILE "/dev/ttyS9 "
#define RTK_DATA_FILE "/home/root/rtk_data.txt "
int main (int argc、char * argv[])
{
INT FD、UART_FD;
struct termios 选项;
结构时间;
Int ret;
int fs_sel、lenth;
FD_SET FS_READ;
char buff[1024];
FD = OPEN (RTK_DATA_FILE、O_RDWR | O_CREAT);
IF (FD < 0)
{
printf ("打开%s 文件失败\n"、RTK_DATA_FILE);
返回-1;
}
UART_FD = OPEN (RTK_DEV_FILE、O_RDWR);
IF (UART_FD < 0)
{
printf ("打开%s 文件失败\n"、kkm_dev_file);
关闭(FD);
返回-1;
}
if (tcgetattr (UART_FD、&OPTIONS)!= 0)
{
perror ("获取 UART 属性\n");
关闭(FD);
关闭(UART_FD);
返回-1;
}
cfsetidspeed (&options、B921600);
cfsetospeed (&options、B921600);
options.c_cflag |= CLOCAL;
options.c_cflag |= CREAD;
options.c_cflag &=~μ s CRTSCTS;
options.c_cflag &=~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &=~PARENB;
options.c_iflag &=~μ s INPCK;
options.c_cflag &=~CSTOPB;
options.c_ofag &=~μ s OPOST;
options.c_lflag &=~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag &=~(ICRNL | IXON);
options.c_cc[VTIME]= 1;
options.c_cc[Vmin]= 1;
tcflush (UART_FD、TCIFLUSH);
if (tcsetattr (UART_FD、TCSANOW、&OPTIONS)!= 0)
{
perror ("设置 UART 参数错误!\n");
关闭(FD);
关闭(UART_FD);
返回-1;
}
if (fcntl (UART_FD、F_SETFL、0)< 0)
{
printf ("fcntl UART 失败!\n");
关闭(FD);
关闭(UART_FD);
返回-1;
}
while (1)
{
fd_zero (&FS_READ);
FD_SET (UART_FD、&FS_READ);
//FS_SEL = SELECT (UART_FD+1、&FS_READ、NULL、NULL 和 TIME);
FS_SEL = SELECT (UART_FD + 1、&FS_READ、NULL、NULL、NULL);
IF (FS_SEL)
{
memset (buff、"\0"、sizeof (buff));
lenth =读取(UART_FD、buff、sizeof (buff));
if (lenth > 0)
{
RET =写入(fd、buff、lenth);
if (ret!= lenth)
{
printf ("将数据写入%s 文件失败\n"、RTK_DATA_FILE);
}
}
}
设计
{
printf ("UART recv data failure!\n");
关闭(FD);
关闭(UART_FD);
返回-1;
}
}
关闭(UART_FD);
返回0;
}
此致!
Johnny