flexcan bug in SDK version RTM2.0.0 and BETA_2.9.0

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

flexcan bug in SDK version RTM2.0.0 and BETA_2.9.0

跳至解决方案
1,588 次查看
cheney
Contributor III

Dear support team:

    I found a bug in flexcan module, it leads to the interrupt can't disable correctly.

   Description:

    file: 

   flexcan_hw_access.c

    function:

    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 '|' should modify to '&' */
}
}

标签 (1)
标记 (1)
0 项奖励
回复
1 解答
1,440 次查看
alexandrunan
NXP Employee
NXP Employee

Hello, 

Thank you for feedback, yes it's a bug there and will be fixed in the next SDK release.

The fix will be :

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);
}
}
}

BR, 

Alexandru Nan

在原帖中查看解决方案

0 项奖励
回复
1 回复
1,441 次查看
alexandrunan
NXP Employee
NXP Employee

Hello, 

Thank you for feedback, yes it's a bug there and will be fixed in the next SDK release.

The fix will be :

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);
}
}
}

BR, 

Alexandru Nan

0 项奖励
回复