工具与软件:
您好!
我希望获得有关在 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 ()时是否有任何计时要求?
提前感谢您的支持!
此致、
安德烈