硬汉嵌入式论坛

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

[LUA教程] H7-TOOL的LUA小程序教程第13期:CAN/CANFD总线操作说明,支持和CAN助手同时使用,方便实现各种复杂逻辑2024-08-12

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115456
QQ
发表于 2024-8-6 01:46:09 | 显示全部楼层 |阅读模式
注:2.26版本固件即将发布,推荐升级到2.26版本后操作本贴功能

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用,支持在线调试运行,支持离线运行。TOOL的LUA教程争取做到大家可以无痛调用各种功能函数,不需要学习成本。


功能特性:

1、支持经典CAN和CANFD。
2、支持CAN助手和CAN LUA同时使用,让CAN检测更灵活,更随心所欲。
3、可设置固定波特率20K,25K,50K,80K,100K,125K,250K,500K,1M,2M,5M,8M。
4、可以自定义波特率,即CAN主频,SWJ,  TS1,TS2的参数设置。
5、支持波形展示。
6、TOOL上电后,首界面的电压不要低于4.7x.
7、支持USB,以太网和WiFi方式以及局域网外网的上位机控制,支持离线控制运行。
8、对于经典CAN和低速CANFD, 至少一个节点要带终端电阻。高速CANFD(5M,8M测试),两端的终端电阻最好都加上。

对于TOOL,本身是不带终端电阻的,不过可以方便在转接板背面的CANL和CANH之间焊接120Ω的终端电阻



LUA函数说明:

1、CAN初始化函数

can_bus(”open“, 参数2, 参数3, 参数4,  参数5)

第1个参数 :
      open,close,send,recive

第2个参数
    0 表示FDCAN_FRAME_CLASSIC,即经典CAN
    1 表示FDCAN_FRAME_FD_NO_BRS,即CANFD,仲裁段波特率和数据段波特率一样
    2 表示FDCAN_FRAME_FD_BRS,即CANFD,仲裁段波特率和数据段波特率不一样

第3个参数,支持的数据个数
    可以设置8,12,16,20,24,32,48,64

第4个参数,仲裁阶段波特率
    可以设置20K,25K,50K,80K,100K,125K,250K,500K,1M。
    注意填写的时候,填写实际数值大小,比如500K就是500000。

第5个参数,数据阶段波特率
    可以设置20K,25K,50K,80K,100K,125K,250K,500K,1M,2M,5M,8M。
    注意:(1)填写的时候,填写实际数值大小,比如1M就是1000000。
             (2)还有就是,如果设置了使用经典CAN,那么第5参数将不起作用。
   
举例1:
比如设置使用经典CAN,数据个数8,CAN速度1M,那么配置就是
can_bus("open", 0, 8, 1000000, 1000000)   -- 第5个参数用不到,不起作用。

举例2:
比如设置使用CANFD,数据个数16,CAN仲裁阶段波特率1M,通信阶段波特率2M,那么配置就是
can_bus("open", 0, 8, 1000000, 2000000)   

2、CAN发送函数
can_bus("send", 参数2, 参数3, 参数4, 参数5)

第1个参数
    open,close,send,recive

第2个参数
    ID类型,0表示标准ID,1表示扩展ID

第3个参数
    0表示数据帧,1表示遥控帧

第4个参数
    ID数值

第5个参数
    发送的数据,可以发送字符串比如"12345678",  如果要发送实际数值0,1,2,3,4,5,6,7,可以转义字符比如"\x00\x01\02\x03\x04\x05\x06\x07"

举例:
标志ID,数据帧,ID数值0x222,  发送数据0,1,2,3,4,5,6,7
can_bus("send", 0, 0, 0x222, "\x00\x11\x22\x33\x44\x55\x66\x77")

3、CAN接收函数

返回值1, 返回值2, 返回值3, 返回值4, 返回值5 = can_bus ("recive", 参数2)

返回值1:
返回的数字是字符串方式的,如果要数值方式可以使用LUA函数string.byte转换下,也可以直接调用print_hex打印出来

返回值2:
返回数据长度

返回值3:
ID数值

返回值4:
ID类型,0x00000000表示数据帧,0x20000000表示遥控帧

返回值5:
0表示返回失败,1表示返回成功。

参数2:
表示等待超时时间,单位ms,比如设置5000,  等待5秒内没有收到数据,将立即返回。


4、CAN关闭函数

can_bus("close")   

直接调用这个函数即可。

【实际操作举例】

硬件连接:



经典CAN举例:

配置经典CAN,1M,标准ID 0x222,  向目标板发送数据0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,等待目标板返回数据超时时间5000ms

实现代码如下:

[Lua] 纯文本查看 复制代码
can_bus("open", 0, 8, 1000000, 1000000) 
can_bus("send", 0, 0, 0x222, "\x00\x11\x22\x33\x44\x55\x66\x77")
data,len,id,idtype, re = can_bus ("recive", 5000)

if(re == 1) then
  print("返回数据:")
  print_hex(data)
  print(string.format("数据长度:%d,CAN ID: 0x%x,ID类型:%x", data, len, id, idtype))
else
   print("返回数据失败")
end


23.png

CANFD举例:

配置CANFD,仲裁1M+数据2M,等待目标板返回数据超时时间5000ms

实现代码如下:

[Lua] 纯文本查看 复制代码
can_bus("open", 2, 16, 1000000, 8000000) 
data,len,id,idtype, re = can_bus ("recive", 5000)

if(re == 1) then
  print("返回数据:")
  print_hex(data)
  print(string.format("数据长度:%d,CAN ID: 0x%x,ID类型:%x", len, id, idtype))
else
   print("返回数据失败")
end


2367.png

【CAN助手和LUA同时使用】

通过这种方式,更加灵活,更加随心所欲。

配置经典CAN,1M,标准ID 0x222,  向目标板发送数据0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,等待目标板返回数据超时时间5000ms

1、先配置:

267.png

2、添加LUA代码,仅需添加发送和接收处理即可,不需要再做初始化,因为第1步已经配置

[Lua] 纯文本查看 复制代码
can_bus("send", 0, 0, 0x222, "\x00\x11\x22\x33\x44\x55\x66\x77")
data,len,id,idtype, re = can_bus ("recive", 5000)


2345.png

【CAN Bootloader案例】

1、【实战技能】单片机bootloader的CANFD,I2C,SPI和串口方式更新APP视频教程(2022-08-01)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=114491

2、CANFD/CAN Bootloader案例下载和文字版操作说明
https://www.armbbs.cn/forum.php?mod=viewthread&tid=113770





评分

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

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115456
QQ
 楼主| 发表于 2024-8-12 02:56:48 | 显示全部楼层
整理完毕。
回复

使用道具 举报

0

主题

110

回帖

110

积分

初级会员

积分
110
发表于 2024-8-12 09:47:46 | 显示全部楼层

终于发布了,等了好久了
回复

使用道具 举报

36

主题

2050

回帖

2158

积分

至尊会员

积分
2158
发表于 2024-8-15 10:54:59 | 显示全部楼层
建议把错误状态信息返回,过滤设置也组成API,这样使用就更方便了。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115456
QQ
 楼主| 发表于 2024-8-15 11:12:43 | 显示全部楼层
byccc 发表于 2024-8-15 10:54
建议把错误状态信息返回,过滤设置也组成API,这样使用就更方便了。

所言甚是,下次升级加上。
回复

使用道具 举报

0

主题

110

回帖

110

积分

初级会员

积分
110
发表于 2024-8-26 08:49:12 | 显示全部楼层
测量了,好用。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115456
QQ
 楼主| 发表于 2024-9-14 08:02:10 | 显示全部楼层
再增加几个新的LUA函数,错误状态反馈,硬件过滤等。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-10-15 19:29:19 | 显示全部楼层
硬汉歌,can接收窗口能不能按TX,rx ,ID来过滤报文吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115456
QQ
 楼主| 发表于 2024-10-16 09:58:24 | 显示全部楼层
zhangfangmcu 发表于 2024-10-15 19:29
硬汉歌,can接收窗口能不能按TX,rx ,ID来过滤报文吗?

看看这个满足你的需求不

制作个简易的H7-TOOL CANFD助手区分不同ID,在不同窗口展示的脚本
https://www.armbbs.cn/forum.php? ... 0472&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115456
QQ
 楼主| 发表于 2025-2-23 06:00:12 | 显示全部楼层
备份个双机测试代码


优先执行这个

[Lua] 纯文本查看 复制代码
can_bus("open", 0, 8, 1000000, 1000000)

while(1) do
  data,len,id,idtype, re = can_bus ("recive", 10000)
  
  if(re == 1) then
    print("返回数据:")
    print_hex(data)
    print(string.format("数据长度:%d,CAN ID: 0x%x,ID类型:%x, %d", len, id, idtype, re))

    re = can_bus("send", 0, 0, 0x111, "\x00\x11\x22\x33\x44\x55\x66\x77")
    print_hex(re)

  else
    print("返回数据失败")
  end
end


然后这个:
[Lua] 纯文本查看 复制代码
can_bus("open", 0, 8, 1000000, 1000000)

while(1) do
  re = can_bus("send", 0, 0, 0x222, "\x00\x11\x22\x33\x44\x55\x66\x77")
  print_hex(re)
  data,len,id,idtype, re = can_bus ("recive", 10000)
 
  if(re == 1) then
    beep()
    print("返回数据:")
    print_hex(data)
    print(string.format("数据长度:%d,CAN ID: 0x%x,ID类型:%x, %d", len, id, idtype, re))
  else
    print("返回数据失败")
  end

end 



回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 02:29 , Processed in 0.287102 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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