跳到主要内容

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 资料由课程工程或资料包单独提供,不放入本站文档仓库。