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.

[参考译文] TMS320F28069:eCAN 发送 ACK 位在被清零后仍然置位

Guru**** 2587345 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/880521/tms320f28069-ecan-transmit-ack-bit-still-set-after-being-cleared

器件型号:TMS320F28069

您好!

我的 eCAN 中断服务例程有问题(邮箱0至30是接收邮箱、而邮箱31是发送邮箱):

INTERRUPT void canISR (void)
{
struct eECAN_REGS ECANShadow;

ECANShadure.CANRMP.ALL = ECANRAGS.ALL;
ECANShadure.CANGA.ALL = ECANanaRegs.CANGA.ALL;

ECANShadure.CANGIF0.ALL = ECANAREGS.CANGIF0.ALL



= ECANG0.CANGIF0.CANGIF0.ALL;(如果是) 执行某些操作

//清除所有系统中断标志
ECANaRegs.CANGIF0.ALL = ECANShadure.CANGIF0.ALL;

//确认中断以接收来自 PIE 组9
的更多中断 PieCtrlRegs.PIEACX.ALL |= PIEACK_group9;
return;
}

const UINT16 mailBox= ECANNOT.AMOBI0...(

如果
是)
执行
其他操作}

{
ECanaRegs.Canta.all = ECanShady.Canta.all;//这应清除 ECanaRegs.Canta.bit.TA31
}


//确认中断以从 PIE 组9
PieCtrlRegs.PIEACK.ALL |= PIEACK_group9接收更多中断;
} 



它几乎始终运行良好、但在极少数情况下、CANTA .TA31未被正确清除、因此从未触发其他 eCAN 中断。

我发现、发生这种情况时:
-最后一个触发的中断实际上是一个发送邮箱中断、实际上 CANGIF0.MIV0 = 31并且 CANTA .TA31被置位
- CANGIF0.GMIF0被置位并且 CANGIF0中没有其他位被置位(实际上、有时 CANGIF0.TCOF 也被置位、但是这不应该触发任何中断、因为 CANGIM.TCOM = 0)
-所有 CAN 错误寄存器为0
- CANTA TA31在分配 ECANARegs.CANTA 之后仍然被置位= ECANShady.CANTA all、该位应将其清除。


此外、我非常确信、在前一个任务仍处于待处理状态时、没有人会开始传输消息、因此我想 eCAN 模块应该在 CPU 尝试清除它的同时设置 TA31、这是毫无道理的

我无法随意重现此问题。


以下解决方法似乎可以正常工作:


ECanaRegs.Canta.all = ECanShady.Canta.all; do { ECANShady.Canta.all = ECanaRegs.Canta.all; if (ECANShading.Canta.all) { ECanaRegs.Canta.all = ECANShad.Canta.all; } while (ECANShad.Canta.all);

是否有人遇到过这样的问题? 我缺少什么吗?

谢谢!

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

    您是否了解 了 http://www.ti.com/lit/spra876中的调试提示

     

     

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

    您只有一个邮箱配置为传输(MBX31)。 如何为此邮箱启动传输? 您是否仅在从之前的传输中清除 TA31位后启动? 如果是这样、则消除了 CPU 试图清除 TA31但 CAN 模块尝试设置 TA31的竞争状态的可能性。 不、我没有听到/看到过这样的问题。 指令不能不随机执行。

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

    我有一个全局变量 canInterfaceTransanmitting、为了简单起见、我在上一篇文章中没有显示该变量。

    我开始传输消息时、我设置了 canInterfaceTransmitting = 1、我(尝试)清除 TA31时、我的中断服务例程中的 canInterfaceTransan发射= 0。 仅当 canInterfaceTransanmission = 0时才启动传输。

    此外、我在代码中添加了两个变量、一个变量计算我启动传输的次数、另一个变量计算为 MBX31调用中断服务例程的次数、它们始终具有相同的值。 我认为这应该进一步排除种族状况的可能性。

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

    由于您仅使用 MBX31进行传输、请修改您的代码以直接清除 CANTA 中的该位(而不是将 CANTA 读取为影子、然后将其写回 CANTA)。

    其他
    {
    ECanaRegs.Canta.all = 0x8000000;//这应该清除 ECanaRegs.Canta.bit.TA31
    }
    
    

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

    我会尝试。 可能需要一段时间(我猜是几天)才能检查这是否正常工作、因为我不知道如何自动重现问题、而且问题本身很少发生。

    无论如何、感谢您的建议。

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

    了解。 当问题很少出现、无法随时重现时、很难提出"解决方案"。 在游戏中可能还有其他无关的因素,但正如我刚才所说,每次执行指令时,都必须执行指令。 将等待您的更新。