This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:如何丢弃特定 ID 中的 CAN 消息

Guru**** 2533270 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1270369/tm4c1294ncpdt-how-to-discard-can-messages-from-a-particular-id

器件型号:TM4C1294NCPDT

尊敬的所有人:

使用以下设置,我只能从 ID 2收到消息,但我需要相反。 我需要拒绝 ID 2并接收采用11位配置的所有其他消息。

请帮助我进行设置

/将 obj 2设置为 Rx、带接受滤波器
PTR->IF1CMSK = B7| B6| B5 | B4 | B1 | B0;

//通过设置 umask,允许使用 XTD 和 DIR 进行验收过滤
ptr->IF1MCTL |= b12;

//设置 CANIFnMSK2中11位标准 ID 的低11位的滤波掩码
PTR->IF1MSK2 = B14 | B12 | B11 | B10 | B9 | B8 | B7 | B6 | B5 | B4 | B3 | B2;

//将预期 ID 设置为要在 CANIFnARB2中拒绝的 ID
ptr->IF1ARB2 =(((0x2)<< 2)| b15;//设置 ID 2的方向和有效位

//启用 Rx 中断
ptr->IF1MCTL = b12 | b10 | b7 | b6;//设置 umask 以启用验收过滤屏蔽

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     下面的示例显示了接收仅 ID 为0x1001的 CAN 消息并滤除所有其他消息。  

    /*初始化一个消息对象以接收 ID 为0x1001的 CAN 消息。
    *必须将预期 ID 与掩码一起设置,以指示所有
    * ID 中的位必须匹配。 */
    sCANMessage.ui32MsgID = 0x1001;
    sCANMessage.ui32MsgIDMask = 0xFFFF;
    sCANMessage.ui32Flags =(MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER |
    MSG_OBJ_EXTENDED_ID);

    如果您想排除 ID 0x2、那么您要将 ID 设置为 0x00000000 、将屏蔽设置为0x00000002。 请记住、通过屏蔽指定的位而不进行比较来应用滤波。 这不是一个 平等的比较。 例如、CAN ID 字段仅为3位、而不是11位。 如果指定 ID 等于0x0且掩码等于0x2、则不仅会滤除 ID 0x2、还会滤除 ID 0x3、0x6和0x7。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "如果您指定 ID 等于0x0且掩码等于0x2、则 ID 0x2将被滤除、但 ID 也是0x3、0x6和0x7。 "

    您能否解释为什么3、6、7被过滤掉、以及参考手册中提到的内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果屏蔽等于0x2 (如010b 中所示)、那么位1被用于接受过滤。 如果您在000b 中指定了 ID 0x0、表示位1等于0、则任何位1等于1的 ID 都将被滤除。 仅接受位1等于0的 ID。 看一个三位 ID 示例、这意味着会滤除010,011,110和111、因为对于这四个 ID、它们的位1等于1。 我的意思是、不仅0x2的 ID 会被滤除、而且0x3、0x6和0x7也会被滤除。 如果只想过滤掉 Id=0x2并传递所有其他内容、为什么不考虑禁用接受过滤、而是在 ISR 中、检查传入 ID 是否等于0x2并忽略它的处理。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我需要减少接收缓冲器中的溢出、因此必须在接收之前丢弃它

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经解释了硬件的工作原理。 下面的主题进行了类似的讨论。 实施方式由您决定。 我没有其他建议。

    https://electronics.stackexchange.com/questions/240278/controller-area-network-received-message-filtering-mechanism

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charles:

    以下是我们的理解、

    ARB ID - 000
    (按位或)
    掩模-010
    = 010


    节点 ID 1 - 001 - 000 (和)-不过滤

    节点 ID 2 - 010 - 010 (和)-滤波器

    节点 ID 3 - 011 - 010 (和)-滤波器

    节点 ID 4 - 100 - 000 (和)-不过滤

    节点 ID 5 - 101 - 000 (和)-不过滤

    节点 ID 6 - 110 - 010 (和)-滤波器

    节点 ID 7 - 111-010 (和)-滤波器

    -----------------------------------------------------------------------------------------------------------------------------

    如果 AND 操作的输出为0、不过滤收到的 CAN 消息、否则过滤接收

    -----------------------------------------------------------------------------------------------------------------------------
    但是、当我们尝试以下组合时、理解不起作用

    ARB ID - 010
    (按位或)
    面罩- 111
    = 111

    节点 ID 1 - 001 - 001 (和)-滤波器

    节点 ID 2 - 010 - 010 (和)-滤波器、但未进行滤波

    节点 ID 3 - 011 - 010 (和)-滤波器

    节点 ID 4 - 100 - 000 (和)-过滤器

    节点 ID 5 - 101 - 000 (和)-过滤器

    节点 ID 6 - 110 - 010 (和)-滤波器

    节点 ID 7 - 111-010 (和)-滤波器

    请帮助我理解。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于等于1的屏蔽位、就像在总线上具有存储在 相应位的 sCANMessage.ui32MsgID 中的指定 ID 的传入 ID 之间执行异或逻辑。  XOR 的结果必须等于1。 对于等于0的掩码位、您不需要进行比较。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、如果 XOR 的结果等于1、则是滤波器、否则不进行滤波?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先在传入 ID 与在 sCANMessage.ui32MsgID 中指定的 ID 之间执行异或 。 XOR 的结果再次与存储在 sCANMessage.ui32MsgIDMask 中的掩码进行异或运算。 然后、异或结果的单独位也不确定是否应该过滤一个传入 ID。  

    请举一个例子1:

    ARB ID - 000
    掩模-010

    首先在传入 ID (使用3位 ID 示例的有8个组合)和 ARB ID (如示例中的000)之间执行异或运算

    传入 ID   Result1 (与000进行异或运算的结果)

    000          111

    001          110

    010          101

    011           100

    100           011

    101          010

    110          001

    111           000

    现在使用掩码来计算上述的异或结果(如您在示例中指定的010)

    结果1       Result2 (与 掩码010异或结果)

    111            010                    

    110           010

    101           000

    100           000

    011           010

    010           010

    001           000

    000           000

    结果2        RESULT3 (或全部3位)

    010           1

    010           1

    000           0

    000           0

    010           1

    010           1

    000           0

    000           0

    传入 ID  结果3  

    000         1         传递

    001         1         传递

    010         0         滤除了

    011         0         滤除了

    100         1         传递

    101         1         传递

    110          0         滤除了

    111          0        滤除了

    当您应用 ARB=000和 Mask=010 并在总线上注入8种不同的消息 ID 组合时、为什么不编写一些代码、看看是否符合您的要求。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     你现在是否清楚我的解释?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     您是否有任何更新、因为我没有收到 您的反馈?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我已经和你核对过几次了,但我没有听到你的回复。 我现在将关闭该主题。 如果你有任何疑问、可以写回、并且线程将自动重新打开。