大家好,
我正在使用 S32K358 FlexCAN 模块,我想确认正确的寄存器/标志用法,以及将 64 个硬件消息缓冲器(MB0...MB63)配置为接收邮箱的安全程序。我读过《清除条例》,但我想确保我了解实际行为、
我想知道哪些寄存器/标志指示 FIFO 状态、邮箱中断标志、溢出/警告,以及使用 64 MB 时建议的 MB 读取/清除顺序。
是为所有 MB 启用每个 MB 的中断掩码 (IMASK),还是使用分组方法,在 ISR 中读取 IFLAG1/IFLAG2 并循环处理标记的 MB?对 ISR 的持续时间和优先级是否有任何担忧?
如果我未读取(即,如果在我读取旧帧之前有新帧到达相同的 MB 中),邮箱如何覆盖旗帜/寄存器中的清单 — 有标记吗?如果没有,如何检测是否发生了覆盖?
我试着接收 CAN 数据,发现所有 CAN 帧都只使用 MB0,问题解决了吗?
有人能解释一下 Flexcan 邮箱吗?如果我想使用 64 个消息缓冲区,应该怎么做?
您好,
阅读第 73.3.4 章可解决大部分问题设备 RM 的接收过程和 73.3.5 匹配过程。以下是对您所提问题的快速反馈
问:我想知道哪些寄存器/标志指示 FIFO 状态、邮箱中断标志、溢出/警告,以及使用 64 MB 时建议的 MB 读取/清除顺序。
答:
传统 RX FIFO 模式使用 MB0-MB5 作为接收队列。此外,MB6-MB7(或更多,取决于过滤表配置,CTRL[RFFN])用于指定 ID 过滤表。因此,如果启用传统的 RX FIFO,就不能将所有 64 MB 都用作独立邮箱。除非您将使用最大容量为 96MB 的 FlexCAN 实例(FlexCAN0-2)。或使用增强型 RX FIFO。
如果启用了传统 RX FIFO,则 MB0 是 FIFO 入口点,用户使用 MB0 读取报文。
监测
IFLAG1/IFLAG2 的寄存器和标志:MB0—MB31 和 MB32—MB63 的中断标志。
IMASK1 / IMASK2:每 MB 中断使能屏蔽。
如果启用了传统 RXFIFO
RXFIR:表示哪个 FIFO 条目已被填满。
IFLAG1[BUF5I](传统 RX FIFO 中可用帧)--当至少有一个帧可从传统 FIFO 中读取时设置。
IFLAG1[BUF6I](传统 RX FIFO 警告)- 当传统 RX FIFO 收到新报文,使未读报文数量从四个增加到五个时设置。这一变化意味着传统 RX FIFO 几乎已满。该标志保持设置状态,直到 CPU 将其清除。
IFLAG1[BUF7I](传统 RX FIFO 溢出)- 当传入信息因传统 RX FIFO 已满而丢失时设置。
如果设置了相应的屏蔽位,则会产生中断。
问:我应该为所有 MB 启用每个 MB 的中断屏蔽 (IMASK),还是使用分组方法,在 ISR 中读取 IFLAG1/IFLAG2 并在循环中处理标记的 MB?对 ISR 的持续时间和优先级是否有任何担忧?
答:
推荐的 ISR 策略
32MB 有共同的中断向量(0-31、32-64......)
为您关心的所有 MB 启用中断,然后在 ISR 中:读取 IFLAG1 或 IFLAG2。对于每个设置位,处理该 MB。向该位写 1(写 1 清除),清除标记。
如果在 ISR 中循环使用 32 MB,时间可能会很长,但这与应用程序有关。
问:如果我错过读取机会(即,如果在我读取旧帧之前有新帧到达同一 MB 中),邮箱如何覆盖旗帜/寄存器中的清单 — 有标志吗?如果没有,如何检测是否发生了覆盖?
答:
覆盖检测
FlexCAN 没有专用的 MB 覆盖标志。如果在读取旧帧之前有新帧到达,旧数据将无声丢失。中断标志 (IFLAGx) 只是保持设置状态,直到被清除。
只有 MB 的控制/状态字 CODE 文件更改为 OVERRUN
问:我尝试接收 CAN 数据,但所有 CAN 帧都只使用 MB0。
答:
您观察到的 "所有帧都进入 MB0 "通常意味着:
启用了 RX FIFO,MB0 是 FIFO 入口点。
或者您的接受筛选器设置为只匹配 MB0。
BR, Petr