参考资源
CANopen协议栈源码:
https://github.com/CANopenNode/CANopenNode
CANopen协议栈基于STM32平台开发的demo,不过这里是基于STM32CUBEIDE开发的:
https://github.com/CANopenNode/CanOpenSTM32
协议栈的配置工具:
https://github.com/CANopenNode/CANopenEditor
00_NMT网络管理的模块控制
https://blog.csdn.net/zaichen321/article/details/128841446
安富莱电子开发板视频教程
https://www.armbbs.cn/forum.php?mod=viewthread&tid=121619&extra=page%3D1
周立功《CANopen轻松入门》
CANopen的普通SDO协议
当需要传输的值超过 32 位时,就不能使用快速 SDO 传输。必须使用普通 SDO 进行分帧传输。在应用中较少用到,一般用于 CANopen 节点的程序固件升级,或者做网关转换MVB 总线之类数据最大可达 256 位的应用。
下载协议如下图所示:
上传协议如下图所示:
CANopen配置
使用EDSEditor打开EDS文件,配置一个变量使其长度超过4字节,只有超过4个字节才能启动普通SDO的连续传输:
配置完成后导出配置文件。
测试结果
进行上传协议测试,注意续传有时间要求,即cs=40和cs=60的指令时间不能过长,否则会触发超时错误,该项具体在哪里配置还需要进一步研究:
进行下载报文测试,注意下载报文的测试中,结尾数据传送有特殊的要求:
- 需要按上传协议进行处理,如上一帧的续传命令为0x00,则结束帧的报文为0X1x,如果上一帧的续传命令为0x10,则结尾帧的报文为0x0x。
- 结束帧的帧长指的是数据+1的长度,如下图的数据发送的是0x0c0b0a0908070605,共8字节的数据,其中cs为0x00的报文发送了7个字节数据,cs为0x1D的报文中数据有效负载只有1字节,0X1D的意义是写入两字节,即结束报文描述的数据长度为有效负载+1
这里需要特别注意结束帧的数据字长问题,这也是困扰我一个上午的问题。