stm32多块开发板can总线互联卡死问题

       单块板子在接入can总线时没有任何问题,但是多块板子同时接入can时,基本只有一块是可以用的,其他板子会卡死,起初认定是总线连接的问题,试过总线上接入120ohm电阻一只或两只,都没有效果,通过keil使用jlink进入调试模式发现程序卡死在startup_stm32f10x_md.s的下面位置,经老师指点此处应为stm32的中断服务程序的入口位置,推测是can总线中断没处理好,老师问有没有处理接收中断,我说没有写can接收的中断服务。

        273                B       .

        274

        275                ENDP

        然后,将下面程序中的ENABLE更改为DISABLE则,程序可以运行了。

         /*CAN FIFO0 message pending interrupt enable */

         CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //使能FIFO0消息挂号中断

        因此在多块can总线开发板互联时,要么编写can接收中断的服务程序,要么不要使能接收中断,即不使能FIFO0消息挂号中断,否则要加入类似如下的中断服务程序

/* USB中断和CAN接收中断服务程序,USB跟CAN公用I/O,这里只用到CAN的中断。 */
void USB_LP_CAN1_RX0_IRQHandler(void)
{
  
  CanRxMsg RxMessage;

  RxMessage.StdId=0x00;
  RxMessage.ExtId=0x00;
  RxMessage.IDE=0;
  RxMessage.DLC=0;
  RxMessage.FMI=0;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;    

  CAN_Receive(CAN1,CAN_FIFO0, &RxMessage); //接收FIFO0中的数据  
  if((RxMessage.StdId==slaveID)&&(RxMessage.Data[0]==0x55))   
  {FABIAO=0xff;}
  
  
}


        总结:

        个人觉得自己有点偏执,开始一直认为单个通信正常,连在一起不正常是总线对外硬件配置的问题,没有想到是程序配置问题,但是最终也大致提出了可能是can总线配置问题,但由于stm32 can总线没有仔细学习,导致也没有推测出问题。

        其二没有好好利用jlink,仅仅将其当作下载器使用,还是没有好好思考。没有多进入debug模式下进行分析。


posted @ 2016-10-27 19:04  信雪神话  阅读(1336)  评论(0编辑  收藏  举报