如何计算软件验收Mask值

时间:2015-04-06 18:48:51

标签: can-bus

我想知道我们如何计算某些标准CAN id的软件接受过滤器掩码。如果有人可以通过示例解释这一点,那将会很棒。 另请提供一些链接/材料以了解CAN堆栈软件的实现。

提前致谢。

2 个答案:

答案 0 :(得分:3)

由于这种过滤是在硬件中完成的,因此相当原始。通常计算涉及两个寄存器,一个掩码和一个滤波器。 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;

或者

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

掩码的数量,滤波器的数量,滤波器的启用方式和方式以及寄存器中ID位的排列都取决于硬件。为了给您一个更具体的答案,需要有关所使用的特定硬件的详细信息。

有关CANbus的基本信息,请访问:

答案 1 :(得分:2)

让我用一个例子解释一下:

假设用户想要仅使用ID 0x8Z(其中Z = 1,3,5,7)接收消息,那么这里是如何计算Mask寄存器和Acceptance寄存器的值:

  • 0x81 = 1000 0001
  • 0x83 = 1000 0011
  • 0x85 = 1000 0101
  • 0x87 = 1000 0111

掩码寄存器= 1111 1001

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

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

对于Acceptance register value,取任何允许的消息ID,这将是Acceptance寄存器值的值。在我们的例子中,它可能是 0x81 0x83 0x85 0x87

编程时可以像这样检查:

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

希望它有所帮助。