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.

[参考译文] TMS320F28335:CAN Rx–何时清除 RMP?

Guru**** 2602335 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/677955/tms320f28335-can-rx-when-to-clear-rmp

器件型号:TMS320F28335

请参阅 eCAN 参考指南- SPRUEU1

我需要在短时间内处理大量 CAN 消息。 按照本指南、我计划设置多个邮箱来接收消息、以最少数量保护除一个邮箱外的所有邮箱、并在消息到达时中断。

第3.2.4节接收消息提示

此示例使用邮箱3。 当接收到一条报文时、接收报文挂起寄存器(CANRMP)中相应的标志被设为1、并产生中断。 然后、CPU 可以从邮箱 RAM 中读取消息。 在 CPU 从邮箱读取消息之前、它应该首先清除 RMP 位(RMP.3=1)。 CPU 还应该检查接收消息丢失标志 RML.3=1。 根据应用的不同、CPU 必须决定如何处理这种情况。

读取数据后、CPU 需要检查 RMP 位是否没有被模块再次置位。 如果 RMP 位已设置为1、则数据可能已损坏。 CPU 需要再次读取数据、因为在 CPU 读取旧消息时接收到新消息。

在我看来、如果我读取数据之前清除受保护邮箱中的 RMP、那么我会邀请外设覆盖数据、即使还有另一个空邮箱可以使用。 因此、我认为我应该(1)读取数据、然后(2)清除 RMP。

如果邮箱受到保护、这应该是可以的、因为在读取之后、邮箱中不能存储新消息。
但是、如果它不受保护、并且 RML 在读取之前已经被置位、那么我想无法确定数据是否已被覆盖/损坏?

我缺少什么吗? 感谢您的任何帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于接收异步发生、始终存在竞争条件的可能性。 消息被覆盖的可能性在很大程度上取决于您的总线负载、CPU 负载(CPU 读取接收到的消息的速度)、您能够专用于接收功能的邮箱数量等 对于您的特定情况、您正在通过为接收分配多个 MBXes、为除最后一个 MBX 之外的所有 MBX 设置 OPC 位来执行正确的操作。 这是正确的做法。

    关于清除 RMP 位的具体问题、我同意您的评估、即它确实会使 MBX 被覆盖。 考虑一种情况、当您清除 RMP 位、但此时会发生一个高优先级中断、您必须进行处理。 在过渡期间、新消息始终可以覆盖旧消息。 但请记住、即使在1Mbps 时、下一帧也需要大约100us (假设平均帧长度为100位)、这会转换为数千个 CPU 周期。 因此、消息是否会丢失在很大程度上取决于应用程序。

    被置位的 RML 表示消息被覆盖。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。 非常好的答案。