1.基本概述
英飞凌TC3xx的MCMCAN模块取代了TC2xx系列的MultiCAN;相比于之前的CAN模块,MCMCAN使用的是Bosch提供的M_CAN作为节点,满足ISO 11898-1的要求,支持CAN\CAN FD,最高传输速率可到8Mbit/s;同时还满足ISO 11898-4,基于时间同步事件触发通信方式。
MCMCAN与MultiCAN+不同点在于:
可配置的message ram代替之前的Message Object
支持CAN的调试
其结构框图如下:
可以看到,博世的M_CAN node(最高支持4个CAN节点)与port模块相接,在物理层面实现了CAN 高低的连接;在MCMCAN内部包含了一个中断压缩单元、可配置的message ram和通用控制单元。其中,message ram用于存储即将要发送或者已经接收的can消息,所有CAN node都共享这一块RAM。
因此我们首先来看RAM的具体定义。
2.Message RAM
根据芯片手册Message RAM的最大支持 0x8000 bytes,即32K,但是由于所有的节点共享RAM,因此这块RAM是按如下结构进行分配:
上述结构的起始结束地址由不同寄存器定义,如下所示
3.FIFO和Buffer
在Message RAM中,不管是TX还是RX均存在FIFO和Buffer,我们来看看两者具体区别在哪里。
3.1 Rx FIFO和 Rx Buffer
RX FIFO和Buffer均是用于过滤 ID后存储接收的报文,通过寄存器位域SFEC\EFEC选择是存储到FIFO还是Buffer(注意英飞凌手册上写的是dedicated buffer):即每个Rx message应该有自己的特定的buffer。
Rx FIFO 0/1每个最多支持64个elements,elements大小如下:
同时,为了防止FIFO溢出,采用Rx FIFO的水位标记方式,如下:
当Rx FIFO的填充达到了Rx FIFO设置的水位(由寄存器RXFnC.FnWM配置),此时会产生一个IRi.RFnW的中断Flag;如果Rx Put Index接近Rx Get Index相等时,说明此时接收数据过快,CPU还没来得及把数据取走,这是会产生一个Rx FIFO Full的中断Flag。
Rx Buffer最多也支持64个,当接收的报文通过filter处理后存入buffer,此时中断寄存器IRi.DRX会置位。
处理Rx Buffer的流程如下:
重置IRi.DRX
读取New Data寄存器
从Message RAM读取message
重置处理过后的New Data flag
3.2 Tx FIFO、Queue和Tx Buffer
模块Tx Handler处理了报文发送,最多32个Tx Buffer用于报文发送,结构如下:
注意这里比较容易混淆;这32个Tx Buffer的实例可以配置成为如下五种模式:
Tx FIFO:
TXBC#i.TFQM配置为0,选择Tx FIFO;
硬件根据TFGI来发送报文,
软件访问TXFQSi.TFQPI,根据情况设置TXBARi.ARx用于触发发送请求
Tx Queue:
TXBC#i.TFQM配置为1,选择Tx Queue;
硬件根据优先级来发送报文,
软件访问TXFQSi.TFQPI,根据情况设置TXBARi.ARx用于触发发送请求
Dedicated Tx Buffers:每个元素有指定ID,ID越小优先级越高
Dedicated Tx Buffers with Tx FIFO
Dedicated Tx Buffers with Tx Queue
相关寄存器如下:
基于上述描述,我们可以总结上述五种发送模式的优先级如下:
4. 中断
除了时钟外,中断在MCMCAN中也是固定的,对于该模块,共存在16个中断节点,可通过寄存器GRINT1x和GRINT2x灵活分配中断给任意节点。
这个说起来有点抽象,从具体代码角度来看,要选择IR里SRC节点,如下
首先找到对应芯片手册中IR模块里CAN node的中断服务源的基地址SRC_CANxINTy,如下:
要配置CAN中断,首先要选择那个CAN模块,然后通过配置interrupt line选择对应的SRC节点(line和SRC_INT一一对应)。
下面这张图是看了很久才慢慢有所体会。
首先这张图显示的是每个节点中断的压缩情况,每个节点有28个中断类型,这28个中断会被压缩为16个中断源状态在寄存器中保存。为什么要压缩,因为有很多中断可以用一种中断状态来表示。
例如 Alert这个中断(绿线),可以由中断EW\EP\TSW\RF0L\RF1L\TEFL触发,如下:
那么只要我看到alert 中断flag置位,我就可以判断有上述六种情况,根据现象进行排查。
IR寄存器可以用于生成中断脉冲,IE用于使能上述中断。这是什么意思呢?光看到IRi寄存器某个位置位还不能说明生成了中断,必须通过IE寄存器使能中断,才会产生中断给IR整个模块。
一旦相应中断使能,MCMCAN会使用GRINT1i和GRINT2i通过INT_Ox输出中断脉冲;如果有多个中断源与中断节点链接,所有请求会组合一起到一个相同的line(链接到SRC)
上述中断的使能也需要由寄存器来配置(与逻辑,两者都满足才行),如下:
IE和IR位域是一一对应的。
5.小结
这里简单对TX\RX Handler、messageRAM 做了一个概述,实际上当我们使用AUTOSAR工具来进行配置时候,理解芯片内部原理,是对工程的效率非常有帮助的。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/djkeyzx/article/details/130061808
|