NXP

flexcan - Mailbox lock mechanism

2019-07-12 12:31发布

除了邮箱禁用之外,FlexCAN还具有另一种用于接收过程的数据一致性机制。当CPU使用代码FULL或OVERRUN读取Rx MB的控制和状态字时,FlexCAN假定CPU想要在原子操作中读取整个MB,因此它为该MB设置内部锁定标志。当CPU读取自由运行计时器(全局解锁操作)时,或者当它读取另一个MB的控制和状态字而不管其代码时,锁定被释放。 CPU写入C / S字也会解锁MB,但不建议将此过程用于正常解锁使用,因为它取消了挂起移动并可能丢失收到的消息。完成MB锁定是为了防止在CPU读取时将新帧写入MB。 锁定机制仅适用于不属于FIFO且RID MB不同于INACTIVE(0b0000)或EMPTY 1(0b0100)的Rx MB。此外,无法锁定Tx MB。   例如,假设FIFO被禁用,并且阵列的第二和第五MB用相同的ID编程,并且FlexCAN已经接收并将消息存储到这两个MB中。现在假设CPU决定读取MB号5,同时另一个具有相同ID的消息到达。
当CPU读取MB编号5的控制和状态字时,该MB被锁定。新消息到达并且匹配算法发现没有“free-to-receive”MB,因此它决定覆盖MB5。但是,此MB已锁定,因此无法在此处写入新消息。它将保留在SMB中等待MB解锁,然后才会写入MB。 如果MB未及时解锁并且另一个具有相同ID的新消息到达,则新消息将覆盖SMB上的消息,并且在MB的CODE字段或错误中将不会显示丢失的消息 和状态登记。
当消息从SMB移入MB时,CODE字段上的BUSY位置位。 如果CPU读取控制和状态字并发现BUSY位置1,则应推迟访问MB,直到BUSY位被取反。  NOTE: 如果BUSY位有效或MB为空,则读取控制和状态字不会锁定MB。
失活优先于锁定。如果CPU取消激活锁定的Rx MB,则其锁定状态将被取消,并且MB将被标记为当前匹配轮次无效。 SMB上的任何待处理消息都不会再传输到MB。当CPU读取自由运行定时器寄存器(参见“自由运行定时器寄存器(TIMER)”一节)或另一个MB的C / S字时,MB被解锁。