硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1392|回复: 14
收起左侧

[CAN/FDCAN] 【已经发布】研究了几天CANopen协议栈源码,开始操作实战,先做了个CANopen数据解码

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2023-9-10 01:30:06 | 显示全部楼层 |阅读模式

已经发布:


BSP视频教程第27期:CANopen协议栈专题,实战方式系统了解NMT,PDO,SDO,时间戳,同步报文,紧急报文等(2023-10-17)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=121438



先熟悉下NMT网络主从管理,主要是命令状态控制,心跳包等,当前先给TOOL的CAN助手做了个CANopen数据解码展示

1235.png

评分

参与人数 1金币 +20 收起 理由
byccc + 20 很给力!

查看全部评分

回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-9-10 12:27:32 | 显示全部楼层
大佬,我也准备用这个,目前移植了官方的例程,上电后就抓到一条数据
微信截图_20230910122601.png
是因为没有主站的原因吗?大佬能分享一下CANOpenNode做为主站要怎么弄吗?我想用单片机做主站和从站
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2023-9-11 00:10:31 | 显示全部楼层
kenn 发表于 2023-9-10 12:27
大佬,我也准备用这个,目前移植了官方的例程,上电后就抓到一条数据

是因为没有主站的原因吗?大佬能分 ...

TOOL是作为数据监控存在的,监控CAN总线上CANopen格式数据。

通过LUA脚本解析实现,后面TOOL固件升级将分享给大家,还有两期CANopen协议栈专题视频教程也将一并分享。
回复

使用道具 举报

0

主题

25

回帖

25

积分

新手上路

积分
25
发表于 2023-9-11 14:43:35 | 显示全部楼层
硬汉哥,发现H7Tool检测can数据时,120欧如果不接收不到数据。同样用usb CAN分析器没这个问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2023-9-11 14:59:08 | 显示全部楼层
mrgoodman 发表于 2023-9-11 14:43
硬汉哥,发现H7Tool检测can数据时,120欧如果不接收不到数据。同样用usb CAN分析器没这个问题。

CAN/CANFD测试阶段,至少一端要带终端电阻,都不带是无法正常通信的。

TOOL端是没有带终端电阻的,你的板子上一定要带,如果你的板子也没有带是无法正常通信的。

回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2023-9-12 11:34:32 | 显示全部楼层
eric2013 发表于 2023-9-11 00:10
TOOL是作为数据监控存在的,监控CAN总线上CANopen格式数据。

通过LUA脚本解析实现,后面TOOL固件升级 ...

能做视频就非常给力,入门会更方便。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2023-9-12 11:34:49 | 显示全部楼层
CANopen仅看文档,太枯燥。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2023-9-15 00:34:51 | 显示全部楼层
CANopen节点状态切换控制和报文解析也做好了


初步效果,剩下开始PDO和SDO的控制实现。


回复

使用道具 举报

38

主题

292

回帖

406

积分

高级会员

积分
406
发表于 2023-9-15 08:36:20 | 显示全部楼层
eric2013 发表于 2023-9-15 00:34
CANopen节点状态切换控制和报文解析也做好了

这个CAN协议栈的代码质量看着挺不错的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2023-9-16 00:34:01 | 显示全部楼层
词典工具也会简单的操作了


123.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2023-9-17 07:56:45 | 显示全部楼层
2023-09-17

SDO客户端服务器通信模式和数据解析已经搞好:


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2023-9-19 07:16:14 | 显示全部楼层
通过TOOL这里的LUA脚本解析:



协议:


[Lua] 纯文本查看 复制代码
elseif(g_id == 0x0600) then
		g_id = id & 0x007F
		s0 = string.format("SDO客户端向服务器节点ID:0x%02x发送报文, ", g_id)
		if(bin[1] == 0x2F) then
			s1 = string.format("SDO命令0x%02x写一个字节数据, 索引0x%04x, 子索引0x%02x, 写对象字典0x%02x, 0x%02x, 0x%02x, 0x%02x",
								bin[1], bin[3]*256 +bin[2], bin[4], bin[5], bin[6], bin[7], bin[8])                 
		elseif (bin[1] == 0x2B) then
			s1 = string.format("SDO命令0x%02x写两个字节数据, 索引0x%04x, 子索引0x%02x, 写对象字典0x%02x, 0x%02x, 0x%02x, 0x%02x",
								bin[1], bin[3]*256 +bin[2], bin[4], bin[5], bin[6], bin[7], bin[8])
		elseif (bin[1] == 0x27) then
			s1 = string.format("SDO命令0x%02x写三个字节数据, 索引0x%04x, 子索引0x%02x, 写对象字典0x%02x, 0x%02x, 0x%02x, 0x%02x",
								bin[1], bin[3]*256 +bin[2], bin[4], bin[5], bin[6], bin[7], bin[8])
		elseif (bin[1] == 0x23) then
			s1 = string.format("SDO命令0x%02x写四个字节数据, 索引0x%04x, 子索引0x%02x, 写对象字典0x%02x, 0x%02x, 0x%02x, 0x%02x",
								bin[1], bin[3]*256 +bin[2], bin[4], bin[5], bin[6], bin[7], bin[8])
		elseif (bin[1] == 0x40) then
			s1 = string.format("SDO写命令0x%02x读取数据, 索引0x%04x, 子索引0x%02x",
								bin[1], bin[3]*256 +bin[2], bin[4])
		end
	elseif(g_id == 0x0580) then
		g_id = id & 0x007F
		s0 = string.format("SDO服务器节点ID:0x%02x向客户端回复报文, ", g_id)
		if(bin[1] == 0x4F) then
			s1 = string.format("SDO响应命令0x%02x一个字节数据, 索引0x%04x, 子索引0x%02x, 读对象字典0x%02x",
								bin[1], bin[3]*256 +bin[2], bin[4], bin[5])                 
		elseif (bin[1] == 0x4B) then
			s1 = string.format("SDO响应命令0x%02x两个字节数据, 索引0x%04x, 子索引0x%02x, 读对象字典0x%02x, 0x%02x",
								bin[1], bin[3]*256 +bin[2], bin[4], bin[5], bin[6])
		elseif (bin[1] == 0x47) then
			s1 = string.format("SDO响应命令0x%02x三个字节数据, 索引0x%04x, 子索引0x%02x, 读对象字典0x%02x, 0x%02x, 0x%02x",
								bin[1], bin[3]*256 +bin[2], bin[4], bin[5], bin[6], bin[7])
		elseif (bin[1] == 0x43) then
			s1 = string.format("SDO响应命令0x%02x四个字节数据, 索引0x%04x, 子索引0x%02x, 读对象字典0x%02x, 0x%02x, 0x%02x, 0x%02x",
								bin[1], bin[3]*256 +bin[2], bin[4], bin[5], bin[6], bin[7], bin[8])
		elseif (bin[1] == 0x60) then
			s1 = string.format("SDO响应命令0x%02x写成功, 索引0x%04x, 子索引0x%02x",
								bin[1], bin[3]*256 +bin[2], bin[4])
		elseif (bin[1] == 0x80) then
			s1 = string.format("SDO响应异常")
		end
	end








回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2023-9-21 07:22:51 | 显示全部楼层
H7-TOOL的CANopen PDO映射功能,初步也正常了


PDO玩法不少,支持的参数玩法也多,逐步全完善下,下面是初步的PDO映射实现



字典设置:

回复

使用道具 举报

0

主题

25

回帖

25

积分

新手上路

积分
25
发表于 2023-9-21 14:29:37 | 显示全部楼层
硬汉哥不错,我前段时间被can虐完了,感觉凑合。把ZLG那本入门手册反复领悟,基本上没啥难度。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2023-9-22 08:01:50 | 显示全部楼层
CANopen PDO的TPDO和RPDO测试结束,至此CANopen的基础数据接卸都已经完成。剩下就是把现有的功能加强完善下即可收尾发布首版CANopen解析


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 22:16 , Processed in 0.254651 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表