跳到主要内容

CAN 与 CANopen 实战教程

25 节主线课程 · 9 个独立参考工程 · 循序渐进

先准备可重复的开发环境,再学习 Classical CAN 与 CANopen;最后接入官方协议栈,在明确的安全边界内完成 CiA 402 电机控制。

建议的学习顺序

第一次学习时,建议按课程编号依次进行。每篇页头会标明硬件要求、配套 Demo,以及本课是否会写入电机参数或使电机运动;如果某一步的结果与文档不一致,请先停在当前步骤排查,确认无误后再继续下一课。

这套课程教授通用 CAN、CANopen 和 CiA 402。ESP32-C3、TJA1050 和 IG35EC020 是用于观察和验证协议的实验平台,不是课程知识的适用边界。

学习者起点

课程不假设你已经安装了正确版本的 ESP-IDF,也不假设你会创建标准工程。只要你使用过终端、见过简单 C 代码,就可以从第 00 课开始。

第一部分:准备一套可重复的实验环境

课程学完能做什么状态
00. 开始之前知道从哪里开始,以及遇到问题时怎样保留信息已完成
01. 准备 ESP-IDF v5.5.4根据网络情况取得源码,安装、切换并验证固定 IDF 环境已完成,国内路线已在 Ubuntu 24.04 验证
02. 创建标准 ESP-IDF 工程从空目录创建、构建、烧录最小工程已完成

完成普通 ESP-IDF 工程后,先进入 CAN 基础,再接触实验硬件。

第二部分:学习并验证 Classical CAN

课程学完能做什么状态
03. CAN 是什么拆出一帧报文的 CAN-ID、DLC、DATA已完成
04. 实验平台与 CAN 接线认识器材,并从原理图和手册完成接线与 60Ω 检查已完成
05. CAN 报文、仲裁与 ACK理解完整帧、无损仲裁以及 ACK 能证明什么已完成
06. 用 ESP32-C3 接收第一帧 CAN 报文从空工程写出 TWAI 接收程序,并由 Node-ID 算出实测的 0x701已完成

第三部分:学习并验证 CANopen

课程学完能做什么状态
07. CANopen 是什么从实测 0x701 理解 CANopen、Node-ID 和 COB-ID已完成
08. 怎样读 CiA 规范编号区分 CiA 301、设备规范和版本号,知道 401 与 402 分别适用于什么设备已完成
09. NMT、Boot-up 和 Heartbeat识别启动通知,实测周期在线状态,并区分 NMT 与电机状态已完成
10. 对象字典、数据类型和小端序根据 Index 和 Sub-index 找到参数,正确解释数据类型和小端序已完成
11. 用 SDO 读取电机参数从空工程写出只读 SDO Client,读取标准对象并处理 Abort已完成
12. SDO 查询与 PDO 传输从真实 SDO 报文看出连续查询的重复内容,理解 PDO 要解决什么问题已完成
13. TPDO 与 RPDO站在具体设备的角度判断 PDO 方向,并计算第一组 PDO 的默认 CAN-ID已完成
14. 读取电机的 PDO 配置用只读 SDO 实测电机 PDO 的 CAN-ID、启用状态和 DATA 排列已完成

这三课先看见 SDO 重复了什么,再认识 PDO 的方向,最后只读真实配置。由于厂家资料没有给出完整 PDO 修改和保存规则,课程不为演示而试写电机 PDO;第 18 课改用可控的 ESP32 本地节点验证周期 TPDO。

第四部分:使用官方 CANopenNode

课程学完能做什么状态
15. 从手写报文到 CANopenNode分清应用、协议栈、TWAI 驱动和物理层的职责已完成
16. 创建 CANopenNode Heartbeat 节点从标准工程创建 Node 0x20,目标是实测 0x720 Boot-up 和 Heartbeat已上板,待独立抓包
17. CANopenNode 对象字典与主循环找到 OD、CO_process() 和 PDO 实时处理入口已完成
18. 发送第一条本地 TPDO将本地 0x2000:00 计数器映射到 0x1A0,不修改电机已上板,待独立抓包
19. 用 CANopenNode 读取电机使用官方 SDO Client 重做标准对象只读访问已完成
20. 电机 Heartbeat 监视与组件限制理解官方 Consumer、组件 0.1.0 限制和当前应用层方案已完成

第五部分:认识并安全控制电机

课程学完能做什么状态
21. 从厂家资料认识 IG35EC020找到供电、接口、单位和报警信息,分清已有依据与缺失资料已完成
22. 读懂 CiA 402 电机状态用掩码从真实 Statusword 判断状态,并区分 NMT 状态已完成
23. 使能电机但不运动每写一步 Controlword 都读回 Statusword,不设置运动目标已完成
24. Profile Position 位置运动理解 counts、圈数和角度,完成小距离往返并读取实际位置已完成

排错专题

排错内容在相应现象已经出现后再学习,不插入 PDO 和协议栈的主线中。

专题学完能做什么状态
CAN 错误计数与 Bus-Off根据 TEC、REC、Error Passive 和 Bus-Off 定位接线、位速率或总线故障已完成
SDO Abort 与超时区分对象不存在、权限错误、响应不匹配和节点离线已完成
怎样整理抓包与串口日志从 CAN-ID、时间和请求响应关系还原一次通信过程已完成

不要从最终工程倒着学

配套 Demo 由课程工程单独提供,其中各实验工程相互独立、逐步增加功能。本网站仓库只存放文档与文档图片,不包含 Demo。初学阶段不要使用包含 SDO、CiA 402 使能和位置运动的完成版程序做纯 CAN 实验,这样失败时才能判断问题属于哪一步。

“已上板,待独立抓包”表示固件已经在开发板上启动,但仅凭程序自己的串口说明,不能证明它声明的 CAN-ID 和周期确实出现在总线上。此类发送实验还要由另一台 CAN 接收设备完成独立观察,才能改为“已完成”。

课程外参考资料

  • 速查资料:CAN-ID、SDO 命令字、Abort Code、对象索引等速查。
  • docs/images/sources/:从原始原理图和厂家手册导出的截图,以及各课硬件验证记录。
  • 配套 Demo、硬件手册和 PDF 资料由课程工程或资料包单独提供,不放入本站文档仓库。