FlexCAN can not disable some other ErrInt?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

FlexCAN can not disable some other ErrInt?

746 Views
liyun
Contributor II

I want to use only busoff interruption, so the other ErrInt should be disabled by lib function.

But I found the Mask bit in register CTRL1 can not be cleared.

Route:NXP\S32DS_ARM_v2018.R1\S32DS\S32SDK_S32K14x_RTM_2.0.0\platform\drivers\src\flexcan

void FLEXCAN_SetErrIntCmd(CAN_Type * base, flexcan_int_type_t errType, bool enable)
{
uint32_t temp = (uint32_t)errType;
if (enable)
{
if((errType == FLEXCAN_INT_RX_WARNING) || (errType == FLEXCAN_INT_TX_WARNING))
{
base->MCR = (base->MCR & ~CAN_MCR_WRNEN_MASK) | CAN_MCR_WRNEN(1U);
}
#if FEATURE_CAN_HAS_FD
if (errType == FLEXCAN_INT_ERR)
{
base->CTRL2 = (base->CTRL2 & ~CAN_CTRL2_ERRMSK_FAST_MASK) | CAN_CTRL2_ERRMSK_FAST(1U);
}
#endif
(base->CTRL1) = ((base->CTRL1) | (temp));
}
else
{
if((errType == FLEXCAN_INT_RX_WARNING) || (errType == FLEXCAN_INT_TX_WARNING))
{
base->MCR = (base->MCR & ~CAN_MCR_WRNEN_MASK) | CAN_MCR_WRNEN(0U);
}
#if FEATURE_CAN_HAS_FD
if (errType == FLEXCAN_INT_ERR)
{
base->CTRL2 = (base->CTRL2 & ~CAN_CTRL2_ERRMSK_FAST_MASK) | CAN_CTRL2_ERRMSK_FAST(0U);
}
#endif
(base->CTRL1) = ((base->CTRL1) | ~(temp)); ←Here!
}
}

The | (or) operation should be modified to &(and) operation?

(base->CTRL1) = ((base->CTRL1) & ~(temp));

Thank you.

0 Kudos
2 Replies

740 Views
Senlent
NXP TechSupport
NXP TechSupport

Hi@liyun

 Please update your software package to S32SDK_S32K14x_RTM_3.0.0. 

/*FUNCTION**********************************************************************
 *
 * Function Name : FLEXCAN_SetErrIntCmd
 * Description   : Enable the error interrupts.
 * This function will enable Error interrupt.
 *
 *END**************************************************************************/
void FLEXCAN_SetErrIntCmd(CAN_Type * base, flexcan_int_type_t errType, bool enable)
{
    uint32_t temp = (uint32_t)errType;
    if (enable)
    {
        if((errType == FLEXCAN_INT_RX_WARNING) || (errType == FLEXCAN_INT_TX_WARNING))
        {
           base->MCR = (base->MCR & ~CAN_MCR_WRNEN_MASK) | CAN_MCR_WRNEN(1U);
        }
#if FEATURE_CAN_HAS_FD
        if (errType == FLEXCAN_INT_ERR)
        {
           base->CTRL2 = (base->CTRL2 & ~CAN_CTRL2_ERRMSK_FAST_MASK) | CAN_CTRL2_ERRMSK_FAST(1U);
        }
#endif
        (base->CTRL1) = ((base->CTRL1) | (temp));
    }
    else
    {
    	(base->CTRL1) = ((base->CTRL1) & ~(temp));
#if FEATURE_CAN_HAS_FD
                if (errType == FLEXCAN_INT_ERR)
                {
                   base->CTRL2 = (base->CTRL2 & ~CAN_CTRL2_ERRMSK_FAST_MASK) | CAN_CTRL2_ERRMSK_FAST(0U);
                }
#endif
        temp = base->CTRL1;
		if (((temp & (uint32_t)FLEXCAN_INT_RX_WARNING) == 0U) && ((temp & (uint32_t)FLEXCAN_INT_TX_WARNING) == 0U))
		{
		   /* If WRNEN disabled then both FLEXCAN_INT_RX_WARNING and FLEXCAN_INT_TX_WARNING will be disabled */
		   base->MCR = (base->MCR & ~CAN_MCR_WRNEN_MASK) | CAN_MCR_WRNEN(0U);
		}
    }
}

The latest version has reached 4.0, you can get related information on the official website.

BR!

     Jim,

 

 

 

0 Kudos

726 Views
liyun
Contributor II

Hi@Senlent,

Thank you very much.

I'll update to new version.

0 Kudos