【TC397-MCMCAN】报文接收-RxFifo0/1和RxBuffer是什么?
Rx Buffer与Rx FIFO0/1都为并列的接收内存区,可通过CanNode与Filter中的多项配置配合决定具体使用哪一块内存区接收。其中,RxBuffer模式下,filter需配置rxBufferOffset,决定符合当前filter条件的报文被存至哪一块dedicatedBuffer中;FIFO模式读写则由put与get index决定。适合接收低频、关键、安全性要求高的报文,1个Bu
目录
4 interruptConfig=IfxSrc_Tos_cpux / dma的区别
4.1 typeOfService = IfxSrc_Tos_cpux (CPU中断模式)
4.2 typeOfService = IfxSrc_Tos_dma(DMA传输模式)
RxHandling接收处理
RxHandling控制着①Acceptance Filter接收过滤器;②将接收到的报文转移至RxBuffers或转移至两个RxFifos中的一个;③RxFiFo的put- & get-indices(读写指针)。
1 Acceptance Filter接收过滤器
在TC397中过滤器有两种:standard与extended。这些过滤器接收到的报文可被存储至RxBuffer,或存至Rx FIFO0或Rx FIFO1,这三者在内存中各自拥有独立的内存空间。


在TC397中,共拥有3路CAN网络,每路CAN网络支持4个CAN Node节点。如上表格显示,每路CAN网络中的4个节点共享64个RxBuffer与128个RxFIFO中的elements,这些elements对应的内存资源可平均分配至每个节点,也可根据实际需求分配。
一个典型的ElementFilter会涉及到如下定义(以standard类型举例):
IfxCan_Filter filter;
filter.number = 0;
filter.elementConfiguration = IfxCan_FilterElementConfiguration_storeInRxFifo0;(可从下列注释中选配,此处配置为存入FIFO 0)
/*
IfxCan_FilterElementConfiguration_disable, //disable filter element
IfxCan_FilterElementConfiguration_storeInRxFifo0, // store in rx FIFO 0 if filter matches
IfxCan_FilterElementConfiguration_storeInRxFifo1, // store in rx FIFO 1 if filter matches
IfxCan_FilterElementConfiguration_rejectIDd, //reject id if filter matches
IfxCan_FilterElementConfiguration_setPriority, //set priority if filter matches
IfxCan_FilterElementConfiguration_setPriorityAndStoreInFifo0,//set priority and store in FIFO 0 if filter matches
IfxCan_FilterElementConfiguration_setPriorityAndStoreInFifo1,//set priority and store in FIFO 1 if filter matches
IfxCan_FilterElementConfiguration_storeInRxBuffer, //store into rxBuffer
*/
filter.tyoe = IfxCan_FilterType_dualID;
filter.id1 = 0xxxx;
filter.id2 = 0xxxx;
filter.rxBufferOffset = IfxCan_RxBufferId_0; //因前面elementConf配置为存入FIFO 0,故此处的Offset无实际意义
IfxCan_Can_setStandardFilter(&canNode, &filter); //将filter的配置更新至设定的can节点
若上述配置改为:
filter.elementConfiguration = IfxCan_FilterElementConfiguration_storeInRxBuffer;
filter.rxBufferOffset = IfxCan_RxBufferId_0;
则意味着符合过滤条件的报文会被存储至索引为IfxCan_RxBufferId_0的专用dedicatedBuffer中。但由于此处配置了dualId的过滤模式,而一个buffer只能存一条报文,故存在接受报文丢失的风险。报文具体是否丢失,取决于id1与id2指定的报文频率:
当报文速度比cpu/dma中断处理速度慢时,新报文到达时对应的dedicatedBuffer已被释放为空,此时可接受新报文;
但当报文速率快于中断处理速度时,新报文到达,对应的dedicatedBuffer还未被处理,仍为FULL状态,此时新报文被舍弃,造成数据丢失。
需要注意的是,若使用dedicatedBuffer模式接收报文,canNode的其他配置也需对应更改,具体配置会有以下变化:
RxFIFO0接收:
canNodeConfig.rxConfig.rxMode = IfxCan_RxMode_fifo0;
canNodeConfig.rxConfig.rxFifo0OperatingMode = IfxCan_RxFifoMode_Blocking; //当FIFO0区接收满时,新到达的报文不予接收
canNodeConfig.messageRAM.rxFifo0StartAddress = xxx; //设定Fifo0内存区地址
canNodeConfig.interruptConfig.rxFifo0NewMessageEnabled = TRUE;
canNodeConfig.interruptConfig.rxf0n.priority = ISR_XXXXX; //rxf0n表明是FIFO0接收对应的中断
canNodeConfig.interruptConfig.rxf0n.interruptLine = IfxCan_InterruptLine_xxx;
canNodeConfig.interruptConfig.rxf0n.typeOfService = IfxSrc_Tos_cpuxx/dma;
------------------------------------------------------------------------
DedicatedBuffer接收:
canNodeConfig.rxConfig.rxMode = IfxCan_RxMode_dedicatedBuffers;
// dedicatedBuffer下无blcok或overwrite处理
canNodeConfig.messageRAM.rxBuffersStartAddress= xxx; //设定rxBuffer内存区地址
canNodeConfig.interruptConfig.messageStoredToDedicatedRxBufferEnabled = TRUE;
canNodeConfig.interruptConfig.reint.priority = ISR_XXXXX; //reint表明是rxBuffer接收对应的中断
canNodeConfig.interruptConfig.reint.interruptLine = IfxCan_InterruptLine_xxx;
canNodeConfig.interruptConfig.reint.typeOfService = IfxSrc_Tos_cpuxx/dma;
2 Rx FIFOs
Rx FIFO0与FIFO1最多可被配置为每个接收64个elements,对应配置的寄存器为RXF0Ci(i=0~3)与RXF1Ci(i=0~3)。FIFO区的读与写由两个指针put index与get index管理。

接收到的报文若通过了filter的校验,会按照每个element配置的接受内存区被相应转移。为了避免Rx FIFO区的溢出,可使用watermark机制。当Rx FIFO的填充程度抵达了所配置的watermark等级, IRi.RFnW寄存器对应的中断标志会被置位;当Rx FIFO的put index抵达get index所在处时,RXFnS.FnF寄存器会被置位,表明Rx FIFO区已满,与此同时IRi.RFnF寄存器也会被置位。若未对watermark配置,则默认每接收一条报文,都会触发一次中断。
当CPU/DMA从FIFO区读报文时,会先计算读取地址:RxFIFO Get Index RXFnS.FnGI * FIFO Element Size + Rx FIFO StartAddress RXFnC.FnSA.
2.1 Rx FIFO Blocking Mode
该屏蔽模式由RXFnC.FnOM=0配置决定,也是Rx FIFO的默认模式:当FIFO区满时,不可向其中写入任何一条新报文,直到一条报文被读走,且Rx FIFO Get Index增加。由寄存器RXFnS.FnF=1判断当前FIFO区已满,且IRi.RFnF寄存器中断标志也被置位。若在FIFO区满时一条报文抵达,则该条报文会被丢弃,且寄存器RXFnS.RFnL=1被置位,表明报文丢失,报文丢失中断标志位IRi.RFnL也会被置位。
2.2 Rx FIFO Overwrite Mode
寄存器RXFnF.FnOM=1决定了FIFO的overwrite模式。当FIFO区已满,此时put与get index相同,即RXFnS.FnPI=RXFnS.FnGI,对应的区满寄存器RXFnS.FnF此时也为1。若有新报文抵达时,则FIFO区会用该条新报文内容覆写掉最旧的FIFO报文,且put与get index同时+1。
3 Dedicated Rx Buffers专用接收缓冲区
M_CAN支持最多64个专用接收缓冲区,当接收的报文通过了过滤器filter的校验后,该帧报文会被存入filter对应配置的Offset的DedicatedBuffer内存区中,当报文内容全部写至RAM区后,对应的新数据标志位NDAT1i(i=0~3), NDAT2i(i=0~3)会被置位,只要该寄存器被置位,则对应的RxBuffer随即被锁定,不再接收新的符合filter过滤条件的报文。此时中断寄存器IRi.DRX也被置位。
4 interruptConfig=IfxSrc_Tos_cpux / dma的区别
4.1 typeOfService = IfxSrc_Tos_cpux (CPU中断模式)
工作原理:
-
触发条件:当FIFO/rxBuffer中有新报文(达到水位线阈值)时,硬件向CPU发送中断请求。
-
数据流向:Message RAM -> CPU手动拷贝 -> 应用缓冲区
-
适用场景:报文频率较低,cpu负载较轻。
4.2 typeOfService = IfxSrc_Tos_dma(DMA传输模式)
工作原理:
-
触发条件:当FIFO/rxBuffer中有新报文(达到水位线阈值)时,硬件向DMA控制器发送中断请求。(非CPU中断)
-
数据流向:Message RAM -> DMA引擎 -> 应用缓冲区(无需CPU参与数据拷贝)
-
适用场景:高吞吐量,实时系统。DMA带宽远高于CPU拷贝带宽,可以配置DMA,一次搬运多条报文。
总结
Rx Buffer与Rx FIFO0/1都为并列的接收内存区,可通过CanNode与Filter中的多项配置配合决定具体使用哪一块内存区接收。其中,RxBuffer模式下,filter需配置rxBufferOffset,决定符合当前filter条件的报文被存至哪一块dedicatedBuffer中;FIFO模式读写则由put与get index决定。DedicatedBuffer适合接收低频、关键、安全性要求高的报文,1个Buffer存1个ID报文,零竞争、零抖动、绝对优先级保障;
FIFO0/1适合批量处理同类型报文流,高效吞吐、资源复用、适合流式数据。
经验来讲TC397的Message RAM有限,一般优先将Dedicated Buffer留给<10个最关键ID,其余报文用FIFO分组管理。
References
《Infineon-AURIX_TC39x-UserManual-v02_00-EN.pdf》
《Infineon-AURIX_TC3xx_Part2-UserManual-v02_00-EN.pdf》
更多推荐



所有评论(0)