news 2026/9/27 10:21:26

CAN数据帧和过滤器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CAN数据帧和过滤器

一、can通信的数据帧

起始位 识别码 RTR

1位(0) 11位(每个设备都有属于自己的识别码) 1位(数据帧0,远程请求帧1)

控制码:IDE 空闲位 DLC

1位(区分标准(0,识别码11位)和拓展(1,识别码29位)) 1位(0) 数据长度(字节)

数据码

0~8字节(DLC为1,这数据码是8位)

CRC CRC界定符 ACK ACK界定位 结束位

16位 1位(1) 1位(发送端1,接收端0) 1位(1) 7位(1111111)

二、can过滤器

过滤器组:
• 掩码模式过滤出一组(多个)符合要求的ID;
• 列表模式过滤出一个或多个符合要求的ID;
• 16位过滤器只能用来过滤标准帧ID;
• 32位过滤器一般用来过滤扩展帧ID(当然也可以过滤标准帧);

一个过滤器组是由两个32位寄存器组成,可以将其配置为:
• 四个16位列表模式的过滤器,可以过滤出来四个ID号的信息;
• 两个16位掩码模式过滤器
• 一个32位掩码模式过滤器

掩码模式:
当我们设置为掩码模式时:一般我们称CAN_FxR1寄存器为ID寄存器(或者验证码寄存器),CAN_FxR2为掩码寄存器。

代码详解:

1、设置为16位列表模式

sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST; // 列表模式 sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; // 16位位宽 sFilterConfig.FilterIdHigh = 0x01 << 5; sFilterConfig.FilterIdLow = 0x02<<5; sFilterConfig.FilterMaskIdHigh = 0x08<<5; sFilterConfig.FilterMaskIdLow = 0x0000;

列表模式(IDLIST):只接收“列表中明确列出的 ID”,不在列表中的全部丢弃(白名单)
16位位宽:在列表模式下,整个过滤器组会被拆分成 4 个 16 位的“ID槽位”(FilterIdHigh,FilterIdLow,FilterMaskIdHigh,FilterMaskIdLow)。
左移5位:STM32 CAN 过滤器硬件寄存器中,标准 ID(11位)存放在高 11 位(bits[15:5]),低 5 位(bits[4:0])用于存放 IDE/RTR 等标志位。
允许通过的标准帧 ID 为:0x01、0x02、0x08、0x00。

2、设置为32为列表模式

sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST; //列表模式 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 32位位宽 sFilterConfig.FilterIdHigh = 0x01 << 5; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x08<<5; sFilterConfig.FilterMaskIdLow = 0x0000;

表示32位列表模式,在32位列表模式下,一个过滤器组被拆分成2个 32位的ID槽位。
槽位1(ID1)
:由FilterIdHigh+FilterIdLow组合而成
槽位2(ID2):由FilterMaskIdHigh+FilterMaskIdLow组合而成
左移5位:STM32 CAN过滤器寄存器中,标准ID(11位)存储在32位寄存器的 bit[31:21]。
实际过滤结果:只接收标准ID 0x01和标准ID 0x08的数据帧。

3、设置位16位掩码模式

sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 掩码模式 sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; sFilterConfig.FilterIdHigh = 0x01 << 5; sFilterConfig.FilterIdLow = 0xfffE<<5; sFilterConfig.FilterMaskIdHigh = 0x01 << 5; sFilterConfig.FilterMaskIdLow = 0xfffE<<5;

表示 16位掩码模式,掩码模式的核心逻辑:“ID的哪些位必须匹配,哪些位可以忽略”。
(1)单元A(由 FilterIdHigh + FilterMaskIdHigh 构成)

  • ID值:0x01 << 5=0x20(二进制:0010 0000)

  • 掩码值:0x01 << 5=0x20(二进制:0010 0000)

匹配规则:掩码中为1的位必须与ID值完全一致,为0的位忽略。
这里掩码只在bit5位有1,其他位都是0。因此硬件只会检查标准ID的bit5是否为1(对应11位标准ID的最低位,即bit0)。
结论:所有标准ID为奇数(0x001, 0x003, 0x005 ... 0x7FF)的帧都能通过。
(2)单元B(由 FilterIdLow + FilterMaskIdLow 构成)

  • 写入值:0xFFFE << 5。
    注意:标准ID最大为0x7FF(11位),0xFFFE远超范围。这里实际运算为0xFFFE << 5 = 0x1FFFC0,写入16位寄存器时自动截断为低16位,即0xFFC0。
    (掩码值同理,同样被截断为0xFFC0)

  • 实际生效ID:0xFFC0(二进制:1111 1111 1100 0000)

  • 实际生效掩码:0xFFC0(二进制:1111 1111 1100 0000)

匹配规则:掩码中为1的位(bit15~bit6)必须与ID完全一致,为0的位(bit5~bit0)忽略。
寄存器中的 bit15~bit6 对应标准11位ID的 bit10~bit1。这意味着强制要求标准ID的高10位(bit10 ~ bit1)全部为 1。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 10:21:13

STM32实验室消防预警系统:开源硬件+三级阈值+嘉立创实测

1. 项目概述&#xff1a;一个能真正跑在实验室里的消防预警系统你有没有遇到过这样的场景&#xff1a;实验室里几台恒温箱、烘箱、电炉同时开着&#xff0c;空气里飘着淡淡的焦糊味&#xff0c;但没人察觉&#xff1b;或者深夜值班时&#xff0c;烟雾传感器误报&#xff0c;警报…

作者头像 李华
网站建设 2026/9/27 10:20:21

清远网站开发图解步骤:3招搞定黑挂马与SEO排名

清远网站开发图解步骤:3招搞定黑挂马与SEO排名 昨天刚帮清远一家做陶瓷出口的老板处理完紧急事故。他的网站突然打不开,浏览器弹出红色警告,页面底部赫然出现几个赌博和色情链接的乱码。他急得直拍桌子:“我明明开了防火墙,怎么还被黑挂了马?现在流量全掉没了,这单生意还要不要了?”…

作者头像 李华
网站建设 2026/9/27 10:19:20

3步搞定dw怎么做网站布局,兼顾性能优化不踩坑

3步搞定dw怎么做网站布局,兼顾性能优化不踩坑 找建站公司怕被坑高价,最后发现对方连基础布局都没搞对?别慌,今天把dw怎么做网站布局掰开揉碎讲清楚。很多项目经理都踩过这个坑:外包团队收钱时信誓旦旦,交付时却是个“四不像”——桌面端看着还行,手机端直接崩盘,加载速度还慢得让人怀疑人生。其实,用Drea…

作者头像 李华
网站建设 2026/9/27 10:19:13

Frontpage做的网站好不好独立站长速查手册

Frontpage做的网站好不好独立站长速查手册 做站十年,见过太多人拿着Frontpage做的模板站来问:这站到底能不能用?我的回答很直接—— 模板网站太丑不够用…

作者头像 李华
网站建设 2026/9/27 10:19:03

不会代码想建网站?这3款网站开发神器怎么选

不会代码想建网站?这3款网站开发神器怎么选 自己不会代码想做网站,是不是头都大了?别慌,现在工具多到让人眼花缭乱,关键看怎么选。很多老板被割韭菜,就是没搞懂工具背后的逻辑。…

作者头像 李华
网站建设 2026/9/27 10:19:00

网站建设二团队防漏指南图解步骤3招解决没人访问

网站建设二团队防漏指南图解步骤3招解决没人访问 网站做好了没人访问,不是运气差,是安全没做对。很多创业团队负责人都踩过这个坑:网站上线三个月,后台日志显示大量异常请求,SEO权重莫名下降,用户打开页面卡顿甚至被跳转。别急着怪搜索引擎,先看看你的“网站建设二团队”在安全防护上是否留了后门。今天不聊虚的…

作者头像 李华