ST芯片 CAN 滤波器配置
写在前面
这篇文章默认若干细节已经被知道了:
- CAN 消息 ID 的组成
- CAN 消息的 ID 的竞争的原理(类似“线与”的特性)
另外,没有照搬 ST 的参考手册,翻译一遍也没啥意义。
但是,手册一定要读,如果想对自己的代码彻底放心的话。
也没有放代码,硬件配置相关的操作,放代码没有多大意义。
总体原则
STM32 的 CAN 收发的总体原则是,硬件邮箱(就是几组发送缓存)发送,硬件 FIFO 接受。
要知道 滤波器的配置仅和接收有关;发送的消息的 ID 是组包时“随意”写的(这里的随意是指,硬件没有做限制)。
滤波器配置的核心资源是 filter banks,这是一组外设寄存器,它们的配置和使用是相当灵活的(通过若干个相关寄存器的设置)。
相关寄存器的名字啊,配置细节啊,还是参考手册吧,这里就不堆砌了。
filter banks
假设有 28 个 filter banks,那么这 28 FB 是可以任意被分配给 FIFO0 或者 FIFO1 的(有个寄存器,忘记叫啥名字了)。
Each filter bank i is composed of two 32-bit registers. ——每个 filter bank 都是成对的 32bit 的寄存器。
为什么会有两个呢?这两个该怎么用呢?
Identifier Mask / Identifier List
这涉及到 ST 芯片设计的两个模式,屏蔽位模式 / ID 列表模式。(名字是我自己起的)
一个 filter bank 被设置为屏蔽位模式 Identifier Mask 后,可以过滤一组 CAN ID,符合约束条件的 ID 的消息都被接收。
一个 filter bank 被设置为 ID 列表模式 Identifier List 后,仅匹配一个 CAN ID,和这个 ID 相等的消息才被接收。
Identifier Mask
In mask mode the identifier registers are associated with mask registers specifying which bits of the identifier are handled as “must match” or as “don’t care”.
每个 filter bank 有两个 32bit 的寄存器。
其中第二个寄存器当作掩码,第一个寄存器设置“所掩”的那些位应该是 “1” 还是 “0”
组合起来就能表示:第 x 位必须是 “1” 或者 “0” 才是想要的;或者,根本不关心第x位是什么。
Identifer List
这个就比较简单啦。
每个寄存器,设置的值是多少,就可以接收这个值的 ID。
Scalable Width
每个 filter bank 的宽度页可以配置:
- 被分配成一个 32bit 的滤波地址,可以适配一个扩展帧
- 被分配成两个 16bit 的滤波地址,可以适配两个标准帧
所以:
如果是扩展帧并设置为 Identifier Mask 模式,一个 Filter Bank 只能完成一组设置。(完成一类 ID的设置)。
如果是标准帧并设置为 Identifier Mask 模式,一个 Filter Bank 可以完成两组设置。(完成两类 ID 的设置)。
如果是扩展帧并设置为 Identifier List 模式,一个 Filter Bank 可以设置成两个 ID。
如果是标准帧并设置为 Identifier List 模式,一个 Filter Bank 可以设置成四个 ID.