<< 点击显示目录 >> 主页 Hypervisor使用助手 > 安装与使用 > Linux_Hypervisor安装指导手册 > 特殊通信 | MPC3100上Ubuntu系统CAN通信测试 |
1. 硬件信息
2. 接线说明
3. 测试验证架构
3.1 示意图
3.2 实际图
4.1 Linux下CAN驱动接口说明
4.2 确认底层驱动控制器
4.3 加载CAN驱动模块
4.4 配置CAN口波特率
4.5 使能CAN口
5.1 流程
5.2 C代码
5.3 编译与执行
5.4 CAN分析仪读取
5.4.1 接线
5.4.2 软件设置
5.4.3 效果
5.5 补充信息
6. CAN驱动在Ubuntu 16.04上开机自动配置加载
6.2 初始化配置添加方式
MPC3100(Automation PC 3100 mobile) 官方说明链接:Automation PC 3100 mobile | B&R Industrial Automation (br-automation.com)
•说明文档
oB&R Linux 10 User's manual Version: 1.04 (May 2022)
•SJA1000
oSJA1000驱动已经作为一个模块在Debian标准内核配置。
确定控制器是用于特定的硬件,看到相应的硬件用户手册。模块都是通过ISA总线连接,需要使用内核模块sja1000_isa。内核模块可以查询信息使用以下命令:
# modinfo sja1000_isa
•加载时驱动都需要特定的参数:
o端口: I / O
oindirect: 间接访问通过地址和数据端口
oirq: irq号
#> modprobe sja1000_isa port=0x384 indirect=1 irq=10
驱动加载成功,则通过 ifconfig -a 可以看到can0口
•下面的命令可以执行这个过程自动化,并使配置永久。这个启动时自动加载模块与相应的参数。(注意这里需要跟随实际Linux发行版调整)
#> echo 'options sja1000_isa port=0x384 indirect=1 irq=10' > /etc/modprobe.d/sja1000.conf
#> echo 'sja1000_isa' > /etc/modules-load.d/sja1000.conf
•可以阅读这个或类似的成功加载后的输出模块使用dmesg命令”:
...
[ 47.776948] CAN device driver interface
[ 47.778385] sja1000 CAN netdevice driver
[ 47.779589] sja1000_isa sja1000_isa.0: sja1000_isa device registered (reg_base=0x00000000c021a4d2, irq=10)
[ 47.779610] Legacy sja1000_isa driver for max. 8 devices registered ...
•列出所有网络接口。可以接口枚举,即第一个接口应该被称为can0和可以启用如下:
# ip link set can0 up type can bitrate [BITRATE_IN_BIT/S]
•例如
# ip link set can0 up type can bitrate 125000
当设置完成后,可以通过下面的命令查询 can0 设备的参数设置: ip -details link show can0
当设置完成后,可以使用下面的命令使能 can0 设备
ifconfig can0 up
在设备工作中,可以使用下面的命令来查询工作状态:
ip -details -statistics link show can0
要修改can的参数,必须先取消CAN口使能,否则会提示CAN口正在忙碌中,无法修改参数。
使用下面的命令取消 can0 设备使能: ifconfig can0 down
Socket CAN 对CAN protocol做了封装,对CAN设备的读写变成了类似tcp/ip的读写网络(socket操作)。
1.创建socket
2.bind将socket绑定can
3.设置选项setsockopt
4.read/write
CAN_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
int main()
{
int fd, nbytes;
struct sockaddr_can addr;
struct ifreq ifr;
int ret;
//1. 初始化
struct can_frame frame[4] = {{0}};
fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);//创建套接字
printf("version=6;fd=%d\n", fd);
strcpy(ifr.ifr_name, "can0" );
ioctl(fd, SIOCGIFINDEX, &ifr); //指定 can0 设备
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));//将套接字与 can0 绑定
printf("ret=%d\n", ret);
//禁用过滤规则,本进程不接收报文,只负责发送
setsockopt(fd, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
//报文1:数据帧:标准帧、ID=0x11;
frame[0].can_id = 0x11;
frame[0]. can_dlc = 1;
frame[0].data[0] = 0x12;
//报文2:数据帧:扩展帧、ID=0x22
frame[1].can_id = 0x22 | CAN_EFF_FLAG;
frame[1]. can_dlc = 1;
frame[1].data[0] = 0x34;
//报文3:远程帧:ID=0x33;
frame[2].can_id = 0x33 | CAN_RTR_FLAG;
//报文4:错误帧:ID=0x44;
frame[3].can_id = 0x44 | CAN_ERR_FLAG;
//循环发送两个报文
while(1)
{
nbytes = write(fd, &frame[0], sizeof(frame[0])); //发送 frame[0]
if(nbytes != sizeof(frame[0]))
{
printf("Send Error frame[0]\n!");
break; //发送错误,退出
}else{
printf("Send Sucess frame[0]\n!");
}
sleep(1);
nbytes = write(fd, &frame[1], sizeof(frame[1])); //发送 frame[1]
if(nbytes != sizeof(frame[1]))
{
printf("Send Error frame[1]\n!");
break;
}else{
printf("Send Sucess frame[1]\n!");
}
sleep(1);
nbytes = write(fd, &frame[2], sizeof(frame[2])); //发送 frame[1]
if(nbytes != sizeof(frame[2]))
{
printf("Send Error frame[2]\n!");
}else{
printf("Send Sucess frame[21]\n!");
}
sleep(1);
nbytes = write(fd, &frame[3], sizeof(frame[3])); //发送 frame[1]
if(nbytes != sizeof(frame[3]))
{
printf("Send Error frame[3]\n!");
break;
}else{
printf("Send Sucess frame[3]\n!");
}
sleep(1);
}
close(fd);
return 0;
}
# chmod +x *
# cc CAN_client.c
# ./a.out
注意,波特率为在Ubuntu上设置的波特率参数
“can-utils”包可以用来测试接口,可以为例。这可以从Debian软件包档案下载并安装:
# apt update
# apt install can-utils
•candump可以用来从接口,读取cansend传输和cangen把生成的消息。有关详细信息,请参见相应的手册页。
•模块可以使用Linux SocketCAN驱动程序的实现。
•有关使用的更多细节,请参阅官方文档(https://www.kernel.org/doc/html/latest/networking/can.html)。
#!/bin/sh
sudo modprobe sja1000_isa port=0x384 indirect=1 irq=10
sudo ip link set can0 up type can bitrate 125000
sudo ifconfig can0 up
参考链接:https://blog.csdn.net/chd_sun/article/details/121724458
1. 首先获得 addCAN.sh的权限 #chmod +x *
2. 将addCAN.sh copy到/etc/init.d文件夹下
3. 切换到etc/init.d文件夹下 cd /etc/init.d
4. 将脚本添加到启动脚本中去 #sudo update-rc.d addCAN.sh defaults 90
90是你设置的启动序号,号码越大执行越晚
5. 如果想要移除脚本 #sudo update-rc.d -f addCAN.sh remove