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.

TMS320F28075: CAN通信的滤波功能

Part Number: TMS320F28075
Other Parts Discussed in Thread: C2000WARE

关于CAN滤波这块,想请教下

1.手册中下图这个结构体是什么意思?这个并不是寄存器的配置位对吧?如何能将其中的位和具体寄存器对应上呢?比如说MsgVal,具体在哪个寄存器来设置其为0或者1呢?

2.关于Mask的使用。

我的理解是首先需要使能Mask功能,也就是在上面表格中需要设置UMask位为1才行,其次还需要根据MSGID的位数(11位或者29位)来设置相应的滤波配置位。

比如说发送出来的MSGID为0X0003(即最后两位为1)和0X0007(即最后三位为1)

如果不使能Mask功能,那么即使将CAN网络节点的CAN_setupMessageObject()函数的第三个输入参数配置为0X0003,该节点也依然会同时受到MSGID为0X0003和0X0007的两个报文信息,因为此时的Mask功能未使能,因此设置的接受报文ID数据(0X0003)是没有用的信息,不知道这种理解方式是否正确?

TI目前给的例程都是单发单收,但是接收端是设置了明确的MSGID(和发送的MSGID保持一致)。不太明白这种情况下接收端能接收到数据,是因为设置了不使用Mask功能,还是因为发送接收的MSGID是一致的。

在上面的例子中,如果只想要接受0X0003这个MSGID的数据,那么接收端是否应该配置接收MSGID信息为0X0003,并且要使能Mask、设置msgIDMask为全0XFFFFFFFF?

目前理解是,如果想要让接收节点的某一位严格匹配其MSGID中的相应位,那么就必须要使能Mask且相应位必须设置为1,不知是否正确?

3.目前TI例程里在对CAN进行配置的时候,主要是用到了CAN_setupMessageObject()函数,但在哪里能体现是否有使能Mask功能呢?

  • 你好,

    1.手册中下图这个结构体是什么意思?这个并不是寄存器的配置位对吧?如何能将其中的位和具体寄存器对应上呢?比如说MsgVal,具体在哪个寄存器来设置其为0或者1呢?

    这是message object的架构。请看图上的这句话:The grayed fields are those parts of the message object which are represented in dedicated registers。灰色部分有对应的寄存器设置。所有的CAN寄存器都在手册21.15章节有详细描述。请查看它们的详细介绍。

    3.目前TI例程里在对CAN进行配置的时候,主要是用到了CAN_setupMessageObject()函数,但在哪里能体现是否有使能Mask功能呢?

    看看这个例程是否有帮助。

  • 2.关于Mask的使用。

    我咨询资深工程师后回复您。

  • 2.关于Mask的使用。

    请看参考www.ti.com/lit/SPRACE5的解释,还有问题的话请让我知道。

    3.目前TI例程里在对CAN进行配置的时候,主要是用到了CAN_setupMessageObject()函数,但在哪里能体现是否有使能Mask功能呢?

    它在CAN_setupMessageObject()函数中通过参数的形式传输。

  • 阴影部分对应了寄存器

    那非阴影部分呢?Mtxd和MDir对数据filtering有影响,需要配置吗?但又是非阴影的,如何改变他们的数值呢?

  • 是否可以理解为,如果一个接受邮箱想要收到数据,那么在使能Mask的前提下,需要同时满足MXtd、MDir以及msgIDMask的同时影响?

  • 我已向工程师跟进,但是相关工程师需要过几天才能答复,感谢您的耐心,一旦有回复我会立即回复给您。

  • 我的理解是首先需要使能Mask功能,也就是在上面表格中需要设置UMask位为1才行,其次还需要根据MSGID的位数(11位或者29位)来设置相应的滤波配置位。

    正确。

    如果不使能Mask功能,那么即使将CAN网络节点的CAN_setupMessageObject()函数的第三个输入参数配置为0X0003,该节点也依然会同时受到MSGID为0X0003和0X0007的两个报文信息,因为此时的Mask功能未使能,因此设置的接受报文ID数据(0X0003)是没有用的信息,不知道这种理解方式是否正确?

    如果Mask功能没有被使能的话,发送的MSGID必须和接受的一致。拿你的例子来说,如果你设置了接受0x0003,那么只有ID为0x0003的信息会被接收,而不会接受0x0007的信息(或是其他ID的信息)。

    TI目前给的例程都是单发单收,但是接收端是设置了明确的MSGID(和发送的MSGID保持一致)。不太明白这种情况下接收端能接收到数据,是因为设置了不使用Mask功能,还是因为发送接收的MSGID是一致的。

    这很简单。如果Mask功能没有被使能,ID必须完全一致。如果你想在同一个recieve massage object接受不同ID的信息,那么必须使能mask。看下这个例程:C:\ti\c2000\C2000Ware_4_02_00_00\driverlib\f2807x\examples\cpu1\can\ can_ex10_mask.c

    massage object 的ID是0x1F9FFFFA。mask filter 是0x1F000000. 这意味这ID为 0x1Fxxxxxx的信息会被接受。xxxxxx代表“don't care”位,它可以是任意值。如果你想接收所有ID,你可以将mask的值写为0x00000000.

    在上面的例子中,如果只想要接受0X0003这个MSGID的数据,那么接收端是否应该配置接收MSGID信息为0X0003,并且要使能Mask、设置msgIDMask为全0XFFFFFFFF?

    如果你只想接受0x0003,那么你只要设置接受ID为0x0003并且不使能Mask就好,你可以使用Mask来实现相同的功能,但是没有必要。换句话来说,你只需要想在同一个recieve massage object中接收多个不同的ID时设置Mask功能。

    目前理解是,如果想要让接收节点的某一位严格匹配其MSGID中的相应位,那么就必须要使能Mask且相应位必须设置为1,不知是否正确?

    参考下上面的答案并让我知道你是否理解。

    阴影部分对应了寄存器

    那非阴影部分呢?Mtxd和MDir对数据filtering有影响,需要配置吗?但又是非阴影的,如何改变他们的数值呢

    MXtd and MDir 在 CAN_IFxMASK 寄存器中.其他位在 CAN_IFxARB, CAN_IF1MCTL, CAN_IF1DATA 和 CAN_IF1DATB 寄存器中. 你可以通过IFx 寄存器改变它们的值。请参考C2000Ware中的例程。

    是否可以理解为,如果一个接受邮箱想要收到数据,那么在使能Mask的前提下,需要同时满足MXtd、MDir以及msgIDMask的同时影响?

    正确。我在下面的链接中有做总结。

    请看Tables 2-1 & 2-2  www.ti.com/lit/SPRACE5.