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