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.

[参考译文] TMS320F28377S:最新版 CAN_setupMessageObject (C2000Ware_1_00_01_00)出现问题

Guru**** 2539500 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/606598/tms320f28377s-issue-with-latest-version-of-can_setupmessageobject-c2000ware_1_00_01_00

器件型号:TMS320F28377S
主题中讨论的其他器件:C2000WARE

您好!

在使用 C2000Ware 中的 driverlib 实现 CAN 接口期间、我遇到了一个问题、该问题似乎与近期对 CAN_setupMessageObject 所做的更改相关。 在我的代码中、CAN_setupMessageObject 被调用两次、以使用消息框 ID 31和13设置两个消息对象、一个用于 TX (启用中断)、一个 RX。

对于一个测试、CAN_sendMessage 会针对一个消息对象调用一次。 但是、结果会发送两条 CAN 消息、而不是一条。 调试 CAN_INT 显示了来自31号报文对象(预期)的一个中断、但来自32号报文对象的另一个中断不应被使用。

进一步的调试显示、在第二次调用 CAN_setupMessageObject 之后、不仅会在 CAN_mvL_21中设置预期的位、而且还会设置消息对象32的位(0xC0001000而不是0x40001000)。

此问题似乎与近期对 CAN_setupMessageObject 的更改有关。 这是版本 C2000Ware_1_00_00_00 (CAN.c)中的代码:

//$TI 发行版:F2837xS 支持库 v3.01.00.00 $
//$Release Date:Mon May 22 15:44:59 CDT 2017 $
[...]
// CAN_setupMessageObject
[...]
  //
   //清除并写出寄存器以编程报文对象。
   //
   HWREG_BP (base + CAN_O_IF1CMD)= 0U;
   HWREG_BP (base + CAN_O_IF1MSK)= 0U;
   HWREG_BP (base + CAN_O_IF1ARB)= 0U;
   HWREG_BP (base + CAN_O_IF1MCTL)= 0U;

   HWREG_BP (base + CAN_O_IF1CMD)= cmdMaskReg;
   HWREG_BP (base + CAN_O_IF1MSK)= maskReg;
   HWREG_BP (base + CAN_O_IF1ARB)= arbReg;
   HWREG_BP (base + CAN_O_IF1MCTL)= msgCtrl;

对于 C2000Ware_1_00_01_00、清除寄存器已删除(根据发行说明、启用优化时似乎存在问题):

//$TI 发行版:F2837xS 支持库 v3.00.00.00 $
//$Release Date:Wed Jan 25 16:06:35 CST 2017 $
[...]
// CAN_setupMessageObject
[...]
   //
   //写出寄存器以编程报文对象。
   //
   HWREG_BP (base + CAN_O_IF1CMD)= cmdMaskReg;
   HWREG_BP (base + CAN_O_IF1MSK)= maskReg;
   HWREG_BP (base + CAN_O_IF1ARB)= arbReg;
   HWREG_BP (base + CAN_O_IF1MCTL)= msgCtrl;

C2000Ware_1_00_00_00的旧版本似乎可以正常工作(尚未使用优化)。

此致、

Steffen

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

    我将进一步研究这一点。

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

    您的分析是正确的。 给您带来的不便、我深表歉意。

    我将在下一个 driverlib 修订版本中提交一个错误以修复此问题。
    您可以通过注释"HWREG_BP (base + CAN_O_IF1CMD)= cmdMaskReg;"并将函数中的最后一行替换为:
    HWREG_BP (base + CAN_O_IF1CMD)= cmdMaskReg |(Objid & CAN_IF1CMD_MSG_NUM_M);

    这在我的测试中是有效的。

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

    您的代码更改对我来说很有效、可以配置多个消息对象、并且 CAN 消息看起来很好。
    感谢您及时解决问题!

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

    尊敬的 Chris:

    修复程序正常工作时、我偶然发现 CAN_TXRQ_21和 CAN_NDAT_21中 ID 32的位存在某种奇怪的行为。
    上电后、两个寄存器都为0。

    通过 ID 32以外的其他不同消息对象发送 CAN 消息后、CAN_TXRQ_21和 CAN_NDAT_21都指示消息框 ID 32中存在挂起的传输和新数据、该数据未使用且未配置(CAN_mvL_21中的位31为0)。
    CAN_TXRQ_21和 CAN_NDAT_21均为0x8000000。

    当消息框 ID 32正在使用时、CAN_TXRQ_21和 CAN_NDAT_21中的两个位都为0、操作看起来正常。

    此致、
    Steffen

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

    有趣。 它会影响行为、还是只能在寄存器窗口和存储器窗口中看到该值?

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

    Chris、

    我看到表达式窗口(CanaRegs)中设置的位、但它们似乎不会影响操作。 状态为32的中断没有。
    如果配置并使用报文对象32、则一切看起来也正常工作(位31通常为0)。

    此致
    Steffen

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

    好的、谢谢。 我将提出一个问题、以便进一步了解这一点。 我最初猜测是内存窗口误读了该值、因为像这样的字节外设过去可能会导致此类问题。

    此致
    Chris