Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CAN总线
关于CAN硬件过滤器使用注意事项分享
发布于 2019-10-07 17:39:32 浏览:4051
订阅该版
这几天对CAN设备的硬件过滤器进行了研究,发现使用时需要注意几个问题。 1.如果要使用过滤器回调函数,那么则不能使用默认过滤器,并且设置过滤器时必须从过滤器0开始设置。如果不从过滤器0开始设置存在以下问题。开启CAN设备时,驱动自动设置了过滤器0为默认过滤器,如果不将默认过滤值改过来,那么接受数据全部都从过滤器0进行过滤,则不会到达指定的过滤器过滤,那么指定过滤器读不到数据并且无法使用过滤器回调函数。 2.如果默认过滤器值和指定过滤器号(过滤器号不为0)同时使用,那么读数据时 hdr 的值只能设置为 -1 ,如果设置为指定过滤器号,那么则读不到数据,并且还会造成 uselist 链表满,从而无法接收数据。 3.过滤器设置个人感觉有点不人性化,ID设置时进行移位计算,而掩码则直接赋值。这样就会让用户使用过滤器是有点疑惑,需要手动计算掩码值。设置过滤器源码如下: can_filter.FilterIdHigh = (filter_cfg->items*.id >> 13) & 0xFFFF; can_filter.FilterIdLow = ((filter_cfg->items*.id << 3) | (filter_cfg->items*.ide << 2) | (filter_cfg->items*.rtr << 1)) & 0xFFFF; can_filter.FilterMaskIdHigh = (filter_cfg->items*.mask >> 16) & 0xFFFF; can_filter.FilterMaskIdLow = filter_cfg->items*.mask & 0xFFFF; 建议更改过滤器结构体,将掩码值和ID值改为相同位数。如下: struct rt_can_filter_item { rt_uint32_t id : 29; /* 报文 ID */ rt_uint32_t ide : 1; /* 扩展帧标识位 0 标准帧格式 1 扩展帧格式*/ rt_uint32_t rtr : 1; /* 远程帧标识位 0 数据帧 1 远程帧 */ rt_uint32_t mode : 1; /* 过滤表模式 0 标识符屏蔽模式 1 标识符列表模式*/ rt_uint32_t mask_id : 29; /*ID 掩码,0 表示对应的位不关心,1 表示对应的位必须匹配 */ rt_uint32_t mask_res : 3; rt_int32_t hdr; /* -1 表示不指定过滤表号,对应的过滤表控制块也不会被初始化,正数为过滤表号,对应的过滤表控制块会被初始化 */ #ifdef RT_CAN_USING_HDR rt_err_t (*ind)(rt_device_t dev, void *args , rt_int32_t hdr, rt_size_t size); /* 过滤表回调函数 */ void *args; /* 回调函数参数 */ #endif /*RT_CAN_USING_HDR*/ }; 同时更改过滤器掩码设置代码: can_filter.FilterMaskIdHigh = (filter_cfg->items*.mask_id >> 13) & 0xFFFF; can_filter.FilterMaskIdLow = ((filter_cfg->items*.mask_id << 3) | (filter_cfg->items*.ide << 2)) & 0xFFFF; 这样的话,用户在使用过滤器设置掩码时只需要与29位ID对应即可,无需手动计算掩码值。
查看更多
10
个回答
默认排序
按发布时间排序
tyustli
2019-10-07
这家伙很懒,什么也没写!
6666 楼主可以提个 PR 试试
M大侠
2019-10-16
这家伙很懒,什么也没写!
什么时候会进过滤器回调啊?
雁山情缘
2019-10-22
这家伙很懒,什么也没写!
>什么时候会进过滤器回调啊? --- 如果你设置了过滤器回调函数,通过该过滤过滤后收到数据就会进过滤器回调函数。
imawolfking
2019-11-07
这家伙很懒,什么也没写!
这个是不怎么好用,谢楼主
ticat710
2019-11-29
这家伙很懒,什么也没写!
关于第一点,使用过滤器回调函数,具体怎么用? 能给个例子么? 谢谢!
雁山情缘
2019-12-11
这家伙很懒,什么也没写!
>关于第一点,使用过滤器回调函数,具体怎么用? 能给个例子么? 谢谢! --- 过滤器的回调函数是在过滤器表中设置的,我之前做过测试,是可以用的。例子就没有了,你可以自己测试一下
921742079
2019-12-11
这家伙很懒,什么也没写!
大神有没有can的完整的例子跑一下?我这边can分析器拿不到数据
ticat710
2019-12-11
这家伙很懒,什么也没写!
[i=s] 本帖最后由 ticat710 于 2019-12-11 11:28 编辑 [/i] 和官网can移植一样啊,只是官网移植里少了 在stm32f1xx_hal_msp.c文件里需要增加 void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) ---GPIO 初始化 void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan) 2个初始化函数,这个函数可以通过stm32cubemx配置生成, 然后打开相应的宏,也就是在rtconfig.h中增加 #define BSP_USING_CAN #define BSP_USING_CAN1 这个可以通过修改kconfig文件,然后通过menuconfig增加 然后再stm32f1xx+hal_conf.h中修改被屏蔽的 #define HAL_CAN_MODULE_ENABLED 这样基本就可以了
翌雨芩风
2019-12-16
这家伙很懒,什么也没写!
求大神出个过滤表的配置方法,我按上面配置: //设置过滤表 struct rt_can_filter_item items[3] = { // {(id), (ide), (rtr), (mode), (mask), -1, (ind), (args)}, {(pcs_to_bms_id), (1), (0), (0), (0xffff0000), 0, (RT_NULL), (RT_NULL)}, //必须要先使用0 {(pcs_to_bms_id), (1), (0), (0), (0), 10, (RT_NULL), (RT_NULL)}, {(pcs_to_bms_id), (1), (0), (0), (0xff), 11, (RT_NULL), (RT_NULL)}, }; struct rt_can_filter_config cfg = {3, 1, items}; /* 一共有 1 个过滤表 */ /* 设置硬件过滤表 */ ret = rt_device_control(can2_dev, RT_CAN_CMD_SET_FILTER, &cfg); RT_ASSERT(ret == RT_EOK); /* hdr 值为 - 1,表示直接从 uselist 链表读取数据 */ CANx_rxmsg[0].hdr = 0; CANx_rxmsg[1].hdr = 10; CANx_rxmsg[2].hdr = 11; 程序也能进中断,也能回调,但是读出来的全是0。这个CAN驱动怎么难用。
翌雨芩风
2019-12-16
这家伙很懒,什么也没写!
[attach]12706[/attach] **把过滤表号设为-1, 接收那里也设为-1,只能读到一次数据,我一次发01-09ID,却每次读到的ID都是01.真是太搞笑了。 **:(
撰写答案
登录
注册新账号
关注者
2
被浏览
4.1k
关于作者
雁山情缘
这家伙很懒,什么也没写!
提问
10
回答
46
被采纳
0
关注TA
发私信
相关问题
1
我也来传一个CANOpen移植,RTT+STM32F107+CanOpenNode
2
谁有STM32裸跑的CANopen程序啊???
3
CAN驱动程序框架
4
CAN驱动接口如何规范一下
5
RTT无法进入线程.Cannot access Memory
6
编译提示arm-none-eabi/bin/ld: cannot find crt0.o: No such file o
7
rtt 2.1.0 正式版 mdk4 bsp/stm32 编译canapp.c错误
8
STM32F10XCAN驱动使用的问题
9
2.1版本stm32f10x分支bxcan驱动波特率设置的bug
10
rtthread2.1.0下,找不到can1设备
推荐文章
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
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
15
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部