一、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、0x020x080x00

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

  • 实际生效ID0xFFC0(二进制: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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐