CAN数据帧和过滤器
一、can通信的数据帧
起始位 识别码 RTR
1位(0) 8位(每个设备都有属于自己的识别码) 1位(数据帧0,远程请求帧1)
控制码:IDE 空闲位 DLC
1位(区分标准(0,识别码11位)和拓展(1,识别码29位)) 1位(0) 数据长度(字节)
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。
更多推荐
所有评论(0)