打印
[通用 MCU]

英飞凌TC3xx_MCMCAN(一)

[复制链接]
1901|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-6-13 08:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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

21512666a38cb01ed6.png (42.66 KB )

21512666a38cb01ed6.png

使用特权

评论回复
沙发
suncat0504| | 2024-6-14 08:55 | 只看该作者
有时间需要认真学习。谢谢分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2028

主题

15903

帖子

13

粉丝