基于英飞凌TC397芯片的MCAL CAN模块配置

随着这几年汽车嵌入式软件的迅速发展,芯片的升级也是在不断进行中,本人从事汽车嵌入式工作,目前使用的是英飞凌TC397,鉴于网上对这个芯片的使用介绍比较少,所以想把自己开发Mcal的工程中的一些小经验分享出来,本人资历浅薄,如果哪里出现纰漏错误的地方,请批评指正,此文章属于原创,如有侵权,请及时联系。

本章先主要讲Can模块的配置及一些简单API的使用,在Mcal中,can模块的配置主要涉及到Port,Can,Irq,Os等几个模块,下面主要看一下这几个模块的主要配置:首先是:

Port模块

根据需求在Port模块中将对应的pin脚设置好,如下:

Can模块

Can:

首先是CanController,需要确定选择那条通道,根据不同的地址可以配置不同的通道,这些可以在Mcal的文档中查到。

在CanController中主要是配置通道地址的选择,收发信号类型等,首先要确定你要配置哪个can通道,在这里假设要配置Can02通道,可以在对应的硬件手册中查到这个通道对应的CanControllerBaseAddress是0xf0208900,CanRxInputSelection是CANxx_RXDE,一般情况下,CanBusoffprocessing,CanRxProcessing,CanTxProcessing,CanWakeupSupport配置成中断形式的也就是 INTERRUPT类型的。如果要配成INTERRUPT类型的,则需要Irq以及Os模块来配合使用,这个后面介绍。

波特率的配置就比较简单了,根据你计算的值配置好就行,如果需要配置,则只需要在CanControllerFdBaudrateConfig中配置相应的参数即可,这里不再多说。

CanHardwareObject:

这个主要是配置每个Object对应的参数,这里有几个点需要注意。首先,对于接收的报文,需要配置CanHwFilterCode和CanHwFilterMask两个参数,用来过滤你需要接收到的报文,对于发送的则不需要,因为这个ID在上层就已经确定了。其次,对于CanObjectType,根据顺序需要先配置Receive类型的报文,然后才能配置TRANSMIT类型的,并且在同一种类型中,如果需要选择不同的Controller,CanControllerRef选项需要先选择ControllerId小的,再配置ControllerId大的,如下图:

同为RECEIVE类型的Object,配置了两个Controller,CANNODE_SQ的ID是0,CANNODE_ARS408的ID是1,所以需要先配置CANNODE_SQ对应的Object。

IRQ

如果CanController配置的都是Interrupt类型,则需要在中断模块配置对应的参数,例如:

如果项目使用的是Can00,则中断则对应IrqCanSR0、IrqCanSR1、IrqCanSR2、IrqCanSR3四个寄存器,具体四个分别是什么意思可以查看你使用的芯片手册,我是用的是英飞凌的TC397.此处我是用了IrqCanSR0、IrqCanSR1、IrqCanSR2三个中断,所以对应的选项应该宣称CAT2,对应的优先级别也要设置一下。

API及应用:

大部分Api可以根据字面意思理解出来,这里简单说一下几个常用的API。首先需要SetControllerMode,使用Can_17_McmCan_SetControllerMode(const uint8 Controller, const Can_StateTransitionType Transition),将对应的Can通道的模式设置成CAN_T_START,这样之后才能正常通讯。

对于TX来说,如果采用的是中断模式,则可以调用Can_17_McmCan_Write(const Can_HwHandleType Hth, const Can_PduType* const PduInfo )

函数发送具体的信号报文(注意这是在没有做BSW com模块的基础之上手动调用的,如果配置了Com,Canif等模块,何时发送就要交到Com层去处理,然后autosar的逻辑就会自动调用这个函数去发送报文)

如果采用的是polling模式,则还要调用Can_17_McmCan_MainFunction_Write()函数去处理回调的问题。

对于RX接收来说,如果是polling模式,则需要调用Can_17_McmCan_MainFunction_Read()来处理回调的问题。

一个简单的Example如下:

/* Put the CAN controllers into started state */

  Can_17_McmCan_SetControllerMode (Can_17_McmCanConf_CanController_CanController_0, CAN_T_START);

/*CanWrite for transmit */

Can_17_McmCan_Write( 8, &PduInfo_1[ 2]) ;

#if (CAN_17_MCMCAN_TX_POLLING_PROCESSING == STD_ON)

Can_17_McmCan_MainFunction_Write();

#endif

物联沃分享整理
物联沃-IOTWORD物联网 » 基于英飞凌TC397芯片的MCAL CAN模块配置

发表评论