S32K1xx芯片如何利用SDK处理CAN Error简介

S32K1xx芯片如何利用SDK处理CAN Error简介

1.背景介绍

S32K1xx芯片由于其在通用汽车MCU中性价比极高,而被许多客户选来开发包含CAN功能的车身电子产品(如BCM,lighting,Doors,BMS,ABS)。而汽车电子类的产品,只要用到了CAN,一般在物理层都需要进行CAN error处理的测试,相关的测试项如下表所示:

测试项目测试结果
物理层CANH或CANL断路
物理层CANH与或CANL对电源短路
物理层CANH与或CANL对地短路
物理层CANH与CANL短路
物理层BusOff行为测试
虽然是以上测试项属于物理层测试,但是和CAN收发器的关系并不大,主要和MCU内部CAN功能的软件配置相关,下面基于S32K118简单介绍一下如何处理CAN Error。

2.准备环境

  • 编译器:S32DS for ARM 2018.R1
  • SDK:RTM3.0.0
  • 芯片:FS32K118LAT0MLFT

3.CAN Error处理介绍

1.SDK包的中断处理函数为FLEXCAN_IRQHandler(),这个函数会调用FLEXCAN_Error_IRQHandler(),如果建立了CAN_Error的回调函数,FLEXCAN_Error_IRQHandler会调用它进行处理;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.对于CAN Error的处理,建议使用FLEXCAN_DRV_GetErrorStatus()函数获取CAN总线的错误类型以及目前的错误状态,从而进行进一步的处理;

3.CAN总线的错误类型总共有5种,如下图所示,ESR1寄存器包含了上述5中错误(其中位错误分为bit1和bit0);其中位错误、格式错误、ACK错误属于发送节点的错误,填充错误、格式错误、CRC错误属于接收节点的错误;


在这里插入图片描述

4.FLEXCAN_DRV_GetErrorStatus()函数返回的是CAN模块ESR1寄存器的值,ESR1有关这五种错误的相应位的详细描述,建议参考S32K-RM文档,链接地址:https://www.nxp.com/webapp/Download?colCode=S32K1XXRM;(最新版的手册需要在NXP官网注册并登陆账号才能下载)

在这里插入图片描述

5.CAN总线的错误帧标识分为主动错误标识和被动错误标识;

6.CAN总线错误状态机以及错误计数规则如下;

在这里插入图片描述
在这里插入图片描述

7.通过ESR1寄存器中的FLTCONF位和BOFFINT位判断CAN节点处于哪种错误状态,或者配置产生BUSOFF中断;

在这里插入图片描述

8.同时S32K1xx.h文件也将ESR1寄存器的每个位做好了宏定义,方便调用;

在这里插入图片描述

9.建立回调函数方法参考下图,需要同时建立回调函数和注册回调函数;
  • 建立回调函数:
    在这里插入图片描述
  • 注册回调函数:
    在这里插入图片描述
10.现在车厂对于busoff都要求快恢复和慢恢复,如果未在busoff中断处理函数中deinit CAN模块,建议通过将寄存器CTRL1的BOFFREC位置1关闭busoff自动恢复;

在这里插入图片描述

11.bus-off恢复的时间,在GMW14242标准中有定义,如下表:

注:所谓的busoff恢复,即进入CAN busoff状态后,ECU重新初始化CAN模块,并等待一段时间(快恢复时间或 慢恢复时间)后,重新使能总线报文的发送。如果报文发送成功,则CAN busoff恢复成功。
在这里插入图片描述

12.一般情况下,只需要在错误回调函数里判断是否发生busoff,从而进行快恢复和慢恢复的处理(如下例程),其他错误不需要处理(SDK里的错误中断函数会清除错误标志)。
//CAN busoff恢复类型
typedef enum 
{
	TIMER_CAN_BUSOFF_QUICKRESTORE_DELAY,
	TIMER_CAN_BUSOFF_SLOWRESTORE_DELAY,
	TIMER_CAN_BUSOFF_RESTORSUCCESS_DELAY,
} VtimerName_t;
//CAN busoff恢复时间
#define TIMER_CAN_BUSOFF_QUICKRESTORE_TIMER					100
#define TIMER_CAN_BUSOFF_SLOWRESTORE_TIMER					1000
//CAN error回调函数
void canErr_callback (uint8_t instance, flexcan_event_type_t eventType, flexcan_state_t *driverState)
{
	if(eventType == FLEXCAN_EVENT_ERROR)
	{
		ecr1 = FLEXCAN_DRV_GetErrorStatus(instance);
		if(ecr1 & CAN_ESR1_BOFFINT_MASK)
		{
			//CAN模块反初始化
			FLEXCAN_DRV_Deinit(INST_CANCOM1);
			busoffTriggle = true;
		}

//CAN busoff快_慢恢复处理
static void canBusOffHandle(FLAG *flag)
{
	static uint32_t busoffCount = 0;
	if(true == busoffTriggle)
	{
		busoffTriggle = false;
		if(++busoffCount >= QUICKRESTORECNT)
		{
			busoffCount = QUICKRESTORECNT;			                                                         
			vtimer_SetTimer(TIMER_CAN_BUSOFF_SLOWRESTORE_DELAY, TIMER_CAN_BUSOFF_SLOWRESTORE_TIMER);
		}
		else
		{
			vtimer_SetTimer(TIMER_CAN_BUSOFF_QUICKRESTORE_DELAY, TIMER_CAN_BUSOFF_QUICKRESTORE_TIMER);
		}
        //中止CAN通信相关的tasks
		StopCAN_TX();
		vtimer_ResetTimer(TIMER_CAN_BUSOFF_RESTORSUCCESS_DELAY,(TIMER_CAN_BUSOFF_SLOWRESTORE_TIMER + TIMER_CAN_BUSOFF_QUICKRESTORE_TIMER)*2);
	}
	if(_TRUE == vtimer_TimerElapsed(TIMER_CAN_BUSOFF_RESTORSUCCESS_DELAY))
	{
		busoffCount = 0;
		flag->uFBusOff_Err = 0;
	}
	if(_TRUE == vtimer_TimerElapsed(TIMER_CAN_BUSOFF_QUICKRESTORE_DELAY)
	|| _TRUE == vtimer_TimerElapsed(TIMER_CAN_BUSOFF_SLOWRESTORE_DELAY))
	{
        //CAN重新初始化
		ResumeCAN_TX();
	}
}

4.CAN Error测试

4.1 测试设备:

  • S32K118开发板一个
  • USBCAN卡一个

4.2测试过程:

由于没有专业CAN仪器去创造各种所需的错误,这里只测试CAN断路和短路;同时使用默认的busoff自恢复机制。

  1. S32K1xx以100ms的周期向CAN卡发送报文。
  2. 将CAN_H和CAN_L分别断开,CAN卡接收不到报文,此时查看ESR1寄存器的FLTCONF位,值为01b(error passive),不会变成1xb(bus off);然后接上CAN_H和CAN_L,通信恢复。
  3. 将CAN_H和CAN_L短接,CAN卡接收不到报文,此时查看ESR1寄存器的FLTCONF位,值为1xb(bus off);然后将CAN_H和CAN_L恢复正常连接,通信恢复。

4.3测试结果

  • CAN总线断路只会进入被动错误状态,而CAN总线短路会进入busoff状态,且两种情况下,只要总线恢复正常,通信也会自动恢复;
  • 关于CAN总线断路无法进入busoff的原因如下:CAN总线断开后,S32K118是总线上唯一的节点,当进入被动错误之后,仍然只能检测到ACK错误并且随后发送的被动错误标志(6个连续的隐形电平)不会有节点发送显性电平改变他,则TEC不会增加,从而无法进入到busoff状态。
  • 11
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Auto FAE进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值