)
基于STM32的CANopen快速SDO通信前言1 快速sdo介绍2 工程配置2.1 主站词典配置2.2节点词典配置3 快速SDO调用代码4 末尾本专题相关教程基于STM32F4的CANOpen移植教程基于STM32F4的CANopen快速SDO通信linux下CANopen for python的使用基于Linux C的CANopen移植CANopen补充–时间计算出错CANopen补充–主站检测节点是否在线前言这篇教程是上一篇博客的后续 基于STM32F4的CANOpen移植教程超级详细本文配套资料下载地址https://pan.baidu.com/s/1FMp7xuJ1r3gJTPB0wf3Yrw?pwdosxs提取码osxs1 快速sdo介绍首先我们要了解快速SDO的过程。普通SDO比较麻烦也不常用这里不做介绍。只要一次传输32位4字节以下都用快速SDO即可。就对象而言主机要访问节点词典的数据因此主机是client客户端节点是server服务器。上传与下载是对服务器来说的这点和常识有点不太一样。因此上传指的是服务器发送数据给客户端下载是客户端给服务器数据。我们这里要用主机访问节点服务器2000位置的数据上传。假设这个数据是short int类型2字节16位内容为0x0003。因此发送指令为 40 00 20 00 00 00 00 00 。返回的信息不出意外应该是4B 00 20 00 03 00 00 00 读响应2字节因为我们的变量test就是16位的03是读取内容。发送帧client-server,主机-节点内容40读取指令00 20读取0x2000位置的数据00子索引这里无00 00 00 00未用补零接收帧server-client,节点-主机内容4B读响应两个字节00 20表明该数据位置为0x200000子索引这里无03 00 00 00高位在后即0x00000332 工程配置主站配置一个SDO client 终端 节点配置 一个SDO server 服务器。这里我们假设主站的id0x00,节点ID0x02我们先将上个教程移植成功的工程复制一份作为节点的工程。2.1 主站词典配置为了方便观察我们把心跳关了心跳间隔设置为0添加一个client设置client-server 和server-client 的cob id。规则如下client-server的cob idserver-client 的cob id0x600目标id0x580目标id假设需要对接的服务器id为0x02则client-server 的cob id0x6000x02server-client 的cob id 0x5800x02。主站的词典配置就成功了。点击保存与建立词典即可。2.2节点词典配置为节点新建一个词典起名Slaver。添加SDO服务器。如果已经有了就把多的删掉保留一个即可。cob id 不需要设置。它的规则如下接收cob id反馈cob id0x600自身id0x580自身id假设节点id为0x02,则如下接收cob id反馈cob id0x6020x582除此之外我们需要给节点添加一个变量方便接下来主机访问。我们个人变量所在区域在0x2000-0x5FFF区间。我们在0x2000位置建立一个变量test3。我们设置他为有符号短整形16位。内容为3。保存与建立词典到节点工程/CANopen/dictionary。并把用不上的Master词典删了打开节点工程。把Slaver.c加入CANopen_Driver去到main.h 把之前对Master.h的引用改成Slaver.h去到main.c ,修改节点id为0x02并把Master_Data 改成Slaver_Data到这一步节点工程就配置好啦。3 快速SDO调用代码 我们打开主站工程需要添加访问字节SDO的代码。 发送代码为unsignedcharget_test_datasend[8]{0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00};sendSDO(Master_Data,SDO_CLIENT,0,get_test_datasend);我们在main.c里添加每一秒发送一个SDO命令用于获取0x2000地址的变量内容。我们在CAN1.c中断里添加数据获取程序。canDispatch为CANopen的接收处理函数我们在它之前截取属于我们的信息。然后我们就可以在上位机和串口调试助手观察效果啦。我们先看时间发送到接收的间隔快接近100ms了这是因为开了串口调试。正常使用之后记得把调试宏定义注释掉。针对前三帧做一个说明串口效果如下效果与预期一样。GOOD4 末尾 到这里移植教程就结束了为了移植CANopen我花了两周时间踩了很多的坑。因此出这个教程希望后来者能少走点弯路。爱你们下一篇Linux下CANopen for python的使用