Toybrick

RK3588公板串口问题,收发都没有数据

singlly

新手上路

积分
27
楼主
发表于 2024-4-10 18:36:00    查看: 4666|回复: 12 | [复制链接]    打印 | 只看该作者
本帖最后由 singlly 于 2024-4-10 20:00 编辑

核心板:  TB-RK3588 CoreBorad_V11  2021-12-20
底板:  TB-RK3588_MainBoard_V11 2021-12-21


我现在开发需要用到两路串口, 目前使用公板底座20pin上的 UART4 和 UART6
GPIO1_A0_3V3 / MIPI_CSI0_PDN1_H / UART6_RX_M1
GPIO1_A1_3V3 / MIPI_DCPHY1_RX_PDN_H / UART6_TX_M1

GPIO1_B2_3V3 / MIPICSI1_PWREN_H / UART4_RX_M2
GPIO1_B3_3V3 / MIPI_CSI1_PDN1_H / UART4_TX_M2


配置devicetree打开两路串口后, (/dev/ttyS4, /dev/ttyS6)
连PC测试 收发都没有数据,两个串口互接 回环测试 也都没有数据.
用PC接分析仪板子串口TX发数据到PC,分析仪显示一直是3.3V高电平.我把修改回退,把几个gpio口export出来, 配成输出,gpio拉高拉低可以量出来变化

不知道问题出在哪, 麻烦帮忙看看





回复

使用道具 举报

395876134

版主

积分
1099
沙发
发表于 2024-4-11 08:52:00 | 只看该作者
你好,请问你是如何测试的?代码贴出来。
还有 cat /d/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins确认下 对应io是否配置成uart。
回复

使用道具 举报

singlly

新手上路

积分
27
板凳
 楼主| 发表于 2024-4-11 09:04:10 | 只看该作者
1.   测试方法是
  echo string 到串口节点, 接PC端用串口工具读取,
  echo "teststring" > /dev/ttyS4
然后PC端发送,cat 串口节点查看
  cat /dev/ttyS4

2.  
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins

pin 32 (gpio1-0): feb90000.serial (GPIO UNCLAIMED) function uart6 group uart6m1-xfer
pin 33 (gpio1-1): feb90000.serial (GPIO UNCLAIMED) function uart6 group uart6m1-xfer

pin 42 (gpio1-10): feb70000.serial (GPIO UNCLAIMED) function uart4 group uart4m2-xfer
pin 43 (gpio1-11): feb70000.serial (GPIO UNCLAIMED) function uart4 group uart4m2-xfer

cat pinconf-pins

pin 32 (gpio1-0): input bias pull up (1 ohms), output drive strength (8 mA), input schmitt enabled
pin 33 (gpio1-1): input bias pull up (1 ohms), output drive strength (8 mA), input schmitt enabled

pin 42 (gpio1-10): input bias pull up (1 ohms), output drive strength (8 mA), input schmitt enabled
pin 43 (gpio1-11): input bias pull up (1 ohms), output drive strength (8 mA), input schmitt enabled
回复

使用道具 举报

395876134

版主

积分
1099
地板
发表于 2024-4-11 09:25:04 | 只看该作者
先看下echo的时候,发送的io口是否有数据输出。可以用我的test测试下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //文件控制定义
#include <termios.h>//终端控制定义
#include <errno.h>
#include <unistd.h>
#include <string.h>
#define DEVICE "/dev/ttyS4"

#define S_TIMEOUT 1
  
int serial_fd = 0;
  
//打开串口并初始化设置

init_serial(char * device)
{
    serial_fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY);
    if (serial_fd < 0) {
        perror("open");
        return -1;
    }
      
    //串口主要设置结构体termios <termios.h>
    struct termios options;
      
    /**1. tcgetattr函数用于获取与终端相关的参数。
    *参数fd为终端的文件描述符,返回的结果保存在termios结构体中
    */
    tcgetattr(serial_fd, &options);
    /**2. 修改所获得的参数*/
    options.c_cflag |= (CLOCAL | CREAD);//设置控制模式状态,本地连接,接收使能
    options.c_cflag &= ~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位
    options.c_cflag &= ~CRTSCTS;//无硬件流控
    options.c_cflag |= CS8;//8位数据长度
    options.c_cflag &= ~CSTOPB;//1位停止位
    options.c_iflag |= IGNPAR;//无奇偶检验位
    options.c_oflag = 0; //输出模式
    options.c_lflag = 0; //不激活终端模式
    cfsetospeed(&options, B500000);//设置波特率
      
    /**3. 设置新属性,TCSANOW:所有改变立即生效*/
    tcflush(serial_fd, TCIFLUSH);//溢出数据可以接收,但不读
    tcsetattr(serial_fd, TCSANOW, &options);
      
    return 0;
}
  
/**
*串口发送数据
*@fd:串口描述符
*@data:待发送数据
*@datalen:数据长度
*/
unsigned int total_send = 0 ;
int uart_send(int fd, char *data, int datalen)
{
    int len = 0;
    len = write(fd, data, datalen);//实际写入的长度
    if(len == datalen) {
    total_send += len ;
        // printf("total_send is %d\n",total_send);
        return len;
    } else {
        tcflush(fd, TCOFLUSH);//TCOFLUSH刷新写入的数据但不传送
        return -1;
    }
    return 0;
}
  
/**
*串口接收数据
*要求启动后,在pc端发送ascii文件
*/
unsigned int total_length = 0 ;
int uart_recv(int fd, char *data, int datalen, int rate)
{
    int len=0, ret = 0;
    fd_set fs_read;
    struct timeval tv_timeout;
      
    FD_ZERO(&fs_read);
    FD_SET(fd, &fs_read);

#ifdef S_TIMEOUT   
    tv_timeout.tv_sec = (10*20/rate+2);
    tv_timeout.tv_usec = 0;
    ret = select(fd+1, &fs_read, NULL, NULL, NULL);
#elif
    ret = select(fd+1, &fs_read, NULL, NULL, tv_timeout);
#endif

// printf("ret = %d\n", ret);
    //如果返回0,代表在描述符状态改变前已超过timeout时间,错误返回-1
     
    if (FD_ISSET(fd, &fs_read)) {
        len = read(fd, data, datalen);
    total_length += len ;
        // printf("total len = %d\n", total_length);
        return len;
    } else {
        perror("select");
        return -1;
    }
      
    return 0;
}
  
int main(int argc, char **argv)
{
    init_serial(argv[1]);
  
    char buf[]="5A5A5A5A5A";
    char buf1[11] ;
    memset(buf1,0,sizeof(char)*11);
        
    int count = 0;
    while(1)
    {
        uart_send(serial_fd, buf, 11);
        printf("%d \n", count++);
        sleep(1);
        //if(uart_recv(serial_fd, buf1, 11) > 0)
        uart_recv(serial_fd, buf1, 11,atoi(argv[2]));
        if (strncmp(buf1, buf, sizeof(buf)) != 0) {
          printf("failed: %s\n", buf1);
        }
        memset(buf1,0,sizeof(char)*11);
    }

    close(serial_fd);
    return 0;
}
回复

使用道具 举报

singlly

新手上路

积分
27
5#
 楼主| 发表于 2024-4-11 09:25:07 | 只看该作者
内核log里有这个打印 不知道是不是问题
[    5.270487] of_dma_request_slave_channel: dma-names property of node '/serial@feb70000' missing or empty
[    5.270511] dw-apb-uart feb70000.serial: failed to request DMA, use interrupt mode

[   15.373946] of_dma_request_slave_channel: dma-names property of node '/serial@feb90000' missing or empty
[   15.373991] dw-apb-uart feb90000.serial: failed to request DMA, use interrupt mode

回复

使用道具 举报

395876134

版主

积分
1099
6#
发表于 2024-4-11 09:39:13 | 只看该作者
本帖最后由 395876134 于 2024-4-11 09:47 编辑

先用示波器测试下,echo的时候,uart tx引脚有没有数据输出,确认有输出了,然后再用我得测试代码测试下,注意修改下 对应的tty设备名。可以用我传的ts_uart直接测试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

singlly

新手上路

积分
27
7#
 楼主| 发表于 2024-4-11 10:10:02 | 只看该作者
1.  配置速率115200  rk3588 通过串口 /dev/ttyS6  发送数据到PC, PC可以接收到数据,
  运行测试程序,PC可以收到5A5A5A5A5A

2. RK3588板端 运行测试程序, 接收不到数据.
root@debian:/home/toybrick/test# ./mytest
init serial:/dev/ttyS6
0
failed:
1

3. PC端定时发送字串, RK3588关闭测试程序, cat /dev/ttyS6   也没有数据出来
回复

使用道具 举报

395876134

版主

积分
1099
8#
发表于 2024-4-11 10:33:11 | 只看该作者
用ts_uart测试收发都ok对吧?
回复

使用道具 举报

singlly

新手上路

积分
27
9#
 楼主| 发表于 2024-4-11 10:44:09 | 只看该作者
用测试程序和 ts_uart都测试了 , RK3588发送到PC可以 ,  从PC发送到RK3588 接收不到
回复

使用道具 举报

singlly

新手上路

积分
27
10#
 楼主| 发表于 2024-4-11 10:58:46 | 只看该作者
测试程序debug 发现, 程序运行后,PC端没有发数据,甚至把串口关闭, 测试程序的读取函数仍然触发返回1,读取到1个字节, 内容是0
后面PC端再发送数据,无论发多少次都无法触发读取。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表