嵌入式爱好者

查看: 3282|回复: 4

[Linux] OK3568 CAN无法接收

[复制链接]

1

主题

3

帖子

15

积分

RK3568通行证

扫一扫,手机访问本帖
发表于 2023-3-23 09:44:44 | 显示全部楼层 |阅读模式
CAN无法接收

#define CAN0_DEV "can0"         //CAN设备映射节点

/**  打开CAN0**/
#define IP_CMD_CAN_OPEN            "ifconfig can0 up"

/**  将CAN0波特率设置为500000 bps**/
#define IP_CMD_SET_CAN_PARAMS      "ip link set can0 up type can bitrate 500000 sample-point 0.75 dbitrate 4000000 dsample-point 0.8 fd on"

/**  关闭CAN0**/
#define IP_CMD_CAN_CLOSE           "ifconfig can0 down"

int can_init(char *dev)
{
        struct ifreq ifr = {0};
        struct sockaddr_can can_addr = {0};
        int ret;

        /**  通过system调用ip命令设置CAN波特率**/
        system(IP_CMD_CAN_CLOSE);          // 必须先关闭CAN,才能成功设置CAN波特率
        system(IP_CMD_SET_CAN_PARAMS);
        system(IP_CMD_CAN_OPEN);
        printf("Set can baud rate success\n");

        /**  打开套接字**/
        can_fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
        if(0 > can_fd) {
                perror("socket");
                return -1;
        }
        printf("Open socket success\n");


        /** 是否开启回环功能**/
        int loopback = 0;   // 0 = disabled, 1 = enabled (default)
        setsockopt(can_fd, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback, sizeof(loopback));


        /**  指定can0设备**/
        strcpy(ifr.ifr_name, CAN0_DEV);
        ret = ioctl(can_fd, SIOCGIFINDEX, &ifr);
        if(0 > ret){
                perror("SIOCGIFINDEX");
                close(can_fd);
                return -1;
        }
        can_addr.can_family = AF_CAN;
        can_addr.can_ifindex = ifr.ifr_ifindex;
        printf("Iotcl SIOCGIFINDEX success\n");


       


        /**  将can0与套接字进行绑定**/
        ret = bind(can_fd, (struct sockaddr *)&can_addr, sizeof(can_addr));
        if (0 > ret) {
                perror("bind");
                close(can_fd);
                return -1;
        }
        printf("Bind can success\n");


        /**  设置过滤规则**/
        setsockopt(can_fd, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);           //禁用过滤规则
        printf("Setsockopt success\n");

        return 0;
}

int main(void)
{
        struct can_frame frame = {0};
        int nread, i, ret, len;
        struct sockaddr_can addr;

    printf("Welcome to can test\n");

        if(can_init(CAN0_DEV) == FALSE){
                printf("Failed to can initial\n");
                return -1;
        }
        printf("Can initial success\n");


        while(1)
        {
                nread = read(can_fd, &frame, sizeof(frame));
                if(nread > 0)
                {
                        printf("[%d] ", frame.can_dlc);

                        /**  打印数据**/
                        for (i = 0; i < frame.can_dlc; i++)
                                printf("%02x ", frame.data[i]);
                        printf("\n");
                        nread = 0;
                }
        }

//    close(can_fd);
//        return 0;
}
回复

使用道具 举报

0

主题

89

帖子

282

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3399通行证LS1028A通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证

发表于 2023-3-23 10:25:42 | 显示全部楼层
首先确认您手上的底板CAN功能是否正常,短接两路can的H和H、L和L,使用命令行candump命令和cansend命令测试本身通讯是否正常,借此确认一下是您手上底板的硬件问题还是您应用用法的问题。

点评

使用candump和cansend进行测试,正常;但还是不能接收  详情 回复 发表于 2023-4-14 11:33
点评回复 支持 反对

使用道具 举报

1

主题

3

帖子

15

积分

RK3568通行证

 楼主| 发表于 2023-4-14 11:33:56 | 显示全部楼层
兵兵兵兵鸭 发表于 2023-3-23 10:25
首先确认您手上的底板CAN功能是否正常,短接两路can的H和H、L和L,使用命令行candump命令和cansend命令测试 ...

使用candump和cansend进行测试,正常;但还是不能接收
点评回复 支持 反对

使用道具 举报

0

主题

50

帖子

95

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3588通行证RK3399通行证LS1028A通行证G2L通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证AM62x资料下载FDU070K02\FDU101K02通行证i.MX9352通行证

发表于 2023-4-19 18:59:05 | 显示全部楼层
运行有什么报错吗?将if(can_init(CAN0_DEV) == FALSE)改为if(can_init(CAN0_DEV) != 0)吧
点评回复 支持 反对

使用道具 举报

0

主题

50

帖子

95

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3588通行证RK3399通行证LS1028A通行证G2L通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证AM62x资料下载FDU070K02\FDU101K02通行证i.MX9352通行证

发表于 2023-4-19 19:01:18 | 显示全部楼层
可以看下https://www.cnblogs.com/eaggle/p/7651856.html这个连接,或许对你有所帮助
点评回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-20 18:42

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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