基于STM32的CANopen快速SDO通信
本专题相关教程:
前言
这篇教程是上一篇博客的后续 基于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
我们先将上个教程移植成功的工程复制一份作为节点的工程。
2.1 主站词典配置
为了方便观察,我们把心跳关了(心跳间隔设置为0);
添加一个client
设置client->server 和server->client 的cob id。规则如下
client->server的cob id | server->client 的cob id |
---|---|
0x600+目标id | 0x580+目标id |
假设需要对接的服务器id为0x02,则
client->server 的cob id:0x600+0x02,
server->client 的cob id :0x580+0x02。
主站的词典配置就成功了。点击保存,与建立词典即可。
2.2节点词典配置
为节点新建一个词典,起名Slaver。
添加SDO服务器。如果已经有了就把多的删掉,保留一个即可。
cob id 不需要设置。它的规则如下:
接收cob id | 反馈cob id |
---|---|
0x600+自身id | 0x580+自身id |
假设节点id为0x02,则如下:
接收cob id | 反馈cob id |
---|---|
0x602 | 0x582 |
除此之外,我们需要给节点添加一个变量,方便接下来主机访问。
我们个人变量所在区域在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了,这是因为开了串口调试。正常使用之后,记得把调试宏定义注释掉。
针对前三帧做一个说明:
串口效果如下:
效果与预期一样。GOOD!
4 末尾
到这里移植教程就结束了,为了移植CANopen,我花了两周时间,踩了很多的坑。因此出这个教程,希望后来者能少走点弯路。爱你们
下一篇:Linux下CANopen for python的使用