关于STM32cubemx CAN的问题

练习的时候使用stm32cubemx初始化F4的CAN,没有带CAN收发器,RX,TX甩空了,发现大部分时候会卡在cubemx生产的HAL驱动的HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan)中靠后的一行。
hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_INRQ;  
while((hcan->Instance->MSR & CAN_MSR_INAK) == CAN_MSR_INAK)
   {
    if((HAL_GetTick() - tickstart ) > CAN_TIMEOUT_VALUE)
     {
       hcan->State= HAL_CAN_STATE_TIMEOUT;
       /* Process unlocked */
       __HAL_UNLOCK(hcan);
       return HAL_TIMEOUT;
     }
   }
即将CAN配置完毕之后通过INRQ将CAN丢上线,然后就超时了。
原因就是CAN要上线的话必须等待RX上有足够长的"隐性"信号,如果没有加收发器或者没有上拉的话,这个RX上的信号是不对的,所以就超时了,如果上拉之后就是没有问题的。
要吐槽的是:ST的HAL封装得太大的,以前的驱动基本上是一个函数做一件事情,现在一个函数做了n件事情,还加上各种判断,如果用的硬件与官方想象的不一样的话,就会出各种奇怪的事情。。。
已邀请:

admin

赞同来自:

研究的很深入,赞一个!

Nuclear

赞同来自:

学习,楼主厉害

加了上拉,初始化还是超时。。。

索马里海盗!!

赞同来自:

一直没解决。。。放弃HAL改用标准库了。。。。

Burgess

赞同来自:

可以開Loop back mode或Silent mode,卡住是因為Bit error。

405867746

赞同来自:

深有体会,被Cube伤的不轻啊

知足长乐

赞同来自:

105的CAN发送正常,接受进中断就死机,换成205就全部正常。可能是库的问题。

傻瓜+笨蛋=我

赞同来自:

103的 发送一直出问题 以调用HAL_CAN_Transmit()这个函数就 就陷入了超时, 按照楼主的方式试了一下 加了上拉电阻 但是还是不行, 接收函数也一样, 一直陷入超时。HAL_CAN_Transmit_IT()使用这个函数不会陷入超时,但是发送的不成功, 使用自环模式都不成功, 但是使用标准库却可以,我对比了双方对寄存器的操作,寄存器的操作都是一样的 ,但是HAL库的加了很多判断,然后就不行了。。。。。求解。。。

要回复问题请先登录注册