STM32芯片CAN2只能发送不能接收问题解决。

STM32F107在使用过程中,调整了一下任务优先级后,发现CAN2相关的任务的优先级被提高后,CAN2只能发送,不能接收,后来通过把CAN2的任务延时一段时间再初始化启动,发现可以正常收发了,通过排除的办法,发现只要CAN1的任务只要滞后与CAN2任务的启动,就会发生这种现象。后来听同事讲STM32的CAN2是通过CAN1扩展出来的,必须先初始化CAN1,再初始化CAN2才可以正常运行。后来把这两个CAN的初始化做了个先后顺序初始化后,恢复正常。怎么调整任务优先级都可以正常收发。

在网上搜了一下,发现有其它朋友也碰到过此种情况:

调试STM32F107的CAN2竟然无法接收。通过与另一个代码对比,终于发现想用CAN2,则必须把CAN1的RCC也配置上,就可以接收了。

上网查了下,21IC给解释http://bbs.21ic.com/icview-542674-1-1.html。手册也懒得看了,总之,CAN2和CAN1是有关联的。对于STM32F407可能也是如此。

如果设置两遍也不行。也是CAN2不能接收。

比如这样设置两遍:

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);

那么不行,只有在整个工程中设置一遍才可以,如下:

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);

只有先使能CAN1  然后才使能CAN2  否则有的不好用。

上面这些都是试出来的,没看文档,没理论依据。

关于FIFO 的配置  可以看这个文章http://blog.csdn.net/varding/article/details/39179125

而我目前只是采用一个FIFO0.

好用就得。实时性对我来说是次要的。
 

你可能感兴趣的:(STM32)