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.

[参考译文] TMS320F28379D:使用哪个 ifxarb??在 DCAN 中接收到的消息对象中提取消息 ID

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/610176/tms320f28379d-message-id-extract-in-the-received-message-object-in-dcan-using-which-ifxarb

器件型号:TMS320F28379D

大家好、

使用 setubject 方法配置了两个消息对象:一个是 TX、另一个是 Rx。

想要在 getcanmessage 中提取接收报文对象中的报文标识符、如下所示、为什么 if2arb 寄存器中不提供报文 ID、因为通过将 msgnum 分配给 if2cmd 寄存器集、if2data 寄存器中可以提供数据。

由于已使用 if1arb 重定位器设置消息,因此即使在 getcanmessage 方法中将 msgnum 分配给 if2cmd 寄存器集,消息 ID 仅在 if1arb 寄存器中可用。

请清除这些混乱????

「香港

//
// getCANMessage -检查消息对象是否有新数据。
//如果是新数据,则写入数组并返回 true 的数据。
//如果没有新数据,则返回 false。
//
bool getCANMessage (uint32_t Objid)

bool 状态;
uint32_t arbreg1value;
uint32_t arbreg2value;
uint32_t msgid1;
uint32_t msgid2;
//
//设置要读取的消息数据 A、数据 B 和控制值
//从报文对象请求数据时。
//
CANARegs.CAN_IF2CMD.ALL = 0;
CANARegs.CAN_IF2CMD.bit.Control = 1;
CANARegs.CAN_IF2CMD.bit.DATA_A = 1;
CANARegs.CAN_IF2CMD.bit.DATA_B = 1;

//
//将报文对象传输到报文对象 IF 寄存器。
//
CANARegs.CAN_IF2CMD.bit.MSG_NUM = Objid;

//
//等待忙位清零。
//
while (CANaRegs.CAN_IF2CMD.bit.BUSY)

//
//查看是否有可用的新数据。
//
if (CANaRegs.CAN_IF2MCTL.bit.NewDat = 1)

//
//从 CAN 寄存器中读出数据。
//
uint16_t 索引;
arbreg1value = CanaRegs.CAN_IF1ARB.all;
arbreg1value = arbreg1value & CAN_IF1ARB_STD_ID_M;
msgid1 = arbreg1value >> CAN_IF1ARB_STD_ID_S;  // if1arg 寄存器中存在预期值

arbreg2value = CanaRegs.CAN_IF2ARB.all;
arbreg2value = arbreg2value & CAN_IF1ARB_STD_ID_M;
msgid2 = arbreg2value >> CAN_IF1ARB_STD_ID_S;
for (index = 0;index < messageSize;index++)

switch (索引)

情况0:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATA.bit.Data_0;
中断;
案例1:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATA.bit.Data_1;
中断;
案例2:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATA.bit.Data_2;
中断;
案例3:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATA.bit.Data_3;
中断;
案例4:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATB.bit.Data_4;
中断;
情况5:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATB.bit.Data_5;
中断;
案例6:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATB.bit.Data_6;
中断;
案例7:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATB.bit.Data_7;
中断;

//
//清除新数据标志
//
CANaRegs.CAN_IF2CMD.bit.TxRqst = 1;

//
//等待忙位清零。
//
while (CANaRegs.CAN_IF2CMD.bit.BUSY)

//
//将报文对象传输到报文对象 IF 寄存器。
//
CANARegs.CAN_IF2CMD.bit.MSG_NUM = Objid;

状态= true;

其他

状态= false;

退货(状态);

「香港

设置对象对于 TX 消息和 Rx 消息对象都是通用的、如下所示。

(小部分

//
// setupMessageObject -将消息对象设置为发送或接收
//
void setupMessageObject (uint32_t Objid、uint32_t msgid、msgObjType msgType)

//
//等待忙位清零。
//
while (CANaRegs.CAN_IF1CMD.bit.BUSY)

//
//清除并写出寄存器以编程报文对象。
//
CANARegs.CAN_IF1CMD.ALL = 0;
CANaRegs.CAN_IF1MSK.ALL = 0;
CanaRegs.CAN_IF1ARB.all = 0;
CANaRegs.CAN_IF1MCTL.ALL = 0;

//
//设置 Control、Mask 和 ARB 位,以便将它们传送到
//消息对象。
//
CANARegs.CAN_IF1CMD.bit.Control = 1;
CanaRegs.CAN_IF1CMD.bit.ARB = 1;
CANARegs.CAN_IF1CMD.bit.Mask = 1;
CANARegs.CAN_IF1CMD.bit.DIR = 1;

//
//设置发送方向
//
if (msgType = MSG_obj_type_transmit)

CANARegs.CAN_IF1ARB.bit.Dir = 1;

//根据第2246页
//CanaRegs.CAN_IF1MCTL.bit.umask = 0x7ff;

//
//设置消息 ID (此示例假定11位 ID 掩码)
//StdID
CANaRegs.CAN_IF1ARB.bit.XTD = 0;

msgid =(msgid << CAN_IF1ARB_STD_ID_S);
msgid = msgid & CAN_IF1ARB_STD_ID_M;
CanaRegs.CAN_IF1ARB.bit.ID = msgid;
//CanaRegs.CAN_IF1ARB.bit.StdID = msgid;
CANARegs.CAN_IF1ARB.bit.MsgVal = 1;

//
//设置数据长度,因为这是为所有传输设置的。 这是
//也是单次传输,而不是 FIFO 传输,所以将 EOB 位置位。
//
CanaRegs.CAN_IF1MCTL.bit.DLC =消息大小;
CANaRegs.CAN_IF1MCTL.bit.EOB = 1;

//
//将数据传输到消息对象 RAM
//
CANaRegs.CAN_IF1CMD.bit.MSG_NUM = Objid;

(小部分

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我写信告诉您、C2000团队成员已被分配到此帖子、应该很快回答。

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

    getCANMessage 不会将 ARB 设置为从报文对象读取到 IFX 寄存器中。
    需要添加的内容
    CANARegs.CAN_IF2CMD.bit.Control = 1;
    CANARegs.CAN_IF2CMD.bit.DATA_A = 1;
    CANARegs.CAN_IF2CMD.bit.DATA_B = 1;
    CanaRegs.CAN_IF2CMD.bit.ARB = 1;//添加此行

    请参阅 CAN 部分中的 TRM 以了解有关 IFx 寄存器的更多信息。 IFxCMD 用于设置要读取/写入报文对象 RAM 的数据

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

    大家好、Christopher Chiarella、

    感谢您的回复。

    如果是这种情况、我没有在 getCanMessage 方法中设置 CanaRegs.CAN_IF1CMD.bit.Control=1、

    但是、IF1MCTL 和 IF2MCTL 寄存器中都有 DLC 大小、原因是什么????

    (三

    getCANMessage (getCANMessage)()

    //

    //设置要读取的消息数据 A、数据 B 和控制值

    //从报文对象请求数据时。

    //

    CANARegs.CAN_IF2CMD.ALL = 0;

    CANARegs.CAN_IF2CMD.bit.Control = 1;

    CANARegs.CAN_IF2CMD.bit.DATA_A = 1;

    CANARegs.CAN_IF2CMD.bit.DATA_B = 1;

    ----

    ----

    if (CANaRegs.CAN_IF2MCTL.bit.NewDat = 1)

       messageSize1 = CanaRegs.CAN_IF1MCTL.bit.DLC;

       messageSize2 = CanaRegs.CAN_IF2MCTL.bit.DLC;

    (三

    以下是调试窗口中的 CANA 寄存器转储:

    521177 40.

    R CanaRegs_CAN_CTL 0x0000000B 0x00011400

    R CanaRegs_CAN_ES 0x0000000B 0x00000007

    R CanaRegs_CAN_ERRC 0x0000000B 0x00000000

    R CanaRegs_CAN_BTR 0x0000000B 0x00003467

    R CanaRegs_CAN_INT 0x0000000B 0x00000000

    R CanaRegs_CAN_TEST 0x0000000B 0x00000080

    R CanaRegs_CAN_PERR 0x0000000B 0x00000000

    R CanaRegs_CAN_REL 0x0000000B 0xA3170504

    R CanaRegs_CAN_RAM_INIT 0x0000000B 0x00000005

    R CanaRegs_CAN_GLB_INT_EN 0x0000000B 0x00000000

    R CanaRegs_CAN_GLB_INT_FLG 0x0000000B 0x00000000

    R CanaRegs_CAN_GLB_INT_CLR 0x0000000B 0x00000000

    R CanaRegs_CAN_ABOTR 0x0000000B 0x00000000

    R CanaRegs_CAN_TXRQ_X 0x0000000B 0x00000008

    R CanaRegs_CAN_TXRQ_21 0x0000000B 0x80000000

    R CanaRegs_CAN_NDAT_X 0x0000000B 0x00000009

    R CanaRegs_CAN_NDAT_21 0x0000000B 0x80000002

    R CanaRegs_CAN_IPEN_X 0x0000000B 0x00000000

    R CanaRegs_CAN_IPEN_21 0x0000000B 0x00000000

    R CanaRegs_CAN_mval_X 0x0000000B 0x00000001

    R CanaRegs_CAN_mval_21 0x0000000B 0x00000003

    R CanaRegs_CAN_IP_MUX21 0x0000000B 0x00000000

    R CanaRegs_CAN_IF1CMD 0x0000000B 0x00870001

    R CanaRegs_CAN_IF1MSK 0x0000000B 0x638A8ABD

    R CanaRegs_CAN_IF1ARB 0x0000000B 0x98000000

    R CanaRegs_CAN_IF1MCTL 0x0000000B 0x00000088

    R CanaRegs_CAN_IF1DATA 0x0000000B 0x00500069

    R CanaRegs_CAN_IF1DATB 0x0000000B 0x96008002

    R CanaRegs_CAN_IF2CMD 0x0000000B 0x00330002

    R CanaRegs_CAN_IF2MSK 0x0000000B 0xFFFFFFFF

    R CanaRegs_CAN_IF2ARB 0x0000000B 0x98000000

    R CanaRegs_CAN_IF2MCTL 0x0000000B 0x00008088

    R CanaRegs_CAN_IF2DATA 0x0000000B 0x00500169

    R CanaRegs_CAN_IF2DATB 0x0000000B 0x00000000

    R CanaRegs_CAN_IF3OBS 0x0000000B 0x00000000

    R CanaRegs_CAN_IF3MSK 0x0000000B 0xFFFFFFFF

    R CanaRegs_CAN_IF3ARB 0x0000000B 0x00000000

    R CanaRegs_CAN_IF3MCTL 0x0000000B 0x00000000

    R CanaRegs_CAN_IF3DATA 0x0000000B 0x00000000

    R CanaRegs_CAN_IF3DATB 0x0000000B 0x00000000

    R CanaRegs_CAN_IF3UPD 0x0000000B 0x00000000

    谢谢

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

    您可能在两个位置都看到它、因为您使用 IF1来设置消息、并且数据在被推送到消息目标 RAM 后仍保留在 MCTL 中。 然后、您将数据从消息对象 RAM 读取到 IF2中、使它们匹配。

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

    感谢您的澄清。

    正在将基于 eCAN 的应用程序迁移到 dCAN,如果您有 C2000软件或控制套件中不可用的任何文档,请与我分享。
    请在下面澄清一下。
    eCAN 中有一个寄存器集来获得 CPU 对消息框的控制或者放弃在运行时配置或设置消息目标。
    dCAN 中的哪个位类似、它是否仅占线位?

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

    除了引用 TRM 以及引用示例和 driverlib API 之外、我没有任何文档建议。

    是的、许多寄存器、例如 IFx、都需要等待 BUSY 位清零。 其它诸如写入配置寄存器的操作要求在手之前设置 CCE (配置改变使能)位。 请参阅 driverlib API 以了解这些正在使用的 API。

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


    如果它受 CCE 保护、那么它可以在 TRCM 中注意到写入受 CCE 位保护、例如 CAN_BTR.BRPE。
    我想我们可以设置报文对象、即使 INIT 位为零。

    我现在正在查看 driverlibAPS、请您在下面的帖子中澄清一下。

    e2e.ti.com/.../610868

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

    是的、遵循 TRM 在每个寄存器的写保护方面所说的内容。

    此致
    Chris