【发布时间】:2021-05-21 13:36:28
【问题描述】:
我正在研究 STM32F103RB Nucleo 板。我想知道 CAN 消息在接收数据时如何在 FIFO 中隔离? FIFO 满后(超过 3 条消息)会发生什么?
【问题讨论】:
-
请阅读How to ask 并更新您的问题。
-
这个问题到底怎么不清楚?对我来说似乎很清楚,两个人能够回答。我会投票重新开放。
我正在研究 STM32F103RB Nucleo 板。我想知道 CAN 消息在接收数据时如何在 FIFO 中隔离? FIFO 满后(超过 3 条消息)会发生什么?
【问题讨论】:
当您配置过滤器库时,您还指定了接收邮箱(您有 2 个)。一个过滤器组接受的消息进入相关邮箱。
如果启用,FIFO(邮箱)溢出会触发中断。 FIFO 的行为和传入消息的命运由CAN->MCR 寄存器的RFLM 位决定。
RFLM = 0 -> 最后(第 3 条)消息被新到达的消息覆盖(销毁)。前(最旧的)2 条消息会一直保留,直到您阅读它们为止。RFLM = 1 -> FIFO 被锁定。新到达的消息被丢弃。保留最早的 3 条消息。【讨论】:
FIFO 满后(超过 3 条消息)会发生什么?
那么您基本上就完成了 - 您将在 Rx FIFO 溢出时丢失数据,这在 CAN 实时系统中通常是不可接受的。因此,如果您的 MCU 太忙而无法始终满足 3 条消息的最后期限,您将不得不实现一些带有中断 + 环形缓冲区的丑陋系统。
这就是为什么 CAN 控制器从 90 年代末/2000 年代初开始使用大约 5 到 8 个消息接收缓冲区的原因之一。 BxCAN 显然很古老,因为它比那些有 20 多年历史的控制器还要糟糕。
希望您可以对消息进行 DMA 处理,这比提到的中断/环形缓冲区复杂性要漂亮得多。如果这不是一个选项,那么您也许应该改用现代 CAN 控制器。基本上市场上的任何其他 CAN 控制器都有比这个更大的 rx FIFO。
【讨论】: