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.以28075为例,该芯片有2个完全相同的CAN模块,分别是CANA和CANB。每次CAN模块都有32个邮箱,mailbox,也被称为message object。在使用的时候,这32个邮箱都需要对其进行编号,编号范围从0~31(如果不连续设置,比如设置一个邮箱编号为33,那就是错误的?)。不知道这个理解是否正确?

2.有多种不同的identifier,比如CAN identifier、message identifier,又有简写,如CAN ID、MID,不知道这俩是否是前面俩的简写?另外,还出现了MSGID、MsgVal、messager object ID、messager object ID number、邮箱标识符、报文标识符等,这些该如何区分呢?是否identifer、ID、标识符这三者是一个意思?

3.顺着上面的内容,是否每个节点设备需要一个ID、每个节点设备需要ID、每个节点ID的邮箱需要ID、每个节点邮箱发送的报文需要ID?

3.CAN模块里有两个优先级比较:当同一时刻,多个不同节点的设备向总线发送数据,这个时候就会使用报文标识符来判断优先级;当同一个设备需要传输多个数据时,那就根据邮箱编号来判断优先级。不知道这样理解是否正确?

4.目前的例程里,主要是用CANA发送一个固定Message Identifier的数据,接收是用CANB来接收相同Message Identifier的数据。这样因为Message Identifier是相同的,就相对比较简单。但在实际应用中,需要传输多个不同类型的变量数据,那么自然需要为每一个数据设置独特的Message Identifier。这个时候对于接收方来说,应该是需要通过Message Identifier来判断收到的数据是什么变量,这种多Message Identifier来传输多个数据的设置怎么弄吗?目前有例程可以参考吗?

5.CAN_setupMessageObject函数用来设置哪个邮箱发送哪个MSGID的数据,那如何实现同一个邮箱发送多个不同MSGID的数据呢?连续使用多个CAN_setupMessageObject函数不会导致前面的被后面的覆盖吗?

CAN_setupMessageObject(CANB_BASE, RX_MSG_OBJ_ID, 0x95555555,
CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_RX, 0,
CAN_MSG_OBJ_RX_INT_ENABLE, MSG_DATA_LENGTH);

  • 您的问题比较多,我需要整理一下,我将会尽快回复您。

  • 你好,

    以28075为例,该芯片有2个完全相同的CAN模块,分别是CANA和CANB。每次CAN模块都有32个邮箱,mailbox,也被称为message object。在使用的时候,这32个邮箱都需要对其进行编号,编号范围从0~31(如果不连续设置,比如设置一个邮箱编号为33,那就是错误的?)。不知道这个理解是否正确?

    F28075中有两个 CAN 模块。 两个模块完全相同、彼此完全独立。 message object(or mailbox)的编号为1至32 (而不是0至31)。 此编号是固定的。 没有邮箱33、34等 。

    2.有多种不同的identifier,比如CAN identifier、message identifier,又有简写,如CAN ID、MID,不知道这俩是否是前面俩的简写?另外,还出现了MSGID、MsgVal、messager object ID、messager object ID number、邮箱标识符、报文标识符等,这些该如何区分呢?是否identifer、ID、标识符这三者是一个意思?

    没有CAN identifier 或者CAN ID。只有像message identifier 或者 message ID 或者MSGID或者ARB ID。“message object ID” 或者 “message object ID number”指message object(1到32)。identifier、ID和标识符是一个意思。ID是identifier的缩写,标识符是中文翻译。

    3.顺着上面的内容,是否每个节点设备需要一个ID、每个节点设备需要ID、每个节点ID的邮箱需要ID、每个节点邮箱发送的报文需要ID?

    每个message object需要ID。任何在总线上传输的message都需要ID。

    3.CAN模块里有两个优先级比较:当同一时刻,多个不同节点的设备向总线发送数据,这个时候就会使用报文标识符来判断优先级;当同一个设备需要传输多个数据时,那就根据邮箱编号来判断优先级。不知道这样理解是否正确?

    你的理解是正确的。如果不同的节点在同一时间尝试传输信息,优先级取决于message ID。在同一个节点内有多个message需要传输,优先级取决于message object ID number。

    4.目前的例程里,主要是用CANA发送一个固定Message Identifier的数据,接收是用CANB来接收相同Message Identifier的数据。这样因为Message Identifier是相同的,就相对比较简单。但在实际应用中,需要传输多个不同类型的变量数据,那么自然需要为每一个数据设置独特的Message Identifier。这个时候对于接收方来说,应该是需要通过Message Identifier来判断收到的数据是什么变量,这种多Message Identifier来传输多个数据的设置怎么弄吗?目前有例程可以参考吗?

    c2000ware 例程只是展示如何传输信息和接受信息。在使用例程时,你可以随时改变传输的东西(MSGID),你也可以重新配置接收信息,你可以只接收一个MSGID,或者多个MSGID,或者任意一个MSGID。后两个需要信息过滤,参考 www.ti.com/lit/SPRACE5,有一个过滤相关的例程。

    5.CAN_setupMessageObject函数用来设置哪个邮箱发送哪个MSGID的数据,那如何实现同一个邮箱发送多个不同MSGID的数据呢?连续使用多个CAN_setupMessageObject函数不会导致前面的被后面的覆盖吗?

    你需要使用该函数每次你想要更新MSGID的时候。是的,它会覆盖之前的值。

    手册中相关CAN的章节解释了MCU中CAN 协议的实现,即解释了各种CAN寄存器/位的功能。但是,并没有介绍CAN协议本身。了解协议本身请参考以下视频:

    https://training.ti.com/automotive-can-overview

    https://training.ti.com/ti-precision-labs-canlinsbc-can-and-can-fd-protocol?context=1139747-1138099-1139707-1138111

    https://training.ti.com/ti-precision-labs-canlinsbc-can-and-can-fd-overview?context=1139747-1138099-1139707-1138109

    https://training.ti.com/ti-precision-labs-canlinsbc-can-physical-layer?context=1139747-1138099-1139707-1138110  

  • 感谢回复!

    关于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,不知是否正确?

  • 你好,您问了一个全新的问题,并且比较长,请点击提出新问题或者提出相关问题来重新创建一个新帖子,以方便给其他工程师参考。由于您原始的问题已经解决,我将关闭这个帖子。