CAN错误记录
- HAL库生成代码与芯片引脚不相同
原因:初始化的引脚不正确,导致晶振错误而卡住了程序。
事情起因是,我用VI型芯片生成的代码与II型芯片生成的代码都不行,我跑去问czj和jz问用CubeMX生成的代码CAN能用吗?他们说他们都能。
我就疑惑了,通过一步步仿真最后终于找到了问题。
第一天我寻找到了第一个原因,在CAN的最后初始化中有一个这样的判断函数。
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
Error_Handler();//错误句柄
}
仿真发现,一直在他的while中不断的跑;我以为是HAL库本身的问题,而且去查阅资料,也发现有人卡在这一句,所有将它注释掉了,发现CAN初始化了,但发现不能收发,原因是
HAL_CAN_STATE_ERROR //can错误状态
所以不解决这个问题无法使用can。
第二天,再去往深一步中断看的时候发现它的错误来源于
while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
{
if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
{
/* Update error code */
hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
/* Change CAN state */
hcan->State = HAL_CAN_STATE_ERROR;
return HAL_ERROR;
}
}
看代码就能发现,返回错误值的地方。仔细查看这个就发现是超时产生的错误。但错误的方法就是将PD0、PD1更换CubeMX自己生成的PA11、PA12。