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.

[参考译文] TMS320F280037C:MCAN 模块在1kHz 接收频率下停止工作

Guru**** 2530320 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1315391/tms320f280037c-mcan-module-stop-working-at-1khz-reception-frequency

器件型号:TMS320F280037C
主题中讨论的其他器件:SysConfig

您好!

我正在通过 CAN FD 和 MCAN 开发 CANopen 模块。 此应用要求周期为1ms 的同步接收。 CAN 由两个中断来控制以确保周期性、一个中断用于 SYNC 和 NMT 对象、另一个中断用于 rpdos。 SYNC 和 NMT 的中断将消息发送到 Rx 缓冲区。

我们遇到了一个问题、即在发送 SYNC 时 MCAN 模块被阻止。 应用程序在第一次同步期间会工作、但在5或6条消息之后停止发送响应。 在这种阻止状态下调试时、我看到与 SYNC 对应的缓冲区新数据的标志处于活动状态;但来自 mCAN 模块和 PIE 的中断未被触发、因此我认为 MCAN 模块由于某种原因没有触发中断。 但我找不到问题来解决、是否可以 提供一些帮助来解决该问题?

请注意、该程序在较低的速率下运行良好。 例如、此应用以5ms 的周期运转良好。 此外、为了防止在某个时刻触发具有更高优先级的中断并阻止了 mCAN 模块、但应用接收速度不高、我尝试禁用所有具有更高优先级的中断(我有嵌套中断)。

不幸的是,我不知道我还能检查什么,所以帮助会很感激.

此致、

大卫

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

    David、您好!

    在两个中断服务例程上、请检查是否正在清除并确认发生的中断标志。  否则将导致溢出并阻止代码进入中断。  还要检查中断服务例程中是否有被调用的函数、相对于中断发生的频率、这些函数的执行可能需要时间。  当另一个中断发生时、某些函数可能仍在运行。

    此致、

    约瑟夫

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

    Joseph、您好!

    感谢您的建议、但我已经这么做了。 我测量了中断执行时间、并以1ms 中断周期同时获得了100us。 此外、我正确清除了与技术参考手册相关的所有中断。 我正在按正确的顺序清除 IE 寄存器、PIE 寄存器和 MCAN 中断标志寄存器。

    调试一段时间后、我发现通过注释函数 MCAN_writeMsg、中断工作正常。 在同一个中断中、我写入在接收到同步时需要发送的 TPDO 消息。 此函数似乎在某种程度上阻碍了 MCAN 模块、并使其进入一种状态、在该状态下、新数据标志有效、但中断得到确认。

    此外、请注意、我使用的是电机控制 SDK 4.0。 我还是用最新版本的 SDK 检查了一下、结果函数完全相同。

    此致、

    大卫

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

    请注意、在此消息中、我附加了消息 RAM 配置的 SysConfig、因为寻址可能存在一些问题。

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

    尊敬的 David:

    典型的用于传输的 CAN ISR 仅检查标志、并会因传输事件而设置用户变量。  修改消息对象、例如使用 MCAN_writeMsgRAM 在 ISR 之外和部分消息初始化中完成。  根据您的应用说明、似乎最好使用 TX 事件 FIFO。  我们的想法是 为 SYNC 和 NMT 编写消息对象、以便在 SYNC 消息被发出并得到确认后、NMT 会立即被发出、

    driverlib 中有一个示例对此进行了说明、您可能需要尝试一下这种方法是否效果更好。  该示例名为 mcan_ex13_transelate_TxEventFIFO。

    此致、

    约瑟夫

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

    Joseph、您好!

    这是一个使用 TX 事件 FIFO 的有趣解决方案。 但是、我们为了响应同步对象而发送的消息是包含来自电机的数据的消息、必须在收到同步后立即更新。 该消息包含机器人的控制数据。 因此、应使用在接收同步之前获得的最后一个样本更新数据。 我如何才能在没有中断的情况下实现它? 如果我像调度程序一样使用正常代码流、则位置会很长时间不更新变量。 另外、对于同步周期、更新速度可能无法达到周期快10倍左右。

    为了帮助您解除系统损坏、应用从电机以50kHz 的频率从 ADC 获取数据、这些变量通过 CAN 发送到控制器、进而使用周期性命令进行响应。 在接收同步对象之前使用最后一次采样更新数据变量、这一点非常重要。

    此致、

    大卫

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

    尊敬的 David:

    我可能误解了您的应用程序的功能。  我认为您是连续发送 SYNC 和 NMT 对象、因此我建议使用 TX FIFO 方法、 但事实证明、一个节点正在发送同步(CAN-FD 帧)、接收节点从该同步帧中提取消息、并在接收到消息时读取 ADC 结果、然后将其作为 CAN 帧发回。  此过程会以1ms 的间隔(1KHz)重复、您发现接收节点中出现了这个问题? 我的理解是否正确?

    此致、

    约瑟夫

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

    Joseph、您好!

    这正是我们总结的应用。 我很抱歉没有解释好自己。

    此致、

    大卫

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

    尊敬的 David:

    不用担心、我只是想确保我对您的应用有正确的了解。  您在前面提到过、您能够测量100us ISR 执行情况。  不确定这是否也包括将 ADC 读数传输到 CAN 总线。  如果您可以分享标称段和数据段的 CAN-FD 比特率、可能有助于获得更清晰的图像。  您是否还可以分享在1ms 间隔内接收到的同步部分中有多少有效载荷以及从 ADC 读数中发送多少载荷?  只是想快速计算 CAN 帧的时长。  您还指出、在5ms 的同步持续时间内、一切都正常。  对我来说、这表明帧持续时间可能长于1ms、并且消息可能没有足够的时间进行接收和确认、因此在1ms 间隔下只能成功5或6次。  还要检查错误寄存器和计数器的内容。  它们还可以根据最后的错误代码提供线索。

    此致、

    约瑟夫

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

    Joseph、您好!

    对不起,回复晚了,你给了一些想法,看看发生了什么,我忘了回答。 这就是我之前想的、消耗时间非常长、导致中断饱和。 实际上、虽然我将传输周期配置为1ms、但 pcanview 的 Windows 应用程序在不同的周期发送消息。 因此,通过观察示波器,我观察到,有时发送的信息是与50我们分开。 这使得中断崩溃、并且永远不允许更多的中断。 我们使用了相同产品的副本、但充当了主站、应用程序工作起来就像一种魅力。

    感谢您为我提供所需的方向信息。

    此致、

    大卫