邮箱
邮箱系统由高达64个报文缓冲区组成,前38个MBs相对应的内存空间可以被配置成支持FIFO接收机制,该机制具有一个强大的ID过滤机制,能够检测接收帧的ID表(最多可以是128个扩展帧ID或者256个标准帧ID或者512个8比特的ID分片),还具有高达32个ID表提供私有掩码寄存器。
同时支持通过队列FIFO以及邮箱接收
对于邮箱接收,一个匹配算法可以使得将接收到的帧存储到MBs中,该MB的ID字段和接收到的帧具有相同的ID字段。掩码机制可以使得在MB中设置的ID号与一系列的接收到的CAN帧的ID进行匹配。对于传输,仲裁算法可以基于报文的ID(通过本地3个比特的优先权字段来选择)或者MB的排序来决定将要发送的MBs的优先权。
仲裁过程会根据CTRL1[LBUF]以及MCR[LPRIO_EN]位的设置,在扫描结束时在所有激活的发送邮箱中选择优胜者。
CTRL1[LBUF]置位,则第一个(最小号)激活的发送邮箱将获得仲裁优先权。当其置位时,MCR[LPRIO_EN]将不会产生作用。
FLEXCAN模块具有四种不同的功能模式:正常模式(用户和管理员)、冻结模式、监听模式以及闭环模式;同样具有三种不同的低功耗模式:禁止模式、睡眠模式以及停止模式。
冻结模式:
MCR寄存器的FRZ位被置位,CAN_MCR_FRZ_MASK:当MCR的HALT位置位时或者在MCU级请求调试模式并且MCR寄存器的FRZ_ACK被置位,CAN模块将进入到冻结模式。
回环模式:
CAN_CTRL1_LPB_MASK;CAN工作在内部闭环模式用于自测。从发送器发出的比特流输出回内部的接收器输入,输入引脚将被忽略,并且输出引脚将处于逻辑1状态。
睡眠模式:
当MCR寄存器的DOZE被置位、在MCU级请求睡眠模式并由CAN置位MCR寄存器的LPM_ACK位时将进入低功耗模式。
停止模式:
在MCU级请求模式并且由FLEXCAN模块置位MCR寄存器LPM_ACK位时,模块进入该低功耗模式。在停止模式中,模块将会自己置于不活动状态,然后通知CPU可以关闭所有时钟。当请求离开停止模式或者当检测到CAN总线上有活动时,并且同时开启了自醒机制时,flexcan将会退出该模式。
CAN RX与CAN TX引脚:
显性状态代表逻辑0,隐性状态表示逻辑1.
模块可以使用邮箱和RX接收队列结构存储CAN报文用于传输与接收。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CANX_RXMGMASK
接收邮箱全局掩码寄存器,位于RAM区,是为了对传统的支持。
【可替代的掩码机制】四个掩码寄存器,主要是向后兼容。当MCR[IRMQ]位清零时,开启。
接收邮箱全局掩码寄存器CAN_RXMGMASK_REG(CANBaseAdd),当MCR[IRMQ]位清零时,RXMGMASK总是全部有效,当MCR[IRMQ]位置位时,RXMGMASK无效。
RXMGMASK用于给所有接收MB提供过滤字段,除了MBX14-15,它们有自己的掩码寄存器。只能在冻结模式下才能被写入。
0 相应的比特在过滤器中为无关,1为检查。
SMB 接收帧的RTR比特位,其被放在附加的MB,即接收串行报文缓冲区RXSMB。
中断掩码寄存器1(CANx_IMASK1)
每一个缓冲区在该寄存器中都有一个相应的屏蔽位,置位:开启相应缓冲区中断;0禁止相应缓冲区中断。
当IFLAG1置位时,当缓冲区1完成收发过程时,会向CPU产生中断。
中断标志寄存器1:
CANx_IFLAG1,如果相应的IMASK1置位,就会产生一个中断,向相应的中断标记写1可以清除该位,写0无影响。
当接收队列FIFO使能时,BUF7I与BUF5I标志也可以用来表示队列FIFO中断。
BUF5I:
缓冲区MB5中断或者接收队列FIFO中可用的帧,当MCR寄存器的RFEN位清零时,该位用来表示MB5缓冲区中断。
MCR[RFEN]=1:接收队列有可用帧。
控制寄存器2:
RFEN:接收队列FIFO过滤器的数目。冻结模式下选择。不能大于接收队列及邮箱ID过滤器的报文缓冲区的数目,由MACR[MAXMB]所定义。
接收私有掩码寄存器CANx_RXIMRn
位于RAM区,因此在复位后不会被初始化。用作在接收MBs以及接收队列FIFO的ID过滤器的可接收掩码。如果没有使能接收队列FIFO,那么会给每个可用的邮箱提供一个掩码寄存器,该掩码寄存器为邮箱的每一位提供ID掩码功能。1检查过滤器中相应位;0不受影响。
接收队列FIFO:
MCR[RFEN]位置位,可以使能只用于接收的队列FIFO,复位值为0。FIFO队列具有6个报文的深度,当队列中至少有一个可读帧时,IFLAG[BUF5I]标志位被置位。同时使能相应的掩码会产生一个中断。只有当IFLAG[BUF5I]被置位时FIFO输出才有效。
IFLAG[BUF6I]接收队列警告置位时,意味着接收队列将要满了。会一直置位,直到CPU清除它。
IFLAG[BUF7I] :Rx FIFO overflow
发送时先发送高位,再发送低位。
匹配处理:
扫描整个MB内存,寻找与CAN总线上接收到的帧的ID相匹配的接收缓冲区的一个算法。只有被设置为接收的MB才参与匹配。
通过使用ID接收掩码,可以匹配一系列ID,通过三个掩码寄存器来支持掩码机制。在匹配算法中,如果掩码位被置位,则相应ID位被验证,反之,则相应ID位不进行验证。