09 CAN
1 CAN 总线概述
CAN 总线协议(Controller Area Network,控制器局域网总线)是德国 BOSCH(博世)公司于 1986 年研发的一种串行通讯协议总线。GM-3568JHF 开发板配备了 2 路 CAN 接口,基于 RK3568J 处理器的集成 CAN 控制器实现,为工业控制、汽车电子和设备互联提供了可靠的通信解决方案。
1.1 CAN 总线技术特性
| 参数 | 规格 |
|---|---|
| 协议标准 | ISO 11898-1 (CAN 2.0A/2.0B) |
| 接口数量 | 2 路独立 CAN 接口 |
| 传输介质 | 双绞线 |
| 网络拓扑 | 总线型 |
| 传输距离 | 最大 1000 米 (5Kbps) |
| 最大节点数 | 110 个节点 |
| 数据帧长度 | 0-8 字节 |
| 仲裁机制 | 非破坏性位仲裁 |
1.2 CAN 协议特点
技术优势
- 多主机通信: 支持多个节点同时发送数据
- 非破坏性仲裁: 高优先级消息优先传输
- 错误检测: 强大的错误检测和处理机制
- 实时性强: 确定性的消息传输延迟
- 可靠性高: 差分信号传输,抗干扰能力强
应用领域
- 汽车电子: 发动机管理、车身控制、仪表系统
- 工业自动化: PLC 控制、传感器网络、执行器控制
- 医疗设备: 医疗仪器互联、监护设备通信
- 船舶系统: 导航设备、动力系统控制
- 楼宇自动化: 照明控制、空调系统、安防设备
2 GM-3568JHF CAN 接口配置
根据产品规格,GM-3568JHF 开发板提供 2 路 CAN 接口,满足多种工业应用需求。
2.1 CAN 硬件连接
开发板和外部设备 CAN 接线如下:
| 开发板 | 外部设备 |
|---|---|
| CAN_L | CAN_L |
| CAN_H | CAN_H |

2.2 CAN 通讯测试
本次测试使用 CAN 分析仪进行测试,将两个设备的 H 端和 L 端连接即可

检查接口
检查开发板 can0 和 can1 接口是否有生成
root@linaro-alip:/# ifconfig -a
can0: flags=128<NOARP> mtu 16
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 54
can1: flags=128<NOARP> mtu 16
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 55
···参数设置
开发板设置波特率并进行测试(本次以 CAN0 为测试样本)
# 将 CAN0 接口关闭
sudo ip link set can0 down
# 设置比特率为 250000
sudo ip link set can0 type can bitrate 250000
# 将CAN0 接口启用
sudo ip link set can0 up
# 发送(标准帧,数据帧,ID:7ff,date:11223344556677)
cansend can0 -i 0x7ff 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
# 接收
candump can0测试结果
- 开发板测试结果:

- CAN 分析仪测试效果:

3 CAN 网络诊断和调试
3.1 使用 cansniffer 进行网络分析
# 安装 cansniffer
sudo apt-get install can-utils
# 启动网络嗅探
cansniffer can0
# 带过滤的嗅探
cansniffer can0 -c 0x100-0x200
# 保存日志
candump can0 -L > can_log.txt3.2 网络负载测试
# 生成测试流量
cangen can0 -g 10 -I 123 -L 8
# 测试网络带宽
canbusload can0@250000
# 压力测试
for i in {1..1000}; do
cansend can0 123#DEADBEEF
done4 故障排除
4.1 CAN 接口无法启动
检查步骤:
# 检查内核模块
lsmod | grep can
# 手动加载 CAN 模块
sudo modprobe can
sudo modprobe can-raw
sudo modprobe can-dev
# 检查设备树配置
dmesg | grep can
# 检查硬件连接
cat /proc/interrupts | grep can4.2 通信错误或丢包
诊断方法:
# 检查错误统计
ip -s link show can0
# 查看错误详情
cat /proc/net/can/stats
# 检查总线状态
candump can0 -e
# 调整波特率和时序
sudo ip link set can0 type can bitrate 125000 sample-point 0.754.3 网络冲突和仲裁问题
解决方案:
# 检查网络负载
canbusload can0@250000
# 分析消息冲突
cansniffer can0 -c
# 优化消息优先级
# 使用较低的 CAN ID 获得更高优先级4.4 硬件连接问题
检查要点:
- 终端电阻: 确保网络两端有 120Ω 终端电阻
- 线缆质量: 使用双绞线,避免长距离传输
- 接地: 确保良好的信号地连接
- 电源: 检查 CAN 收发器电源供应
# 测试回环模式
sudo ip link set can0 type can bitrate 250000 loopback on
cansend can0 123#DEADBEEF
candump can0