在线时间10 小时
UID2017498
ST金币0
蝴蝶豆0
注册时间2013-6-7
初级会员
- 最后登录
- 2020-9-27
|
a0a.1 32b0c
CAN初始化函数 HAL_CAN_Init(CAN_HandleTypeDef* hcan) 的步骤大致如下:
退出睡眠模式;
请求进入初始化模式,并等待初始化确认标志INAK置位;
INAK标志位置位后进行初始化配置;
然后请求退出初始化模式,并等待确认初始化模式退出;
在HAL库的CAN初始化函数中,上述红色字体部分代码如下:
HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan)
{
。
。
。
。
。
。
/* Request leave initialisation */
CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
/* Get timeout */
tickstart = HAL_GetTick();
/* Wait the acknowledge */
while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
{
if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
{
hcan->State= HAL_CAN_STATE_TIMEOUT;
/* Process unlocked */
__HAL_UNLOCK(hcan);
return HAL_TIMEOUT;
}
}
/* Check acknowledged */
if (HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
{
status = CAN_INITSTATUS_SUCCESS;
}
}
。
。
。
。
。
。
}
有疑问的地方是代码中紫色字体的两行代码,因为在请求退出初始化模式之前,初始化模式标志位INAK是等于‘1’的,然后在程序
执行CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ)请求退出初始化模式之后,我们期望INAK被清‘0’,所以应该是使用
while()循环等待INAK从1变为0才对,也就是INAK=1的时候等待,INAK=0时退出while()循环;但上述程序中却是INAK=0的时候等待,INAK=1的时候退出while()循环。
参考手册中对于退出初始化模式的描述如下:
清除CAN_MCR寄存器的INRQ位为'0',请求bxCAN退出初始化模式,当硬件对CAN_MSR寄存
器的INAK位清'0',就确认了初始化模式的退出。
有知道原因的请指点一下,谢谢!
|
|