Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CAN过滤报文
rt_thread中如何使用CAN硬件过滤器?
发布于 2023-07-31 19:20:24 浏览:946
订阅该版
目前我使用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
被浏览
946
关于作者
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
RT-Thread项目助手v0.2.0 - 支持Env Windows
2
RttreadV5.10上,GD32F450Z RTC时间显示问题
3
rt-smart启动流程分析
4
EtherKit快速上手PROFINET
5
RTThread USB转串口无法接收数据
热门标签
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
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部