Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CAN过滤报文
rt_thread中如何使用CAN硬件过滤器?
发布于 2023-07-31 19:20:24 浏览:821
订阅该版
目前我使用rt_thread版本为v4.1.1,目前使用了两路can,想要对两路can的数据进行硬件过滤处理,降低CPU负荷。 过滤的ID为: ```c #define STEER_STA_FEEDBACK_MSG_ID 0x203 #define BRAKE_STA_FEEDBACK_MSG_ID 0x202 #define DRIVE_STA_FEEDBACK_MSG_ID 0x201 #define BMS_STA_FEEDBACK_MSG_ID 0x1884EFF3 #define MCU_STA_FEEDBACK_MSG_ID 0x0C0221E #define WHEEL_ROTATE_FEEDBACK_MSG_ID 0x18FEF115 ``` 初始化代码如下: ```c #ifdef RT_CAN_USING_HDR CanDevRecFilterCfg can1_dev_filter; CanDevRecFilterCfg can2_dev_filter; #endif #ifdef RT_CAN_USING_HDR CanDevRecFilterCfg * GetFilterCfgPtr(CanCfgEnum _type) { CanDevRecFilterCfg * _cfg = RT_NULL; switch (_type) { case CAN1_DEV_CFG: _cfg = &can1_dev_filter; break; case CAN2_DEV_CFG: #ifndef APP_USING_CAN2_DEV LOG_E("Pls config switch the app using can2 dev"); break; #endif _cfg = &can2_dev_filter; break; default: break; } return _cfg; } /** * @brief Set the Can Dev I D Filter object * @param _type CAN设备索引 * @param match_id 需要过滤的ID * @return rt_err_t RT_EOK 成功 -RT_ERROR失败 */ rt_err_t SetCanDevIDFilter(CanCfgEnum _type,rt_uint32_t match_id) { struct rt_can_filter_item _temp_filter = RT_CAN_FILTER_EXT_INIT(match_id,RT_NULL, RT_NULL); struct can_app_struct *_can_dev_cfg = RT_NULL; CanDevRecFilterCfg * _cfg = GetFilterCfgPtr(_type); RT_ASSERT(_cfg != RT_NULL); if((_cfg->used_filter_num+1) > 27) { LOG_E("Beyond the max filter num!!"); return RT_ERROR; } if(match_id > 0x7FF) { //过滤的是扩展帧 _temp_filter.ide = 1; _cfg->filter[_cfg->used_filter_num] = _temp_filter; } else { _temp_filter.ide = 0; _cfg->filter[_cfg->used_filter_num] = _temp_filter; } //执行配置操作 _cfg->filter_cfg.items = _cfg->filter; _cfg->filter_cfg.count = _cfg->used_filter_num+1; _cfg->filter_cfg.actived = 1; //更新配置 _can_dev_cfg = GetCanCfg(_type); RT_ASSERT(_cfg != RT_NULL); if(rt_device_control(_can_dev_cfg->dev, RT_CAN_CMD_SET_FILTER, &_cfg->filter_cfg) != RT_EOK) { return -RT_ERROR; } _cfg->used_filter_num++; return RT_EOK; } #endif ``` 我分别对can1 和can2进行了3组hdr配置,最终的表现结果为在接收部分只能收到ID为0x18FEF115或者ID为0x0C0221E的数据,其余的都收不到。 我这样的需求应该怎么样配置HDR才能正确进行接收呢?我使用官网的例程也存在这个问题。
查看更多
1
个回答
默认排序
按发布时间排序
yangbo18416
2023-08-01
这家伙很懒,什么也没写!
问题已经得到解决了。在4.1.1的drv_can.c的339行处,代码有问题 ```c if (filter_cfg->items[i].hdr == -1) { /* use default filter bank settings */ if (drv_can->name == "can1") { /* can1 banks 0~13 */ drv_can->FilterConfig.FilterBank = i; } else if (drv_can->name == "can2") { /* can1 banks 14~27 */ drv_can->FilterConfig.FilterBank = i + 14; } } else { /* use user-defined filter bank settings */ drv_can->FilterConfig.FilterBank = filter_cfg->items[i].hdr; } ``` 将这个部分修改为 ```c if (filter_cfg->items[i].hdr == -1) { /* use default filter bank settings */ if(rt_memcmp(drv_can->name,"can1",sizeof("can1")) == 0) { /* can1 banks 0~13 */ drv_can->FilterConfig.FilterBank = i; } else if(rt_memcmp(drv_can->name,"can2",sizeof("can2")) == 0) { /* can1 banks 14~27 */ drv_can->FilterConfig.FilterBank = i + 14; } } else { /* use user-defined filter bank settings */ drv_can->FilterConfig.FilterBank = filter_cfg->items[i].hdr; } ``` 就可以了。 最新版中已经修改了这个问题了
撰写答案
登录
注册新账号
关注者
0
被浏览
821
关于作者
yangbo18416
这家伙很懒,什么也没写!
提问
4
回答
6
被采纳
1
关注TA
发私信
相关问题
1
...关于CAN滤波 hdr=-1 请教
2
听说RT-Thread 的CAN 驱动框架有问题,不知道是否是真的?解决没有?
3
can的filter_item 和 msg 建议需重定义一个字段并补充一个字段
4
rt_thread studio 如何使用can过滤
5
开启RT_CAN_USING_HDR 过滤配置
6
rt-thread can过滤实现
7
ART-PI 使用CAN硬件过滤器打开后接收中断异常
8
开启硬件过滤器后,出现如下断言异常,不开启硬件过滤器,接收数据正常
9
RT-Thread 如何设置can过滤器
10
关于文档 can 例子的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
5
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部