Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can bus 如何计算软件验收掩码值_Can Bus - Fatal编程技术网

Can bus 如何计算软件验收掩码值

Can bus 如何计算软件验收掩码值,can-bus,Can Bus,我想知道我们如何计算一些标准can id集的软件验收过滤器掩码。如果有人能举例说明这一点,那就太好了。 另外,请提供一些链接/资料,以了解CAN stack软件的实现 提前感谢。由于此过滤是在硬件中完成的,因此相当原始。通常计算涉及两个寄存器:掩码和过滤器。C中的等效逻辑为: /* dsPIC style; mask specifies "do care" bits */ if ((arbitrationId & mask) == filter) { /* Message acc

我想知道我们如何计算一些标准can id集的软件验收过滤器掩码。如果有人能举例说明这一点,那就太好了。 另外,请提供一些链接/资料,以了解CAN stack软件的实现


提前感谢。

由于此过滤是在硬件中完成的,因此相当原始。通常计算涉及两个寄存器:掩码和过滤器。C中的等效逻辑为:

/* 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;

掩码的数量、过滤器的数量、过滤器是否启用以及如何启用,以及寄存器中ID位的排列都取决于硬件。要给你一个更具体的答案,需要关于所使用的特定硬件的详细信息

有关CANbus的基本信息可在此处找到:


    • 让我用一个例子来解释这一点:

      假设用户只希望接收ID为0x8Z(其中Z=1,3,5,7)的消息,那么下面是如何计算掩码寄存器和接受寄存器的值:

      • 0x81=1000 0001
      • 0x83=1000 0011
      • 0x85=1000 0101
      • 0x87=1000 0111
      掩码寄存器=11111001

      首先比较所有ID的第0位,如果相同,则掩码寄存器的对应位为“1”,否则为“0”。然后比较第一位,然后是第二位,依此类推

      在我们的例子中,所有ID中只有第5位和第6位不同。这解释了我们如何获得“掩码寄存器”值

      对于接受寄存器值,取任何允许的消息ID,该ID将是接受寄存器值的值。在我们的例子中,它可能是0x810x830x850x87

      编程时,可按如下方式检查:

      if((Incoming_ID && Mask_Register) == (Incoming_ID && Acceptance_Register))
      {
          //Receive Message
      }
      else
      {
           //Discard Message
      }
      
      希望能有帮助

      if((Incoming_ID && Mask_Register) == (Incoming_ID && Acceptance_Register))
      {
          //Receive Message
      }
      else
      {
           //Discard Message
      }