ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CAN数据帧和过滤器

CAN数据帧和过滤器 一、can通信的数据帧起始位 识别码 RTR1位(0) 11位(每个设备都有属于自己的识别码) 1位(数据帧0远程请求帧1)控制码IDE 空闲位 DLC1位区分标准(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 0x025; sFilterConfig.FilterMaskIdHigh 0x085; sFilterConfig.FilterMaskIdLow 0x0000;列表模式IDLIST只接收“列表中明确列出的 ID”不在列表中的全部丢弃白名单16位位宽在列表模式下整个过滤器组会被拆分成 4 个 16 位的“ID槽位”FilterIdHighFilterIdLowFilterMaskIdHighFilterMaskIdLow。左移5位STM32 CAN 过滤器硬件寄存器中标准 ID11位存放在高 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 0x085; sFilterConfig.FilterMaskIdLow 0x0000;表示32位列表模式在32位列表模式下一个过滤器组被拆分成2个 32位的ID槽位。槽位1ID1由FilterIdHighFilterIdLow组合而成槽位2ID2由FilterMaskIdHighFilterMaskIdLow组合而成左移5位STM32 CAN过滤器寄存器中标准ID11位存储在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 0xfffE5; sFilterConfig.FilterMaskIdHigh 0x01 5; sFilterConfig.FilterMaskIdLow 0xfffE5;表示 16位掩码模式掩码模式的核心逻辑“ID的哪些位必须匹配哪些位可以忽略”。1单元A由 FilterIdHigh FilterMaskIdHigh 构成ID值0x01 50x20二进制0010 0000掩码值0x01 50x20二进制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最大为0x7FF11位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。
返回列表