当手动重置SLEEP位时,SLAK位不会重置。详情如下:
在尝试组建网络之前,我在环回模式下实现成功传输。但现在遇到了新问题。
在为外设设置环回模式并提供协调的位时序值(可能曾调整过但这些值现已恢复正常)后,我使用Cube生成代码。这意味着流程应首先退出睡眠模式,进入初始化模式,进行设置,退出初始化模式,然后开始正常模式。根据参考手册:
如果软件在bxCAN处于睡眠模式时通过设置INRQ位请求进入初始化模式,则必须同时清除SLEEP位。 清除SLEEP位后,一旦bxCAN与CAN总线同步,就会退出睡眠模式。当SLAK位被硬件清除后,睡眠模式即被退出。
并且为了同步,bxCAN会等待CAN总线空闲,这意味着在CANRX上监测到11个连续的隐性位。
根据数据位0编码为显性状态,而数据位1编码为隐性状态。
因此检查由Cube生成的代码,这正是正在发生的情况。我从stm32f4xx_hal_can.c中粘贴了关键部分如下:
HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan)
{
[...]
/* Exit from sleep mode */
CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
/* Get tick */
tickstart = HAL_GetTick();
/* Check Sleep mode leave acknowledge */
while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
{
if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
{
[...]
/*Error*/
}
}
/* Request initialisation */
SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
/* Get tick */
tickstart = HAL_GetTick();
/* Wait initialisation acknowledge */
while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
{
if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
{
[...]
/*Error*/
}
}
}
|