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.

[参考译文] TMS320F280049:F280049 CAN 问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/932207/tms320f280049-f280049-can-issue

器件型号:TMS320F280049

您好 Champ、

客户遇到 CAN 传输问题、CAN 传输在主循环中执行、如果不禁用中断(通过 DINT)、CAN 邮箱传输消息 ID 和数据有时将不匹配。  如果按如下方式禁用中断 ,CAN 发送将始终正确。

您能帮助告知原因吗?

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

    尊敬的 Johnson:

    我怀疑在主循环中修改 IF1寄存器值时可能会有正在进行的传输或挂起的中断。  您可以建议 查询 CAN_INT 寄存 器中的 INT1ID 或 INT10D 以查看是否有挂起的中断、或检查寄存器 CAN_TXRQ_21以查看是否有挂起的传输。

    此致、

    Joseph

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

    您好、Joseph、

    很抱歉、我找不到您!

    只能使用轮询来发送、但未启用 中断。

    如果有正在进行的传输或挂起的中断,为什么禁用中断可以解决问题?

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

    您好、Joseph、

    随附的是客户可以传输代码。

    您能 不能帮助告知可能的原因。

    e2e.ti.com/.../CANMessageSend.txt

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

    尊敬的 Johnson:

         代码片段仅显示发送功能(CANMessageSend)。   我看不到 CAN 设置功能、因此我实际上无法说出中断是否已启用。  无论如何、在挂起传输开始前修改报文对象的数据字节不会生效。   这可能是发生的情况、因此最好在修改数据之前检查是否有待处理的传输。

    此致、

    Joseph

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

    您好、Joseph、

    客户系统具有 CPUTIMER 中断和 PWM 中断。

    CAN 发送使用 IF1、但未启用 CANTX 中断。

    可以使用 IF2接收 并使能中断、接收处理方式为 attached.e2e.ti.com/.../CAN-receive.txt

    我的问题是  、如果以下代码被 CPUTIMER 或 PWM 中断等其他中断中断中断中断中断中断、 将会发生什么情况?

    显然,只需通过 DINT 执行以下代码来禁用中断,问题就会得到解决。

    函数下面使用的是16位访问、是否可能存在与此问题相关的16位访问?

    CAN_ADDR16 (ui32Base + CAN_O_IF1CMD + 2)= ui32CmdMaskReg >> 16;//写出寄存器以编程报文对象。
    CAN_ADDR16 (ui32Base + CAN_O_IF1MSK)= ui32MaskReg 和 CAN_REG_WORD_MASK;
    CAN_ADDR16 (ui32Base + CAN_O_IF1MSK + 2)= ui32MaskReg >> 16;
    CAN_ADDR16 (ui32Base + CAN_O_IF1ARB)= ui32ArbReg 和 CAN_REG_WORD_MASK;
    CAN_ADDR16 (ui32Base + CAN_O_IF1ARB + 2)= ui32ArbReg >> 16;
    CAN_ADDR16 (ui32Base + CAN_O_IF1MCTL)= ui32MsgCtrl & CAN_REG_WORD_MASK;
    CAN_ADDR16 (ui32Base + CAN_O_IF1CMD)= ui32ObjID 和 CAN_IF1CMD_MSG_NUM_M;

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

    尊敬的 Johnson:

    我没有适用于 CAN_ADDR16的宏、因此无法评论写入的发生方式。  我们在 driverlib 中针对 CAN 寄存器写入的内容是 HWREGH 和 HWREG_BP、但为了确保在 IF1寄存器上正确执行写入(在本例中为传输)、您可能可以单步执行代码、并查看在 CCS 中使用寄存器视图时是否发生写入。  最好在查看具有和不具有 DINT 的寄存器视图的同时单步执行代码。  当前 ISR 中的内容可能会覆盖 IF1内容或阻止其更新。  

    此致、

    Joseph

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

    您好、 Joseph、

    这个问题是随机发生的、大部分时间都没有问题。如果 CAN 总线负载很高、 在总传输时间为100时、可能有1个失败。

    无法单步执行代码以找到问题。

    我希望 您 能告知 可能的原因。

    您能不能建议 16位访问可能会出现问题?

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

    尊敬的 Johnson:

    不可以、16位写入不会导致随机发生这种问题。  如果 CAN 寄存器更新未正确进行、则 CAN 将无法正常工作。  我仍然认为定时器和 PWM ISR 例程中有一些会干扰 CAN 寄存器写入的内容。  可能需要检查这些 ISR 中的代码。

    此致、

    Joseph

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

    您好、Joseph、

    请注意!

    在计时器和 PWM ISR 例程中、永远不会处理 CAN 相关寄存器。  

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

    尊敬的 Johnson:

    如果无法单步执行代码、是否进行评估以在 ISR 中注释掉计时器和 PWM 代码(PIE 确认除外)、就像进行快速调试一样查看是否可以在没有 DINT 语句的情况下进行传输?  这样做的目的是查看 ISR 中是否有影响 CAN 的代码。

    谢谢、

    Joseph

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

    您好、Joseph、

    如果计时器和 PWM ISR 中没有代码、则不会出现问题。

     当 CPU 负载非常高时会发生此问题。

    CAN_ADD16()如下 所示,请告知可能的原因。

    谢谢!

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

    尊敬的 Johnson:

    不可以、16位寄存器写入不是问题。  在计时器和后台 EPWM ISR 中、可能会发生过多任务、以防止 CAN 寄存器在传输前的预期时间发生更新。

    此致、

    Joseph

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

    您好、Joseph、

    故障不会丢失 CAN 传输、 问题是 有时会发送 ID 和数据不匹配。

    需要您帮助分析以下代码被某些 ISR 中断的根本原因将导致此问题!

    请建议解决此问题的解决方案、客户 无法接受禁用中断以解决此问题、 或者如果我们可以告诉客户以下代码存在一些问题。

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

    尊敬的 Johnson:

    是否可以查看计时器和 ePWM ISR 代码?  想要了解 ISR 中需要 CPU 处理时间的例程、您是否知道这些 ISR 发生的频率是多少?  问题可能不在于 CAN、而在于 ISR 所做的工作。

    此致、

    Joseph

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

    您好、Joseph、

    CPUTIMER 为100us 中断,PWM 为10us 中断。 运行电机控制算法的 PWM 中断。

    正如我之前提到的、很难重复这个问题、这是随机发生的!  一次可能发生了10分钟。

    我们需要您帮助分析如果在没有禁用中断的情况下执行代码操作可能存在的风险。

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

    尊敬的 Johnson:

    如果不知道计时器和 PWM ISR 中包含哪些代码、我只能提出以下建议:

        -在 ISR 内部创建一个标志,并仅在 CAN 数据有效且准备更新时才将其设置为 true

        -在  更新 IFX 寄存器(CMD、MSK、ARB 和 MCTL)的主程序中,仅在标志设置为 true 时执行。  例如

    if (flag=true)
    {
    CAN_ADDR16 (ui32Base + CAN_O_IF1CMD + 2)= ui32CmdMaskReg >> 16;
    CAN_ADDR16 (ui32Base + CAN_O_IF1ARB)…
    :
    :
    flag = false;
    } 

    查看这是否可以在不禁用中断的情况下工作。

    此致、

    Joseph

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

    Joseph、

    尝试此测试毫无意义、我们已经知道 CAN 发送 问题是由 更新 IFX 寄存  器(CMD、MSK、ARB 和 MCTL)期间发生的 ISR 引起的。

    设置该标志 函数与 DINT 相同。