基于STM32F4的CANopen快速SDO通信(超级详细)

本专题相关教程:

基于STM32F4的CANOpen移植教程

基于STM32F4的CANopen快速SDO通信

linux下CANopen for python的使用

基于Linux C的CANopen移植

CANopen补充–时间计算出错

CANopen补充–主站检测节点是否在线

前言

这篇教程是上一篇博客的后续 基于STM32F4的CANOpen移植教程(超级详细)
本文配套资料下载地址:https://pan.baidu.com/s/1FMp7xuJ1r3gJTPB0wf3Yrw?pwd=osxs
提取码:osxs

在这里插入图片描述

1 快速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表明该数据位置为0x2000
00子索引,这里无
03 00 00 00高位在后,即0x000003=3

2 工程配置

主站配置:一个SDO client (终端) 节点配置: 一个SDO server (服务器)。 这里,我们假设主站的id=0x00,节点ID=0x02

我们先将上个教程移植成功的工程复制一份作为节点的工程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ivbvuYL8-1646311122624)(C:\Users\FEN\AppData\Roaming\Typora\typora-user-images\image-20220303173846476.png)]

2.1 主站词典配置

为了方便观察,我们把心跳关了(心跳间隔设置为0);
在这里插入图片描述

添加一个client

在这里插入图片描述

设置client->server 和server->client 的cob id。规则如下

client->server的cob idserver->client 的cob id
0x600+目标id0x580+目标id

假设需要对接的服务器id为0x02,则

client->server 的cob id:0x600+0x02,

server->client 的cob id :0x580+0x02。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uy8bOhF4-1646310782734)(C:\Users\FEN\AppData\Roaming\Typora\typora-user-images\image-20220303170300506.png)]

主站的词典配置就成功了。点击保存,与建立词典即可。

在这里插入图片描述

2.2节点词典配置

为节点新建一个词典,起名Slaver。
在这里插入图片描述

添加SDO服务器。如果已经有了就把多的删掉,保留一个即可。
在这里插入图片描述
在这里插入图片描述
cob id 不需要设置。它的规则如下:

接收cob id反馈cob id
0x600+自身id0x580+自身id

假设节点id为0x02,则如下:

接收cob id反馈cob id
0x6020x582

除此之外,我们需要给节点添加一个变量,方便接下来主机访问。

我们个人变量所在区域在0x2000-0x5FFF区间。我们在0x2000位置,建立一个变量test=3。
在这里插入图片描述

在这里插入图片描述
我们设置他为有符号短整形(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的代码。

​ 发送代码为

unsigned char get_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了,这是因为开了串口调试。正常使用之后,记得把调试宏定义注释掉。
在这里插入图片描述

针对前三帧做一个说明:
在这里插入图片描述
在这里插入图片描述

串口效果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PE69pCIV-1646310782742)(C:\Users\FEN\AppData\Roaming\Typora\typora-user-images\image-20220301161150225.png)]
效果与预期一样。GOOD!

4 末尾

​ 到这里移植教程就结束了,为了移植CANopen,我花了两周时间,踩了很多的坑。因此出这个教程,希望后来者能少走点弯路。爱你们
下一篇:Linux下CANopen for python的使用

  • 38
    点赞
  • 143
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值