高效低门槛!基于LuatOS的CAN总线通信解决方案

基于合宙LuatOS的CAN操作库,为开发者提供了一套高效、低门槛的CAN总线通信解决方案。

今天我们将以合宙主推型号Air780EPM模组为例,分享CAN操作库相关内容。

1、 Can操作库常量定义 -   

1.1 CAN工作模式常量

  • can.MODE_NORMAL:

    正常工作模式;

  • can.MODE_LISTEN:

    监听模式(仅接收,不发送);

  • can.MODE_TEST:

    自测模式(自收自发);

  • can.MODE_SLEEP:

    休眠模式。

1.2 CAN状态常量

  • can.STATE_STOP:

    停止工作状态;

  • can.STATE_ACTIVE:

    主动错误状态(一般情况下为该状态);

  • can.STATE_PASSIVE:

    被动错误状态(总线上错误较多时进入,但仍可正常收发);

  • can.STATE_BUSOFF:

    离线状态(总线错误非常多,不能收发,需手动退出);

  • can.STATE_LISTEN:

    监听状态(选择监听模式时进入);

  • can.STATE_TEST:

    自收自发状态(选择自测模式时进入);

  • can.STATE_SLEEP:

    休眠状态(选择休眠模式时进入)。

1.3 回调消息类型常量

  • can.CB_MSG:

    有新数据写入缓存;

  • can.CB_TX:

    数据发送完成(需通过param判断成功/失败);

  • can.CB_ERR:

    错误报告(param为错误码);

  • can.CB_STATE:

    总线状态变更,后续param参数是新的状态,也可以用can.state读出。

1.4 帧格式常量

  • can.EXT:扩展帧;

  • can.STD:标准帧。

2、- Can操作库API函数 -  

2.1 初始化与配置

1)初始化CAN总线
can.init(id, rx_message_cache_max) 

参数:

  • id:总线ID(0表示can0,1表示can1,通常默认为0)。

  • rx_message_cache_max:接收缓存消息数最大值(默认使用平台值)。 

返回值:
boolean(成功返回true,失败返回false)。

示例:

2.1.png

2)配置CAN总线的波特率及时序参数
can.timing(id, br, PTS, PBS1, PBS2, SJW) 

参数:

  • id:总线ID。

  • br:波特率(默认1Mbps)。

  • PTS:

    传播时间段(范围1~8,默认5)。

  • PBS1:

    相位缓冲段1(范围1~8,默认4)。

  • PBS2:

    相位缓冲段2(范围2~8,默认3)。

  • SJW:

    同步补偿宽度(范围1~4,默认2)。 

返回值:boolean。

示例:

2.22.png

3)设置CAN总线工作模式
can.mode(id, mode) 

参数:

  • id:总线ID。

  • mode:

    模式常量(如 can.MODE_NORMAL)。

返回值:boolean。

示例:

2.23.png

4)设置消息过滤规则
can.filter(id, dual_mode, ACR, AMR)

参数:

  • id:总线ID。

  • dual_mode:是否启用双滤波模式。

  • ACR:接受代码寄存器(过滤 ID 值)。

  • AMR:接受掩码寄存器(掩码值)。

返回值:boolean。

注意:具体实现依赖硬件特性。

5)设置CAN节点ID及类型
can.node(id, node_id, id_type)

参数:

  • id:总线ID。

  • node_id:节点 ID。

  • id_type:ID 类型(can.EXT或can.STD)。

返回值:boolean。

示例:

2.23.png

2.2 数据与收发

1)发送CAN消息
can.tx(id, msg_id, id_type, RTR, need_ack, data)  

参数:

  • id:总线ID。

  • msg_id:消息ID。

  • id_type:

    帧类型(can.EXT 或 can.STD)。

  • RTR:

    是否为远程传输请求(true/false)。

  • need_ack:

    是否需要应答(true/false)。

  • data:

    数据(数组,如 {0x01, 0x02})。 

返回值:无。

示例:

221new.png

2)接收CAN消息
can.rx(id) 

参数:
id:总线ID。

返回值:
消息数据(如 {id=0x123, data={0x01, 0x02}})。

示例:

222.png

2.3 状态与事件

1)注册事件回调函数
can.on(id, func)

参数:

  • id:总线ID。

  • func:回调函数(参数:id, type, param)。

示例:

231.png

2)获取当前总线状态
can.state(id)

参数:
id:总线ID。

返回值:
状态常量(如 can.STATE_ACTIVE)。

3)停止指定总线
can.stop(id)

参数:id:总线ID。

4)重置总线(恢复默认配置)
can.reset(id)

参数:id:总线ID。

5)反初始化总线
can.deinit(id)

参数:id:总线ID。

6)启用/禁用调试信息输出
can.debug(on_off)

参数:on_off(布尔值)。

3、- CAN开发相关注意事项 -  

3.1 初始化顺序

3.1.png

3.2 消息发送与接收

使用can.tx发送消息,确保参数正确;通过can.rx拉取消息,或在回调中处理can.CB_MSG。

3.3 状态监控

定期检查can.state,处理离线状态(can.STATE_BUSOFF);错误回调can.CB_ERR,需记录param错误码。

3.4 调试与性能

启用can.debug(true) 输出底层日志;接收缓存rx_message_cache_max需根据需求调整,避免消息丢失。

3.5 常见问题

如何解决can.STATE_BUSOFF离线状态?

需先调用can.reset(id)恢复总线,再重新初始化配置。

如何确保消息发送成功?

通过can.CB_TX回调判断发送结果,或检查返回值(若API支持)。

如何处理高频率消息接收?

增大rx_message_cache_max,或在回调中及时处理消息。

D011.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值