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.

[参考译文] F28M35H52C:有关活动通信期间 CANMessageClear ()安全性的阐述

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1451725/f28m35h52c-clarification-on-safety-of-canmessageclear-during-active-communication

器件型号:F28M35H52C

工具与软件:

您好!

我希望获得有关在 F28M35x 上的活动通信期间在 CAN 模块上使用 CANMessageClear ()的安全性方面的确认。

器件的技术参考手册(TRM)指出:

"也就是说、有一种情况会导致对消息 RAM 的写入访问丢失。 如果  MsgVal = 1表示正在访问的报文对象且 CAN 通信正在进行、那么从  IFx 寄存器到报文 RAM 的传输可能会丢失。 这是因为 IFx  寄存器写入报文 RAM 的操作发生在主机报文 处理器正在接收同一报文对象的报文的过程中、主机报文处理器进行读-修改-写访问之间。

为了避免接收邮箱出现这个问题、在更改以下任一项之前将 MsgVal 复位:Id28-0、XTD、Dir、DLC3-0、RxIE、 TxIE、RmtEn、EoB、UMask、Msk28-0、 MXtd 和 MDir。"

这意味着、当主机消息处理程序(在接收操作期间)并且 CPU 尝试同时更新消息 RAM 时、会发生争用。

根据我的理解:

1. MsgVal 不存储在报文 RAM 中:根据 TRM 中的图23-17 (报文对象的结构)、MsgVal 位驻留在专用寄存器中、与上面列出的字段分开、在主动通信期间这些字段显然是不安全的。

2. CANMessageClear ()的实现:

该函数等待 IF1 BUSY 位清零、修改 CAN_O_IF1_ARB 寄存器(清除 MsgVal)、然后启动到消息 RAM 的传输。 由于它只清除 MsgVal、因此该操作不会修改主机消息处理器在有效接收期间访问的消息 RAM 中的字段。

由此,我推断 CANMessageClear ()在有效 CAN 通信期间是安全调用的,因为清除 MsgVal 只是停用消息对象,而不会有与主机消息处理程序争用的风险。

您能否确认这个结论是否正确? 是否可以保证  正在进行的接收操作不会阻止清除 MsgVal、即使在总线处于活动状态时也是如此? 调用此函数和随后调用 CANMessageSet ()时是否有任何计时要求?

提前感谢您的支持!

此致、

安德烈