Skip to content

SocketCAN 配置

核心概念

CAN 接口

Linux 系统中将 CAN 设备映射为网络接口(如 can0、can1),可通过标准网络命令(ip、ifconfig)进行管理,与以太网接口管理方式类似。

环境准备

安装所需的工具:

sudo apt install iproute2

内核支持检查

首先确认内核是否启用SocketCAN模块,可通过lsmod命令查看:

# 检查 CAN 核心模块
lsmod | grep can
# 若未加载,手动加载核心模块
sudo modprobe can
sudo modprobe kcan # KH-UCANFD 驱动

lsmod

设备识别

连接 CAN 设备后,通过以下命令确认设备是否被识别:

# 查看 USB 设备(USB-CAN 适配器)
lsusb -t | grep -i can

# 查看网络接口(CAN 设备映射为网络接口)
ip link show | grep can

lsusb

设备配置

CAN 设备使用前需配置波特率、工作模式等参数,核心命令如下:

# 1. 关闭 CAN 接口(配置前需确保接口未启用)
sudo ip link set can0 down

# 2. 配置参数
# 示例一:配置波特率为1M
sudo ip link set can0 type can bitrate 1000000
# 示例二:配置仲裁段波特率1M,数据段波特率5M,开启 CAN FD 模式
sudo ip link set can0 type can bitrate 1000000 dbitrate 5000000 fd on
# 示例三:配置仲裁段波特率1M采样75%,数据段波特率5M采样点80%,开启 CAN FD 模式
sudo ip link set can0 type can bitrate 1000000 sample-point 0.75 dbitrate 5000000 dsample-point 0.8 fd on

# 3. 启用 CAN 接口
sudo ip link set can0 up

# 4. 验证配置结果
ip -d link show can0

set

接口状态

配置完成后,通过 ip 和 ifconfig 命令查看接口状态,获取更详细的设备运行信息。 通过以下命令查看 CAN 设备的状态、错误计数、数据收发情况等核心信息,是设备调试的重要手段。

bash
# 方法1:ip命令查看设备详细状态(含波特率、错误状态、驱动等)
ip -d link show

# 方法2:ifconfig命令查看收发统计(含包数量、错误数等)
ifconfig -a

ip -d link show 输出示例

can0: <NOARP,UP,LOWER_UP> mtu 72 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10  # can0 CAN FD 模式 启用状态
    link/can  promiscuity 0 minmtu 0 maxmtu 0 
    can <FD> state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 
          bitrate 1000000 sample-point 0.750 
          tq 12 prop-seg 29 phase-seg1 30 phase-seg2 20 sjw 10
          kcan: tseg1 1..256 tseg2 1..128 sjw 1..128 brp 1..1024 brp-inc 1
          dbitrate 8000000 dsample-point 0.700 
          dtq 12 dprop-seg 3 dphase-seg1 3 dphase-seg2 3 dsjw 1
          kcan: dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..1024 dbrp-inc 1
          clock 80000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
can1: <NOARP> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10 # can1 CAN 2.0B 模式 未启用状态
    link/can  promiscuity 0 minmtu 0 maxmtu 0 
    can state STOPPED (berr-counter tx 0 rx 0) restart-ms 0 
          kcan: tseg1 1..256 tseg2 1..128 sjw 1..128 brp 1..1024 brp-inc 1
          kcan: dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..1024 dbrp-inc 1
          clock 80000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

关键状态解读

状态字段含义说明
state UP/DOWNUP:接口已启用;DOWN:接口未启用
ERROR-ACTIVE正常工作状态,错误计数器值较低
ERROR-PASSIVE被动错误状态,错误计数器超过127
BUS-OFF总线关闭状态,错误计数器超过255,无法通信
STOPPED接口停止工作
berr-counter tx/rx发送/接收错误计数器,值越高说明总线干扰越大
mtu 72CAN FD 模式(最大传输单元72字节)
mtu 16CAN 2.0 模式(最大传输单元16字节)

ifconfig -a 输出示例及解读

can0: flags=193<UP,RUNNING,NOARP>  mtu 72
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 8423  bytes 67384 (67.3 KB)  # 接收数据包数量及字节数
        RX errors 0  dropped 0  overruns 0  frame 0  # 接收错误、丢包等统计
        TX packets 8407  bytes 67256 (67.2 KB)  # 发送数据包数量及字节数
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0  # 发送错误、丢包等统计

错误计数器规则

  • 发送错误时,TEC(发送错误计数器)+8
  • 接收错误时,REC(接收错误计数器)+1
  • 成功发送时,TEC-1
  • 成功接收时,REC-1

常见错误及处理

BUS-OFF 错误恢复

当CAN设备进入 BUS-OFF 状态时,会直接影响通信,需及时排查处理。通过 ip -d link show 可快速定位错误类型。

bash
# BUS-OFF错误状态示例
can <FD> state BUS-OFF (berr-counter tx 248 rx 127) restart-ms 0

原因分析

  • 总线持续存在严重干扰
  • 总线短路或断路
  • 波特率配置不匹配
  • 终端电阻配置错误
  • 线缆质量问题

恢复方法

bash
# 1. 重启CAN设备以恢复正常状态
sudo ip link set can0 down
sudo ip link set can0 up

驱动智能连接,赋能科技未来