Canbus ID filter and mask

Canbus ID filter and mask

CANBUS is a two-wire, half-duplex, bus based LAN system that is ‘collision free’.

Data is BROADCAST onto the bus -THERE IS NO SUCH THNG AS A POINT TO POINT CONNECTION as with data LANs.

All nodes receive all broadcast data and decide whether or not that data is relevant.

A CANBUS B frame consists of a four byte header (containing a 29-bit identifier), followed by up to 8 data bytes.

A receiving node would examine the identifier to decide if it was relevant (e.g. waiting for a frame with ID 00001567 which contains data to switch on or off a motor).

It could do this via software (using a C if or case statement); in practice the Canbus interface contains firmware to carry out this task

using the acceptance filter and mask value to filter out unwanted messages.

The filter mask is used to determine which bits in the identifier of the received frame are compared with the filter

  • If a mask bit is set to a zero, the corresponding ID bit will automatically be accepted, regardless of the value of the filter bit.
  • If a mask bit is set to a one, the corresponding ID bit will be compare with the value of the filter bit;
    if they match it is accepted otherwise the frame is rejected.

A filter matches, when received_can_id & mask == can_id & mask -- Mask=1 : Do Care Bits

Example 1. we wish to accept only frames with ID of 00001567 (hexadecimal values)

  • set filter to 00001567
  • set mask to 1FFFFFFF --- Every Bit must match filter

when a frame arrives its ID is compared with the filter and all bits must match; any frame that does not match ID 00001567 is rejected

Example 2. we wish to accept only frames with IDs of 00001560 thru to 0000156F

  • set filter to 00001560
  • set mask to 1FFFFFF0 Low 4 Bits dont care

when a frame arrives its ID is compared with the filter and all bits except bits 0 to 3 must match; any frame other frame is rejected

Example 3. we wish to accept only frames with IDs of 00001560 thru to 00001567

  • set filter to 00001560
  • set mask to 1FFFFFF8 Low 3 Bits dont care

when a frame arrives its ID is compared with the filter and all bits except bits 0 to 2 must match; any frame other frame is rejected

Example 4. we wish to accept any frame

  • set filter to 0
  • set mask to 0 --- Every Bits dont care

all frames are accepted

In practice Canbus interfaces tends to have a number of filters and masks so combinations of IDs can be accepted,

e.g. a module that carries out a number of different tasks.// mask bit n | filter bit n | message ID bit n | result

   //     Mask       Filter         ID
   //     0             x               x             accept
   //     1             0               0             accept
   //     1             0               1             reject
   //     1             1               0             reject
   //     1             1               1             accept

Since this filtering is done in hardware it is fairly primitive. Usually the calculation involves two registers a mask and a filter. The equivalent logic in C would be:

/* dsPIC style; mask specifies "do care" bits */
if ((arbitrationId & mask) == filter) {
    /* Message accepted; rx interrupt triggered */
}

/* Accept all */
mask = 0;
filter = 0;

/* Accept CANopen default connection set (excluding SYNC and NMT) */
mask = 0x7F;
filter = node_id;
/* SJA 1000 style; mask specifies "do not care" bits */
if ((arbitrationId & ~mask) == filter) {
    /* Message accepted; rx interrupt triggered */
}

/* Accept all */
mask = ~0;
filter = 0;

/* Accept CANopen default connection set (excluding SYNC and NMT) */
mask = ~0x7F;
filter = node_id;
4.1 RAW protocol sockets with can_filters (SOCK_RAW)

  Using CAN_RAW sockets is extensively comparable to the commonly
  known access to CAN character devices. To meet the new possibilities
  provided by the multi user SocketCAN approach, some reasonable
  defaults are set at RAW socket binding time:

  - The filters are set to exactly one filter receiving everything
  - The socket only receives valid data frames (=> no error message frames)
  - The loopback of sent CAN frames is enabled (see chapter 3.2)
  - The socket does not receive its own sent frames (in loopback mode)

  These default settings may be changed before or after binding the socket.
  To use the referenced definitions of the socket options for CAN_RAW
  sockets, include <linux/can/raw.h>.

  4.1.1 RAW socket option CAN_RAW_FILTER

  The reception of CAN frames using CAN_RAW sockets can be controlled
  by defining 0 .. n filters with the CAN_RAW_FILTER socket option.

  The CAN filter structure is defined in include/linux/can.h:

    struct can_filter {
            canid_t can_id;
            canid_t can_mask;
    };

  A filter matches, when

    <received_can_id> & mask == can_id & mask

  which is analogous to known CAN controllers hardware filter semantics.
  The filter can be inverted in this semantic, when the CAN_INV_FILTER
  bit is set in can_id element of the can_filter structure. In
  contrast to CAN controller hardware filters the user may set 0 .. n
  receive filters for each open socket separately:

    struct can_filter rfilter[2];

    rfilter[0].can_id   = 0x123;
    rfilter[0].can_mask = CAN_SFF_MASK;
    rfilter[1].can_id   = 0x200;
    rfilter[1].can_mask = 0x700;

    setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));

  To disable the reception of CAN frames on the selected CAN_RAW socket:

    setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);

  To set the filters to zero filters is quite obsolete as to not read
  data causes the raw socket to discard the received CAN frames. But
  having this ‘send only‘ use-case we may remove the receive list in the
  Kernel to save a little (really a very little!) CPU usage.

  4.1.1.1 CAN filter usage optimisation

  The CAN filters are processed in per-device filter lists at CAN frame
  reception time. To reduce the number of checks that need to be performed
  while walking through the filter lists the CAN core provides an optimized
  filter handling when the filter subscription focusses on a single CAN ID.

  For the possible 2048 SFF CAN identifiers the identifier is used as an index
  to access the corresponding subscription list without any further checks.
  For the 2^29 possible EFF CAN identifiers a 10 bit XOR folding is used as
  hash function to retrieve the EFF table index.

  To benefit from the optimized filters for single CAN identifiers the
  CAN_SFF_MASK or CAN_EFF_MASK have to be set into can_filter.mask together
  with set CAN_EFF_FLAG and CAN_RTR_FLAG bits. A set CAN_EFF_FLAG bit in the
  can_filter.mask makes clear that it matters whether a SFF or EFF CAN ID is
  subscribed. E.g. in the example from above

    rfilter[0].can_id   = 0x123;
    rfilter[0].can_mask = CAN_SFF_MASK;

  both SFF frames with CAN ID 0x123 and EFF frames with 0xXXXXX123 can pass.

  To filter for only 0x123 (SFF) and 0x12345678 (EFF) CAN identifiers the
  filter has to be defined in this way to benefit from the optimized filters:

    struct can_filter rfilter[2];

    rfilter[0].can_id   = 0x123;
    rfilter[0].can_mask = (CAN_EFF_FLAG | CAN_RTR_FLAG | CAN_SFF_MASK);
    rfilter[1].can_id   = 0x12345678 | CAN_EFF_FLAG;
    rfilter[1].can_mask = (CAN_EFF_FLAG | CAN_RTR_FLAG | CAN_EFF_MASK);

    setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));

  4.1.2 RAW socket option CAN_RAW_ERR_FILTER

  As described in chapter 3.4 the CAN interface driver can generate so
  called Error Message Frames that can optionally be passed to the user
  application in the same way as other CAN frames. The possible
  errors are divided into different error classes that may be filtered
  using the appropriate error mask. To register for every possible
  error condition CAN_ERR_MASK can be used as value for the error mask.
  The values for the error mask are defined in linux/can/error.h .

    can_err_mask_t err_mask = ( CAN_ERR_TX_TIMEOUT | CAN_ERR_BUSOFF );

    setsockopt(s, SOL_CAN_RAW, CAN_RAW_ERR_FILTER,
               &err_mask, sizeof(err_mask));
时间: 2024-11-05 02:50:26

Canbus ID filter and mask的相关文章

filter滤镜的使用

刚开始学css,开始遇到filter不懂什么意思后来到网上查了,觉得解释的很全面,就把它抠下来,以便自己经常来看看. CSS滤镜的使用方法:filter:filtername(parameters) 即 filter:滤镜名称(参数) alpha:设置透明层次blur:创建高速度移动效果,即模糊效果chroma:制作专用颜色透明DropShadow:创建对象的固定影子FlipH:创建水平镜像图片FlipV:创建垂直镜像图片glow:加光辉在附近对象的边外gray:把图片灰度化invert:反色l

用php自带的filter函数验证、过滤数据 -转载

PHP过滤器包含两种类型 Validation:用来验证验证项是否合法 Sanitization:用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除等. input_filters_list() 用来列出当前系统所支持的所有过滤器. 1 2 3 4 5 6 <?php foreach(filter_list() as $id => $filter) {    echo $filter.'    '.filter_id($filter)."\n"; } ?

Yii框架下CDataColumn中filter应用+jeditable+pager样式定义应用实例

应用环境在Yii1.1框架下,CDataColumn的filter应用给CGridView带来了极大的方便,可以根据某一字段的值来过滤显示现有的表格数据,这是个重要的功能,可惜一来Yii的中文资料实在不够详细,二来百度出的东西重复的太多,有用的很少.参考很多英文资料后,我把自己写的实例贴出来供大家参考,如果有必要我以后还会陆续贴一些Yii文章出来. filter首先要有自己的数据源,这个可以是当前表格使用的model,也可以是其他一些array,这个实例中我使用了当前model,CGridVie

使用PHP自带的filter函数进行数据校验

使用PHP自带的filter函数进行数据校验 PHP过滤器包含两种类型Validation:用来验证验证项是否合法Sanitization:用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除等. input_filters_list() 用来列出当前系统所支持的所有过滤器. <?php foreach(filter_list() as $id => $filter) {     echo $filter.' '.filter_id($filter)."\n&quo

CALayer alpha mask not working

2 down vote favorite 3 I'm trying to create a simple example of drawing an image to a layer, and then setting that layer's alpha mask. I added the code below to my sample app's viewDidLoad. without setting the mask, i can see the image of the leaf. a

SVG 参考手册

1. SVG元素模块 Animation.Module animate animateColor animateTransform animateMotion set mpath 剪裁模块 clipPath 颜色轮廓模块 color-profile 条件处理模块 switch 光标模块 cursor 扩展性模块 foreignObject 过滤器模块 filter feFlood feColorMatrix feComponentTransfer feComposite feConvolveMa

学习CSS的一些笔记

在HTML中使用CSS的方法1.行内样式<p style="color:red">段落样式</p> 2.内嵌样式<head> <style type="text/css"> p{ color:red; font-size:12px; } </style></head> 3.链接样式<head> <link rel="stylesheet" type=&quo

JQuery+CSS3实现封装弹出登录框效果

原文:JQuery+CSS3实现封装弹出登录框效果 上次发了一篇使用Javascript来实现弹出层的效果,这次刚好用了JQuery来实现,所以顺便记录一下: 因为这次使用了Bootstrap来做一个项目,但是由于不使用Bootstrap自带的JS插件,所以这个弹出登录框就自己实现封装来调用,做出来的效果其实和Bootstrap自带的效果差不多.OK,看一下效果图: 其实很简单,首先是html结构: <div id="mask"></div> <!-- 半

漂亮提醒框js

<script type="text/javascript"> var filename = "PICC_V2.1.3.0_新增功能操作手册.doc"; window.onload = function(){ var dialog1; dialog1 = new Dialog({width:310,height:250,title:"重要通知"});//background:pink; dialog1.content.innerHTM