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.

[参考译文] TMS320F2.8377万S:F2837X DCAN示例setupMessageObject()和getCANMessage()组合

Guru**** 2487105 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/658639/tms320f28377s-f2837x-dcan-example-setupmessageobject-and-getcanmessage-combine

部件号:TMS320F2.8377万S
主题:controlSUITE中讨论的其他部件

你好,冠军,

我在以下示例中找到F2.8377万S:

 controlSUITE中的"CAN_Loop_bitfields _CPU0"存在以下问题:

1.在 getCANMessage函数中,“忙”位检查在其他寄存器写入之后:

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;

//
//如果注册,则将消息对象转移到消息对象。
//
CanaRegs.CAN_IF2CMD.bit.MSG_NUM = Objid;

//
//等待忙位清除。
//
while (CanaRegs.CAN_IF2CMD.bit.Busy)

}

但是在 setupMessageObject功能中,“忙”位检查在其他寄存器写入之前:

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;

//
//设置控制,掩码和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;

因为在TRM中,在IFXCMD中的位,IFXMSK说它受繁忙位保护,所以它只能写入繁忙位=0,所以我不明白为什么 在getCANMessage函数中,它写入CMD,MSK提前注册,然后检查繁忙位,它有不能成功写入它的风险吗?

2.  在setupMessageObject函数和 getCANMessage/sendCANMessage类似的函数中,有大量寄存器再次写入

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;

//
//如果注册,则将消息对象转移到消息对象。
//
CanaRegs.CAN_IF2CMD.bit.MSG_NUM = Objid;

API中的设置相同,例如,如果我只使用IF2接收消息RAM 2,我想了解,这是否意味着,我可以将IF2设置为使用 setupMessageObject发送RAM2消息,然后在CAN0INT中,我可以直接在 CAN_IF2DATA中读取,而不能再次使用"getCANMessage"功能? 由于我的客户系统中的CAN通信会频繁触发,因此我们不能让它占用太多时间,因此它将影响主要ISR。 因此,最好使用较少的功能来执行此操作。

谢谢!
巴西  

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

    您好,Joe,

    请在下面找到我的答复:

    1.当CPU在IF1/IF2寄存器和消息RAM之间启动数据传输时,消息处理程序将相应命令寄存器中的繁忙位设置为'1'。 传输完成后,繁忙位将被设置回'0'。

    因此,在setupMessageObject中,在检查其它寄存器写入繁忙位之前,应确保在写入寄存器之前没有数据传输挂起,而在getCANMessage中,应在寄存器写入之后检查,以检查是否已完成从消息RAM到寄存器的传输。

    getCANMessage正在读取新数据,因此数据从RAM传输到IF2寄存器,因此在寄存器写入后检查繁忙位。

    2.根据我的理解,您无需在getCANMessage中再次配置CAN IF2寄存器。 我将更清楚地向大家介绍这方面的情况。

    希望这有所帮助。 如有任何其他澄清,请告诉我。

    谢谢,此致
    Harshmeet Singh