单块板子在接入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模式下进行分析。