匹配过程
匹配过程扫描MB 内存以寻找具有和从CAN 总线上接收到帧相同ID 的接收MBs。如果FIFO
被使能,可以在邮箱和FIFO 过滤器中选择扫描的优先级。在任何情况下,匹配将从具有最小
号的报文缓冲区向最大号的报文缓冲区进行。如果在第一个结构中没有找到匹配的,那么随后
将扫描下一个结构。如果FIFO 队列满,那么匹配算法会在FIFO 区域之外选择匹配的MB。
如果正在接受帧,那么它将会被存储在一个隐藏的附加MB,该MB 称之为接收串行报文缓
冲区(Rx SMB)。
匹配的开始点取决于以下条件:
1.如果接收到的帧为远程帧,那么开始点位帧的CRC 字段;
2.如果接受到的帧为数据帧并且其DLC 字段的值为0,那么开始点为帧的CRC 字段;
3.如果接受到的帧为数据帧并且其DLC 字段的值不为0,那么开始点为帧的DATA 字段;
匹配过程扫描所有的接收队列FIFO(如果开启)以及激活的接收邮箱(CODE 字段为
EMPTY,FULL,OVERRUN 或者RANSWER)来寻找从CAN 总线上接收到的SMB 的匹配元素的一次成功
比较。SMB 和邮箱具有相同的结构。接受结构(接受队列FIFO 或者邮箱)与具有一次成功比
较的匹配元素称之为“匹配结构”。在扫描所有这些匹配结构的最后将会选择出匹配成功者并
且这取决于前面所描述的条件。参考下表。
当满足以下条件中的任何一个时,接受结构为free-to-receive:
1.邮箱的CODE 字段为EMPTY;
2.邮箱的CODE 字段是FULL 或者OVERRUN,并且该邮箱已经被处理过(C/S 字已经被CPU 读取
过并且已经被解锁);
3.邮箱的CODE 字段为FULL 或者OVERRUN,并且该邮箱已经失活;
4.接受队列不满。
一、
对于邮箱匹配优胜者受MCR[IRMQ]为的影响。如果该位为0,那么匹配优胜者为第一个被
匹配的邮箱而不管它是不是free-to-receive。如果该位置位,那么匹配优胜者通过以下优先
级来选择:
1.第一个匹配邮箱的free-to-receive;
2.最后一个匹配邮箱的非free-to-receive;
如果 non-safe Mailbox inactivation(参见“ Mailbox inactivation“)发生在匹配过程中,并且这个失活的邮箱
是此时匹配邮箱那么这个临时匹配邮箱将会变为无效。匹配扫描不会停止也不会重新启动,
它将继续进行。当前的匹配过程正常进行,因此可能会丢失一个报文。
例如假设禁止FIFO,MCR[IRMQ ]置1 MB2和MB5具有相同的ID,FlexCAN 模块将以该ID 开始接收报文。
当第一个报文到达,匹配算法会找到第一个与ID值相匹配的MB2,MB2 的code 为EMPTY, MB2接收报文.
当第二个报文到达时,匹配算法会又找到MB2,但是它不为“free-to-receive”,因此它将继续寻找并且找到MB5
然后将报文存储在MB5。
第三个相同ID报文到达时 匹配算法会发现已经没有可匹配的MB(free-to-receive),它将覆盖MB5
然后设置该MB5 的CODE 字段为OVERRUN。
基于上述方法可以利用多个MB实现一个接收队列,假设5个RX_MB 具有相同ID 。在匹配过程中,接收这些相同ID
报文必须排队进入到这五个RX_MB。CPU 可以检测接收到MB 的时间戳来决定已经接收报文的顺序。
二、
请参阅Rx单个屏蔽寄存器(CAN_RXIMRx)的说明。
在匹配算法期间,如果断言掩码位,则比较相应的ID位。
如果掩码位被否定,则相应的ID位是“不比较”。
请注意,单个屏蔽寄存器在RAM中实现,因此它们不会在复位后初始化,此外,它们只能在模块处于冻结模式时进行编程; 否则,它们被硬件阻止。
三、 FlexCAN还支持备用屏蔽方案,仅具有四个屏蔽寄存器(CAN_RXMGMASK,CAN_RX14MASK和CAN_RX15MASK), 以便与传统应用程序向后兼容。仅当CAN_MCR寄存器中的IRMQ位被取反时,将启用此备用屏蔽方案。
四、 通过CTRL2[MRP]位选择扫描的优先级为邮箱优先或者接收队列FIFO 优先。
(1)如果扫描优先级是接收队列FIFO优先:
1.如果接收队列FIFO 是匹配结构并且是free-to-receive,那么接收队列FIFO 就是匹配
优胜者而不再扫描邮箱;
2.否则(接收队列FIFO 不是匹配结构或者不是free-to-receive),则匹配优胜者是在上
面所描述的邮箱中找到的。
(2)如果扫描优先级是邮箱优先:
1.如果匹配邮箱的free-to-receive 被找到,那么它就是匹配优胜者而不再扫描接收队列FIFO;
2.如果没有找到匹配的邮箱,那么匹配优胜者将会在接收队列FIFO 中寻找。
如果上面的两个情况都不满足并且没有找到一个匹配邮箱的free-to-receive,那么匹配优胜者将由MCR[IRMQ]位来决定:
如果MCR[IRMQ]位为0,那么匹配优胜者为第一个匹配的邮箱;
如果MCR[IRMQ]位为1,那么如果有一个free-to-receive 匹配结构,匹配优胜者为接收
队列FIFO,不然匹配胜利者为最后一个非free-to-receive 匹配邮箱。