三、MCMCAN接收处理Rx handling

张开发
2026/4/8 15:16:20 15 分钟阅读

分享文章

三、MCMCAN接收处理Rx handling
CAN的接收处理主要涉及Filter的控制、将接收到的消息传输到Rx buffer或Rx FIFO0/1的过程、以及Rx FIFO的Put和Get索引。1、Accpetance Filter这部分具体内容可详见CAN Rx Filter详细介绍。MCMCAN针对标准CAN帧以及扩展CAN帧提供了两组Filter配置主要的作用就是将命中过滤器的消息分配到RxBuffer或者FIFO0/1中去。控制器的message ram中分配了两张过滤器表分别针对标准帧和扩展帧每个过滤器表都从第一个filter element开始执行直到找到第一个匹配的element找到过后即会立即停止过滤不再检查后续的过滤器是否能命中。补充一张message ram的结构图最开始的地方就是标准filter和扩展filter的地址空间。2、RxFIFOAURIX MCMCAN一共有两个Rx FIFO可以配置以及使用FIFO0和FIFO1可以各自配置最多存储64个元素所有命中对应Filter的报文都会被传输到Rx FIFO中。RxFIFO是一个环形FIFO可以通过RxF0C寄存器配置本FIFO当前存放多少个element。为了避免Rx FIFO溢出引入了water mark机制所谓water mark形象理解就是水位标记当Rx FIFO的填充水平达到RXFnC.FnWM配置的阈值时中断标志IRi.RFnW会被设置。当FIFO接收数据的速率过快时水位机制可以提前提醒系统以便及时读取消息或执行其他处理避免丢失数据。RxFIFO溢出若Rx FIFO的 Put Index写入索引与 Get Index读取索引相同将触发 Rx FIFO满 条件。此时通过RXFnS.FnF信号指示并且中断标志IRi.RFnF会被设置。Put Index指向下一个被填充的空位置每收到一帧消息就会把它放到Put Index指向的位置消息存放结束后Put Index会增加指向下一个空的位置Get Index表示从FIFO中取消息的位置每次从FIFO中取走一个数据那么Get Index就指向下一个待取的位置。由于FIFO是一个环形缓冲区当Put Index已经达到FIFO的最大数量时Index可以卷绕存储即当前索引为7下一次就会指回0所以当Put Index“追上”Get Index时FIFO为满的状态所以这就解释了Rx FIFO的 Put Index写入索引与 Get Index读取索引相同将触发 Rx FIFO满条件。Rx FIFO 阻塞模式Rx FIFO的阻塞模式通过寄存器RXFnC.FnOM配置默认操作模式为‘0’。当Rx FIFO达到满状态RXFnS.FnPIRXFnS.FnGI将不再向该Rx FIFO写入更多消息直到至少有一条消息被读取并且Rx FIFO的Get Index已递增。Rx FIFO的满状态由RXFnS.FnF1信号表示并且会设置中断标志IRi.RFnF。如果在Rx FIFO已满的情况下接收到一条新消息该消息将被丢弃并且会通过RXFnS.RFnL1信号指示丢失消息的状态同时设置中断标志IRi.RFnL。Rx FIFO 覆盖模式Rx FIFO覆盖模式由RXFnC.FnOM‘1’配置。当Rx FIFO满状态RXFnS.FnPIRXFnS.FnGI通过RXFnS.FnF1信号指示时下一个接收的消息将覆盖最旧的消息。此时Put索引和Get索引都会增加1。在覆盖模式下若Rx FIFO满状态被触发读取Rx FIFO元素时应至少从Get Index 1开始。这是因为接收到的消息可能在CPU从消息RAM读取数据时写入到消息RAMPut Index从而导致读取到不一致的数据。通过在读取时给Get Index加上偏移量可以避免这个问题。偏移量的大小取决于CPU访问Rx FIFO的速度。Rx FIFO 确认在从Rx FIFO读取数据后需要将最后读取的元素号写入到Rx FIFO确认索引RXFnA.FnA中。这将使Get Index增加到该元素号。如果Put Index尚未递增到此Rx FIFO元素Rx FIFO满状态将被重置RXFnS.FnF0。3、 RxBufferRx Buffer又叫Dedicated Rx bufferM_CAN最多拥有64个Dedicated Rx buffer。每一个专用的缓冲区在内存中都有其对应的地址都可以通过特定的filter来接收消息当一个接收到的消息通过过滤器元素的筛选后消息会被自动存储到Message RAM中对应的Rx Buffer。存储的格式与Rx FIFO元素相同。当消息被存储到Rx Buffer以后相应的中断标志IRi.DRX会被设置表示消息已经存储到Rx Buffer中了。如果消息要存到Rx Buffer对过滤器的配置要求SFEC/EFEC要配置成111B即storeInRxBufferSFID2的[10:9]要被配置为00如下图所示在消息写入Rx Buffer后系统会设置New Data 标志并通过这些标志来防止在同一缓冲区上覆盖数据。当接收到的消息的最后一个字被写入到Message RAM后相关的New Data flag会在NDAT1i (i0-3)和NDAT2i (i0-3)中设置。当New Data flag设置时表示该缓冲区正在存储新的消息Rx Buffer会被锁定直到标志被清除。锁定状态下来自匹配过滤器元素的新消息不会覆盖该缓冲区中的数据。CPU读取完Rx Buffer内部的数据以后需要手动重置New Data Flags将对应的bit位置1以释放Rx Buffer允许新消息被存储。推荐的Rx Buffer处理流程①复位中断标志 IRI.DRX②读取新数据寄存器③从message ram中读取消息④对于已经处理了的消息复位其新数据flag

更多文章