7. CAN总线

CAN总线协议(Controller Area Network), 控制器局域网总线,是德国BOSCH(博世)公司研发的一种串行通讯协议总线, 它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。

注意

野火2024.01.25修复can/canfd概率扩展帧变成标准帧以及填充位错误的问题,如果是旧镜像使用can/canfd请在线更新内核或者安装以下内核deb,或者刷比此日期更新的镜像。

1
2
3
#在线更新内核
sudo apt update
sudo apt install linux-headers-4.19.232 linux-image-4.19.232

离线更新内核deb包:

将以上两个deb包传到板卡,使用命令 sudo dpkg -i linux*.deb 进行安装。

在线或者离线选其一即可。

7.1. CAN硬件连接

CAN模块之间接线:CAN_H接CAN_H,CAN_L接CAN_L

7.2. CAN

7.2.1. can配置

  • 开启和关闭can fd都需要重启才能生效

  1. 修改设备树插件上的时钟频率, kernel/arch/arm64/boot/dts/rockchip/overlay/rk3568-lubancat-canX-mY-overlay.dts (X,Y是各自的数字)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
/dts-v1/;
/plugin/;

#include <dt-bindings/clock/rk3568-cru.h>

/ {
    compatible = "rockchip,rk3568";

    fragment@0 {
        target = <&can1>;

        __overlay__ {
            status = "okay";
            compatible = "rockchip,rk3568-can-2.0";
            assigned-clocks = <&cru CLK_CAN1>;
            assigned-clock-rates = <200000000>;
            pinctrl-names = "default";
            pinctrl-0 = <&can1m0_pins>;
        };
    };
};
  • assigned-clock-rates时钟频率可以修改,如果CAN的比特率1M建议修改CAN时钟到300M,信号更稳定。低于1M比特率的,时钟设置200M就可以,默认使用的是200M

修改设备树插件及替换请参考: 设备树插件

  1. 开启设备树插件(这里以打开CAN1为例)

1
2
#修改配置文件
vi /boot/uEnv/uEnv.txt
  • #dtoverlay=/dtb/overlay/rk3568-lubancat-can1-m1-overlay.dtbo 前面的#删除,如下图

未找到图片

注意

can1和canfd1不能同时开启

  1. 关闭设备树插件(这里以打开CAN1为例)

  • dtoverlay=/dtb/overlay/rk3568-lubancat-can1-m1-overlay.dtbo 前面添加#,如下图

未找到图片

7.2.2. can通信测试

安装测试工具

1
2
sudo apt update
sudo apt install  can-utils

通信测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
查询当前网络设备:
ifconfig -a

CAN启动:
    关闭CAN:
    ip link set can0 down

    设置比特率500KHz:
    ip link set can0 type can bitrate 500000

    打印can0信息:
    ip -details link show can0

    启动CAN:
    ip link set can0 up

CAN发送:
    发送(标准帧,数据帧,ID:123,date:DEADBEEF):
    cansend can0 123#DEADBEEF

    发送(标准帧,远程帧,ID:123):
    cansend can0 123#R

    发送(扩展帧,数据帧,ID:00000123,date:DEADBEEF):
    cansend can0 00000123#12345678

    发送(扩展帧,远程帧,ID:00000123):
    cansend can0 00000123#R

CAN接收:
    开启打印,等待接收:
    candump can0

7.2.3. 更多指令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
关闭can设备
ip link set canX down

开启can设备
ip link set canX up

显示can设备详细信息
ip -details link show canX

接收can总线发来数据
candump canX

关闭can设备,以便配置
ifconfig canX down

设置can波特率
ip link set canX up type can bitrate 250000

发送数据
cansend canX --identifier=ID+数据

使用滤波器接收ID匹配的数据
candump canX --filter=ID:mask

7.2.4. 简单的自收发脚本

将can1和can2对接起来,配置好波特率,然后执行以下脚本,收发日志保存在/home/cat/log.txt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

#监控can0数据
candump can0 >> /home/cat/log.txt &

counter=0
while true; do
    #can0发送can0 123#00000000~123#99999999数据
    data=$(printf "%08d" $counter)
    command="cansend can0 123#$data"
    echo $command
    $command

    #can1发送can0 321#00000000~321#99999999数据
    command2="cansend can1 321#$data"
    echo $command2
    $command2

    if [ $counter -eq 99999999 ]; then
        counter=0
    else
        counter=$((counter+1))
    fi
    sleep 0.01
done

7.3. CAN FD

7.3.1. can fd配置

  • 开启和关闭can fd都需要重启才能生效

  1. 修改设备树插件上的时钟频率, kernel/arch/arm64/boot/dts/rockchip/overlay/rk3568-lubancat-canfdX-mY-overlay.dts (X,Y是各自的数字)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
/dts-v1/;
/plugin/;

#include <dt-bindings/clock/rk3568-cru.h>

/ {
    compatible = "rockchip,rk3568";

    fragment@0 {
        target = <&can1>;

        __overlay__ {
            status = "okay";
            compatible = "rockchip,canfd-1.0";
            pinctrl-names = "default";
            assigned-clocks = <&cru CLK_CAN1>;
            assigned-clock-rates = <100000000>;
            pinctrl-0 = <&can1m0_pins>;
        };
    };
};
  • assigned-clock-rates时钟频率可以修改,如果CAN的比特率低于等于3M建议修改CAN时钟到100M,信号更稳定。高于3M比特率的,时钟设置200M就可以,默认为100M

修改设备树插件及替换请参考: 设备树插件

  1. 开启设备树插件(这里以打开CAN1 FD为例)

1
2
#修改配置文件
vi /boot/uEnv/uEnv.txt
  • #dtoverlay=/dtb/overlay/rk3568-lubancat-canfd1-m1-overlay.dtbo 前面的#删除,如下图

未找到图片

注意

can1和canfd1不能同时开启

  1. 关闭设备树插件(这里以打开CANFD1为例)

  • dtoverlay=/dtb/overlay/rk3568-lubancat-canfd1-m1-overlay.dtbo 前面添加#,如下图

未找到图片

7.3.2. can fd通信测试

安装测试工具

1
2
sudo apt update
sudo apt install  can-utils

通信测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
查询当前网络设备:
ifconfig -a

CAN FD启动:
    关闭CAN:
    ip link set can0 down

    设置仲裁段1M波特率,数据段3M波特率:
    ip link set can0 type can bitrate 1000000 dbitrate 3000000 fd on

    打印can0信息:
    ip -details link show can0

    启动CAN:
    ip link set can0 up

CAN FD发送:
    发送(标准帧,数据帧,ID:123,date:DEADBEEF):
    cansend can0 123##1DEADBEEF

    发送(扩展帧,数据帧,ID:00000123,date:DEADBEEF):
    cansend can0 00000123##1DEADBEEF


CAN接收:
    开启打印,等待接收:
    candump can0

7.3.3. 更多指令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
关闭can设备
ip link set canX down

开启can设备
ip link set canX up

显示can设备详细信息
ip -details link show canX

接收can总线发来数据
candump canX

关闭can设备,以便配置
ifconfig canX down

设置仲裁段1M波特率,数据段3M波特率:
ip link set can0 type can bitrate 1000000 dbitrate 3000000 fd on

发送数据
cansend canX --identifier=ID+数据

使用滤波器接收ID匹配的数据
candump canX --filter=ID:mask