【简介】
在CAN 标准中对CAN的Busoff 的状态机的转换如下:

按照上述状态机的定义can 初始化完成后进入error active状态,在此状态下接收错误计数REC >127 或者发送错误计数TEC>127 时进入error passive状态,在 error passive 状态REC < 128,TEC < 128 状态恢复到 error active,在 error passive 状态 TEC > 255控制器进入到bus off 状态,bus off状态检测到 128 次 11 位隐性电平,才会离开 Bus‑Off 状态恢复到error active状态。
以下是S32K3 芯片手册中对bus off 状态机的实现说明,对应ECR寄存器来记录当前的错误计数状态。

S32K3的Busoff 状态管理是按照上述的CAN标准来实现的以下是S32K3 中硬件设计中busoff 恢复的策略。

以下是busoff 中断硬件自恢复硬件中断描述

添加如下的测试代码在busoff 触发和busoff done 状态下翻转IO来计算触发Bus off
void FlexCanX_Err_Callback(uint8 instance, Flexcan_Ip_EventType eventType,
uint32 u32ErrStatus,
const Flexcan_Ip_StateType * flexcanState)
{
Siul2_Dio_Ip_TogglePins(TRIGER_IO_PORT,(0x01<<TRIGER_IO_PIN));
// Handle FlexCAN error callback
printf("eventType=%d, u32ErrStatus=0x%lX\r\n", eventType, u32ErrStatus);
/* dump can ip ECR ESR1 ESR2 ERRSR */
printf("CAN[1] %x %x %x %x \r\n", (*(volatile uint32_t*)(0X4030401c)),(*(volatile uint32_t*)(0X40304020)),(*(volatile uint32_t*)(0X40304038)),(*(volatile uint32_t*)(0X40304afc)));
}本地测试数据如下

我要赚赏金
