请选择 进入手机版 | 继续访问电脑版
查看: 1226|回复: 2

[分享] i.MX6Q如何实现两路CAN并实现通信功能

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32001
    最后登录
    2024-4-9
    发表于 2021-12-15 13:04:37 | 显示全部楼层 |阅读模式
    i.MX6Q如何实现两路CAN并实现通信功能
    目的:在imx6q上添加第二路CAN的驱动支持,并实现第二路CAN的通信功能。
    CPU:i.mx6q
    Linux:imx linux3.10.53

    一、添加二路CAN的驱动支持
    这个过程很简单,就是添加第二路CAN的设备树,驱动系统已经帮我们做好。
    在内核源码中搜索can,可以在imx6q-sabresd.dts中发现如下信息:
    这是原本已经添加的一路CAN的设备树(一部分代码),仿照此段添加另一路CAN的设备树即可。如下:
    其中第4行的trx-stby-gpio是使能can芯片,低电平使能,如果原理图中已将此引脚拉低,可不写。
    修改完成后重新编译,然后将设备树和内核烧入开发板启动,如果一切正确,ifconfig -a后可看到can0和can1。
    二、两路CAN通信的Linux应用程序编写
    两路can通信使用两条can总线,因此建立两个socket即可:
    1. void can_init( void )
    2. {
    3.     int socked, socked_can1;
    4.         struct sockaddr_can can_addr;
    5.         struct ifreq ifr;
    6.         int b_on=1;
    7.         
    8.         if((socked = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
    9.         {
    10.         printf("if((socked = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) \n");
    11.                 return;
    12.         }
    13.     memset(&ifr, 0, sizeof(ifr));
    14.         strcpy(ifr.ifr_name, DEV_CAN);

    15.         if (RET_SUCCESS != ioctl(socked, SIOCGIFINDEX, &ifr))
    16.         {
    17.                 close(socked);
    18.                 return;
    19.         }
    20.         printf("ioctl has been  set \n");
    21.         
    22.         t_RetData = ioctl (socked, FIONBIO, &b_on);    //b_on=1,设置为非阻塞模式

    23.     memset(&can_addr, 0, sizeof(can_addr));
    24.         can_addr.can_family  = AF_CAN;
    25.         can_addr.can_ifindex = 2;
    26.   
    27.         if(bind(socked, (struct sockaddr *)&can_addr, sizeof(can_addr)) < 0)
    28.         {
    29.                 close(socked);
    30.                 return;
    31.         }
    32.     printf("CAN initialed");
    33.     s_Can0Socket = socked;
    34.          
    35.         

    36.         printf("InitCAN1 \n");
    37.         if((socked_can1 = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
    38.         {
    39.         printf("if((socked = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) \n");
    40.                 return;
    41.         }
    42.     memset(&ifr, 0, sizeof(ifr));
    43.         strcpy(ifr.ifr_name, DEV_CAN1);

    44.         if (RET_SUCCESS != ioctl(socked_can1, SIOCGIFINDEX, &ifr))
    45.         {
    46.             printf("if (RET_SUCCESS != ioctl(socked, SIOCGIFINDEX, &ifr))\n");
    47.                 close(socked_can1);
    48.                 return;
    49.         }
    50.         printf("ioctl has been  set \n");

    51.         b_on = 0;
    52.         t_RetData = ioctl(socked_can1, FIONBIO, &b_on);
    53.     printf("t_RetData:%d",t_RetData);

    54.     memset(&can_addr, 0, sizeof(can_addr));
    55.         can_addr.can_family  = AF_CAN;
    56.         can_addr.can_ifindex = 3;                        // 这里ifindex不能和第一个的相同,不然会有问题。可以在系统中查看此值
    57.   
    58.         if(bind(socked_can1, (struct sockaddr *)&can_addr, sizeof(can_addr)) < 0)
    59.         {
    60.                 close(socked_can1);
    61.                 return;
    62.         }
    63.     printf("CAN initialed ");
    64.     s_Can1Socket = socked_can1;
    65.         
    66.     return;   
    67.    
    68. }
    复制代码


    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-4-9 17:01
  • 签到天数: 1478 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92608
    最后登录
    2024-4-9
    发表于 2021-12-15 14:03:31 | 显示全部楼层
    用的是SocketCAN呢
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 1273 天

    [LV.10]以坛为家III

    21

    主题

    1万

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    13210
    最后登录
    2024-4-18
    发表于 2021-12-18 16:27:04 | 显示全部楼层
    666! 熟悉的配方, 熟悉的味道!
    跟着日天混 ,三天饱九顿!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-18 20:10 , Processed in 0.118954 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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