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.

[参考译文] TMS570LC4357:如何为 CAN 设置接受滤波、以及需要配置哪些寄存器

Guru**** 2445440 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1288150/tms570lc4357-how-to-set-acceptance-filtering-for-can-and-which-registers-need-to-be-configured

器件型号:TMS570LC4357

以下是我配置的寄存器。 请帮助我检查是否有任何缺失的区域

canREG1->IF1MSK = 0xC0000000U |(UINT32)((UINT32) 0x000007FFU 和(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);
canREG1->IF1ARB =(UINT32) 0x80000000U |(UINT32) 0x40000000U |(UINT32)((UINT32)((UINT32) I &(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);
canREG1->IF1MCTL = 0x00001000U |(UINT32) 0x0000U |(UINT32) 0x0000U |(UINT32) 0x0000U |(UINT32) 8U;
canREG1->IF1CMD =(uint8) 0xF8U;
canREG1->IF1NO = I;

根据手册、与滤波相关的寄存器包括屏蔽、屏蔽[0:28]、MXtd 和 MDir。 我想问一下是否有缺失的区域

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

    canREG1->IF2MSK = 0xC0000000U |(UINT32)((UINT32) 0x0000U  和(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);
    canREG1->IF2ARB =(UINT32) 0x80000000U |(UINT32) 0x40000000U |(UINT32) 0x0000U |(UINT32)(((UINT32)((UINT32) 8U 和(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);
    canREG1->IF2MCTL = 0x00001000U |(UINT32) 0x00000400U |(UINT32) 0x0000U |(UINT32) 0x0000U |(UINT32) 8U;
    canREG1->IF2CMD =(uint8) 0xF8U;
    canREG1->IF2NO = 1U;

    例如、我将 CAN 邮箱1的 ID 号设置为8、并使用 USB_ CAN 工具将数据发送到 CAN、然后我想打开滤波以将其滤除、但上述配置无法实现所需的结果

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

    胡江波

    很抱歉我的响应出现延迟、我不明白您想要实现什么、但我将说明您的配置将执行什么操作:

    canREG1->IF2MSK = 0xC0000000U |(UINT32 )((UINT32 )((UINT32 ) 0x0000U  &(UINT32 ) 0x1FFFFFFFU)<<(UINT32 )0U);
    canREG1->IF2ARB =(UINT32) 0x80000000U |(UINT32) 0x40000000U |(UINT32) 0x0000U |(UINT32)(((UINT32)((UINT32) 8U 和(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);
    canREG1->IF2MCTL = 0x00001000U |(UINT32) 0x00000400U |(UINT32) 0x0000U |(UINT32) 0x0000U |(UINT32) 8U;
    canREG1->IF2CMD =(uint8) 0xF8U;
    canREG1->IF2NO = 1U;

    该配置将进行设置、

    扩展标识符为1 (29位标识符用于该报文对象)

    报文方向为0 (方向=接收)

    屏蔽扩展标识符为1 (扩展标识符位(IDE)用于接收过滤)

    屏蔽消息方向为1 (消息方向位(Dir)被用于接收滤波)

    您要将 ID 设置为 8、

    屏蔽位为0x0 (这意味着至少没有用于 ID 过滤的位)

    即使将接受 ID 设置为8、但同时将屏蔽位写为0也是正确的、因此 CAN 帧的所有 ID 都 将推入此 报文对象(即1)。

    --
    谢谢。此致、
    Jagadish。

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

    感谢您的回答。 如果我要滤除 ID 编号8、我应该如何配置它。

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

    canREG1->IF2MSK = 0xC0000000U |(UINT32)((UINT32) 0x00000008U  和(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);

    如果我以这种方式配置、我可以滤除 ID 编号8、

    然而,在实际实验过程中,仍将收到带有 ID 8的数据。

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

    尊敬的胡江博:

    canREG1->IF2MSK = 0xC0000000U |(UINT32)((UINT32) 0x00000008U  和(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);

    如果我以这种方式配置、我可以滤除 ID 编号8、

    [/报价]

    实际上它不是正确的方法、因为。

    将0x8 (二进制1000)写入右屏蔽位时:

    如果一个屏蔽位1意味着标识符的相应位将被用于接受过滤、如果您写入0意味着按摩标识符中的相应位将不会被用于接受过滤。 当我们向屏蔽位写入8时、只有标识符的位3将被用于在 ID 的29位之间进行接收滤波。 这意味着只有位3将被验证用于接受过滤并且29位标识符的所有其它位将被忽略。

    如果接收到的 CAN 消息带有一些 x ID、则只会使用配置的 ID (ARB ID[28:0])验证其位3、如果位3匹配、则相应的消息将被移至消息对象。 并且其他位将不会被验证、因为我们刚刚将屏蔽寄存器中的位3配置为1、所有其他位配置为0。

    例如、

    如果我收到一条 ID 为0至7的 CAN 报文、它们不会被移至报文对象、因为这些报文的位3值0与配置的 ID 位3不匹配。(这只是必需的行为)

    如果我收到 ID 为 8的 CAN 消息、 它将被移至消息对象、因为此消息 的位3值 1与配置的 ID 位3匹配。(这也是仅需满足的行为)

    但是想象一下、如果我收到 ID 为24的 CAN 消息、它的位3和位4都设置了位4、但这里的位4将不会验证是否匹配、因为它对应的匹配位是0、 因此、 它通常只会验证位3是否匹配、它将与我们的 ID 位匹配、并且此消息也会移动到消息目标。 (这不是必需的行为、也不是预期的)。   ID (25到31、40到47、56到63等等)也会发生同样的情况、因为所有这些 ID 的位3都为1、所以可以将消息过滤到消息对象。

    因此、如果您 只想滤除消息 ID8、则应按如下方式进行配置:

    canREG1->IF2MSK = 0xC0000000U |(UINT32)((UINT32) 0x1FFFFFFFU 和(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);
    canREG1->IF2ARB =(UINT32) 0x80000000U |(UINT32) 0x40000000U |(UINT32) 0x0000U |(UINT32)(((UINT32)((UINT32) 8U 和(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);
    canREG1->IF2MCTL = 0x00001000U |(UINT32) 0x00000400U |(UINT32) 0x0000U |(UINT32) 0x00000080U |(UINT32) 8U;
    canREG1->IF2CMD =(uint8) 0xF8U;

    您可以看到、我在这里将所有29个屏蔽位配置为1、这意味着所有 ID 位都将用于接受滤波、这里我的 ID 是8。 因此、这意味着如果一个 CAN 消息被接收、那么所接收到的 CAN 消息的所有 ID 位都将与 ID 8进行比较以实现匹配、并且只有匹配的 ID 将被移动到消息对象中。 在本例中、我没有收到任何不需要的消息到我的消息对象。

    --
    谢谢。此致、
    Jagadish。

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

    我了解。 非常感谢