心得分享:STM32F407双CAN调试经验总结

近期在做一个项目需要用到STM32F407的两路CAN口,调试时踩坑了,在这里把坑记录一下

单独调试CAN1时没问题,单独调试CAN2时发现出问题了接收不到数据!!!

然后开始了漫长的调试,排查故障最后发现问题所在了,

单独使用CAN2时一定要同时打开CAN1和CAN2的时钟,否则CAN2无法正常工作,因为CAN2是从CAN,CAN1是主CAN,ST官方库函数里有说到:

 

 通过修改后问题得到解决

但是到双CAN通信(CAN1发CAN2收)测试时又进坑了,CAN1发CAN2竟然收不到数据!!!

刚刚CAN2不是收到数据了吗?郁闷半天又开始漫长的调试和排查故障的时候了。

最后发现问题竟然出在过滤器上,CAN2的过滤器需配置>=14

通常情况下CAN1的过滤器时0~13,如果CAN2配置的过滤器也在0~13内的话,那么恭喜你踩坑了。

通过修改CAN2的程序过滤器编号改为14后正常使用。

最后效果

 

GPIO_InitTypeDef GPIO_InitStructure; 
CAN_InitTypeDef        CAN_InitStructure;
CAN_FilterInitTypeDef  CAN_FilterInitStructure;

	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);            											 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
	

GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_CAN1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_CAN1); 
	

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
	
   	CAN_InitStructure.CAN_TTCM=DISABLE;	
  	CAN_InitStructure.CAN_ABOM=ENABLE;	  
  	CAN_InitStructure.CAN_AWUM=ENABLE;
  	CAN_InitStructure.CAN_NART=ENABLE;	
  	CAN_InitStructure.CAN_RFLM=DISABLE;	 
  	CAN_InitStructure.CAN_TXFP=DISABLE;	
  	CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;	 
  	CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;	
  	CAN_InitStructure.CAN_BS1=CAN_BS2_6tq; 
  	CAN_InitStructure.CAN_BS2=CAN_BS1_7tq;
  	CAN_InitStructure.CAN_Prescaler=6; 
  	CAN_Init(CAN1, &CAN_InitStructure);   
    
 	  CAN_FilterInitStructure.CAN_FilterNumber=0;	
  	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
  	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  	CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  	CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
   	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
  	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
  	CAN_FilterInit(&CAN_FilterInitStructure);
GPIO_InitTypeDef GPIO_InitStructure; 
	  CAN_InitTypeDef        CAN_InitStructure;
  	CAN_FilterInitTypeDef  CAN_FilterInitStructure;

	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);                											 

  	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);

	  GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_CAN2); 
	  GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_CAN2); 
	

	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	  
	  

   	CAN_InitStructure.CAN_TTCM=DISABLE;	
  	CAN_InitStructure.CAN_ABOM=ENABLE;	  
  	CAN_InitStructure.CAN_AWUM=ENABLE;
  	CAN_InitStructure.CAN_NART=ENABLE;	
  	CAN_InitStructure.CAN_RFLM=DISABLE;	
  	CAN_InitStructure.CAN_TXFP=DISABLE;	
  	CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;	 
  	CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;	
  	CAN_InitStructure.CAN_BS1=CAN_BS2_6tq; 
  	CAN_InitStructure.CAN_BS2=CAN_BS1_7tq;
  	CAN_InitStructure.CAN_Prescaler=6;  
  	CAN_Init(CAN2, &CAN_InitStructure);   
    

 	  CAN_FilterInitStructure.CAN_FilterNumber=20;	 
  	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
  	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;  
  	CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  	CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
   	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
  	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
  	CAN_FilterInit(&CAN_FilterInitStructure);

提示:如果还是不能用,就要检查CAN芯片的STB引脚是否使能了!!!,这个很重要!!!

物联沃分享整理
物联沃-IOTWORD物联网 » 心得分享:STM32F407双CAN调试经验总结

发表回复