各位大神好,我最近的一个工程,发现Dcan经常死掉,于是在轮询的时间里加了一句话,去复位can:
//===================================================================
status_err = CAN_getStatus(CANA_BASE);
temp1= status_err & CAN_STATUS_BUS_OFF;
temp2= status_err & CAN_STATUS_EWARN ;
temp3= status_err & CAN_STATUS_EPASS ;
if( (temp1==CAN_STATUS_BUS_OFF) || (temp2== CAN_STATUS_EWARN) || ( temp3== CAN_STATUS_EPASS) )
{
CAN_Reset(CANA_BASE);
//CAN_enableController(CANA_BASE);
}
//===================================================================
CAN_Reset(CANA_BASE);这个是自己封装的函数,是把SWR支起来,去复位can,但是仍然无法去掉故障;
因此死后仿真查看,发现CAN_CTL的init位置1,于是在里面加了CAN_enableController(CANA_BASE);去复位init位。
但是,复现故障后,发现CAN_ES的EWarn和EPass位被置起来了,而且CAN_ERRC里面,CAN_RP置了1,CAN_REC装满了(0x7F)。
于是can就悲惨的无法工作了。
求个办法,怎么样去避免这个情况。我觉得can无法工作,应该和CAN_ERRC计数器满溢有关。
复现这个问题的办法是,设置can波特率为500k,然后用1000K的波特率去给他丢一包,然后再回来。发现can停工了。