当前位置: 首页 > news >正文

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

基于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?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 idserver->client 的cob id
0x600+目标id0x580+目标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+自身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的代码。

​ 发送代码为

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了,这是因为开了串口调试。正常使用之后,记得把调试宏定义注释掉。

针对前三帧做一个说明:

串口效果如下:


效果与预期一样。GOOD!

4 末尾

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

http://www.cnnetsun.cn/news/1351772.html

相关文章:

  • 【UART】Verilog实现UART接收和发送模块
  • 实战案例:使用混合推理打造高性能AI原生应用
  • VMware Horizon 8安装部署(一)AD域的安装
  • 主板STM32,GD32等MCU电路设计思维-状态提示
  • Qt 中多媒体模块的使用
  • 探索音乐创新:PedalinoMini™ —— 蓝牙WiFi MIDI控制器
  • 爬虫 APP 逆向 ---> 粉笔考研
  • AtomPePacker 开源项目教程
  • 北航论文格式零失误:BUAAthesis模板中图表、公式与代码块的规范使用
  • 从明文暴露到安全存储:Keyring彻底解决Python密码管理痛点
  • PDF4QT命令行工具详解:自动化处理PDF文档的实用技巧
  • java基于微信小程序的陕西省红色旅游管理系统_dkv6632x
  • leetcode153.寻找旋转排序数组中的最小值
  • MySQL数据库初体验
  • 【即插即用完整代码】CVPR 2026新方法归一化空间与通道注意力,无额外参数,轻量且高效,超越CBAM,快速涨点,发表论文!
  • BetterNCM 插件导致网易云音乐启动失败问题分析
  • Camera:实时监控与数据交互的智能设备服务
  • 事件日志清理与痕迹擦除:wmiexec-Pro的eventlog模块深度应用
  • 告别厂商限制:Tuya TH05Z温湿度传感器接入Zigbee2MQTT完全指南
  • 复购率不理想如何用产品线组合提升长期价值
  • SimpleMem快速上手指南:5分钟搭建LLM智能体记忆系统
  • 基于LangChain的RAG与Agent智能体开发 - 使用LangChain调用大语言模型
  • MiniChain与Hugging Face Datasets:实现高效文档嵌入与相似度搜索的完整指南
  • Deepagents数据可视化:展示AI代理工作成果的终极指南
  • LDNetDiagnoService_IOS架构解析:Ping与Traceroute原理在iOS中的实现
  • 突破Ebitengine着色器限制:多重赋值问题的优雅解决方案
  • 告别繁琐切换!Micro编辑器智能文件类型识别功能详解:让编码效率提升300%的秘诀
  • STK信号处理秘籍:BiQuad滤波器与Chorus效果的应用技巧
  • Python入门:Python3 Pickle模块全面学习教程
  • Deepagents边境安全:监控边境活动的AI代理