情形一:卡死在HAL_CAN_Init()然后死机
解决方案:
在while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)前增加一句CLEAR_BIT(hcan.Instance->MCR,CAN_MCR_SLEEP);
这时因为st和gd实现的底层顺序不一样,gd不清这个就一直在睡眠导致无法初始化成功
情形二:卡死在HAL_CAN_START()里面
MSR寄存器无法清零
while ((hcan->Instance->MSR & CAN MSR INAK) != 0U)
根据手册,MSR为硬件主状态寄存器
NAK位:CAN 达到同步后,并为接收和发送数据作好准备了。为此,硬件相应地对 CAN_MSR 寄存器的 INAK 位清’0’。初始化时,CAN_MSR寄存器的INAK置‘1’。
当CAN在接收端检测到连续的11个隐性位后CAN将完成同步,此时便可以开始正常的通信,这个时候硬件会自动将CAN_MSR寄存器(CAN主状态寄存器)中的INAK位置0
经查,原理图跳线和实物不一致,导致can的收发器没有接到芯片上。