STM32F103 CAN总线配置总结

stm32的can总线的配置如下:

      CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式
      CAN_InitStructure.CAN_ABOM=DISABLE;
      CAN_InitStructure.CAN_AWUM=DISABLE;
      CAN_InitStructure.CAN_NART=DISABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失) 
      CAN_InitStructure.CAN_RFLM=DISABLE;
      CAN_InitStructure.CAN_TXFP=DISABLE;
      CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
      //CAN_Mode_LoopBack
      //CAN_Mode_Normal
      CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
      CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;//1--16
      CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//1--8
      CAN_InitStructure.CAN_Prescaler=2;

      CAN_Init(&CAN_InitStructure);
       /* CAN filter init */
      CAN_FilterInitStructure.CAN_FilterNumber=0;//选择过滤器0
      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定过滤器被设置为标识符屏蔽模式
      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//给出过滤器位宽为32位

下面根据设置的参数不同来决定can总线can总线的配置情况:

1、对扩展数据帧进行过滤:(只接收扩展数据帧)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xFFFF0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;
(注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)
2、对扩展远程帧过滤:(只接收扩展远程帧)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xFFFF0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;
3、对标准远程帧过滤:(只接收标准远程帧)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;
4、对标准数据帧过滤:(只接收标准数据帧)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;
5、对扩展帧进行过滤:(扩展帧不会被过滤掉)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xFFFF0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC;
6、对标准帧进行过滤:(标准帧不会被过滤掉)
      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;
      CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD)&0xffff;
      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC;
注:slave_id为要过滤的id号。

标准帧,扩展帧混合配置:

void CAN_Configuration(void)
{
	CAN_InitTypeDef        CAN_InitStructure;
  	CAN_FilterInitTypeDef  CAN_FilterInitStructure;
//	CAN_DeInit();
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE); //
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE ); //复位CAN1所有寄存器

	
	
	/* CAN cell init */
	CAN_InitStructure.CAN_TTCM=DISABLE;				  //ʹÄÜ»òÕß½ûֹʱ¼ä´¥·¢Í¨ÐÅģʽ
	CAN_InitStructure.CAN_ABOM=DISABLE;				  //ʹÄÜ»òÕß½ûÖ¹×Ô¶¯¹Ø±Õ¹ÜÀí
	CAN_InitStructure.CAN_AWUM=DISABLE;				  //ʹÄÜ»òÕß½ûÖ¹×Ô¶¯»½ÐÑģʽ
	CAN_InitStructure.CAN_NART=ENABLE;//DISABLE;	  //使能或禁止自动重传模式
	CAN_InitStructure.CAN_RFLM=DISABLE;				  //ʹÄÜ»òÕß½ûÖ¹½ÓÊÕFIFOËø¶¨Ä£Ê½
	CAN_InitStructure.CAN_TXFP=DISABLE;				  //ʹÄÜ»òÕß½ûÖ¹·¢ËÍFIFOÓÅÏȼ¶
	CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;	  //CANÓ²¼þ¹¤×÷ÔÚÆÕͨģʽÏÂ	CAN_Mode_Normal	  CAN_Mode_LoopBack
	CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;			  //
	CAN_InitStructure.CAN_BS1=CAN_BS1_4tq;			  //
	CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;			  //
	CAN_InitStructure.CAN_Prescaler=1;				  //4000K/(1+1+4)/1 = 500K
	CAN_Init(&CAN_InitStructure);	

	
	#define   ID_REQUEST                          0xf9
			
	  /*第0组滤波器初始化 CAN filter init */	
	CAN_FilterInitStructure.CAN_FilterNumber = 0;//第0组滤波器			
	CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;	
	CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;	//一个32位过滤器
	CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)ID_REQUEST<<21)&0xffff0000)>>16;
	//(u32)(((CAN_EXT0_ID<<3)&0xFFFF0000)>>16);				
	CAN_FilterInitStructure.CAN_FilterIdLow =  (((u32)ID_REQUEST<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;
	//(u32)(((CAN_EXT0_ID<<3)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF);			
	CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;			
	CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;				
	CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;		
	CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;			
	CAN_FilterInit(&CAN_FilterInitStructure);
	 /*第1组滤波器初始化 CAN filter init */
	CAN_FilterInitStructure.CAN_FilterNumber=1;	//第1组滤波器					
	CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT1_ID<<3)&0xFFFF0000)>>16);				
	CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT1_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©						
	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;			
	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;				
	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;		
	CAN_FilterInit(&CAN_FilterInitStructure);
	 /*µÚ3×éÂ˲¨Æ÷³õʼ»¯CAN filter init */
	 	CAN_FilterInitStructure.CAN_FilterNumber=3;	//µÚ3×é¹ýÂËÆ÷					
	CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT3_ID<<3)&0xFFFF0000)>>16);				//Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨¸ß£©
	CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT3_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©						
	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;			
	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;				
	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;		
	CAN_FilterInit(&CAN_FilterInitStructure);
	 /*µÚ5×éÂ˲¨Æ÷³õʼ»¯CAN filter init */
	CAN_FilterInitStructure.CAN_FilterNumber=5;	//µÚ5×é¹ýÂËÆ÷					
	CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT5_ID<<3)&0xFFFF0000)>>16);				//Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨¸ß£©
	CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT5_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©						
	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;			
	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;				
	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;		
	CAN_FilterInit(&CAN_FilterInitStructure);
	 /*µÚ6×éÂ˲¨Æ÷³õʼ»¯CAN filter init */
/*	CAN_FilterInitStructure.CAN_FilterNumber=6;	//µÚ6×é¹ýÂËÆ÷					
	CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT6_ID<<3)&0xFFFF0000)>>16);				//Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨¸ß£©
	CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT6_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©						
	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;			
	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;				
	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;		
	CAN_FilterInit(&CAN_FilterInitStructure);*/
	/*µÚ9×éÂ˲¨Æ÷³õʼ»¯CAN filter init */
/*	CAN_FilterInitStructure.CAN_FilterNumber=9;	//µÚ9×é¹ýÂËÆ÷					
	CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT9_ID<<3)&0xFFFF0000)>>16);				//Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨¸ß£©
	CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT9_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©						
	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;			
	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;				
	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;		
	CAN_FilterInit(&CAN_FilterInitStructure);*/
	/*µÚ13×éÂ˲¨Æ÷³õʼ»¯CAN filter init */
/*	CAN_FilterInitStructure.CAN_FilterNumber=13;	//µÚ13×é¹ýÂËÆ÷					
	CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT13_ID<<3)&0xFFFF0000)>>16);				//Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨¸ß£©
	CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT13_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©						
	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;			
	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;				
	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;		
	CAN_FilterInit(&CAN_FilterInitStructure);*/
  /* CAN FIFO0 message pending interrupt enable */ 
  CAN_ITConfig(CAN_IT_TME, ENABLE);
	
	CAN_ITConfig(CAN_IT_FMP0, ENABLE);
	CAN_ITConfig(CAN_IT_FF0, ENABLE);
	CAN_ITConfig(CAN_IT_FOV0, ENABLE);
	
/*	CAN_ITConfig(CAN_IT_FMP1, ENABLE);
	CAN_ITConfig(CAN_IT_FF1, ENABLE);
	CAN_ITConfig(CAN_IT_FOV1, ENABLE);
	
	CAN_ITConfig(CAN_IT_EWG, ENABLE);
	CAN_ITConfig(CAN_IT_EPV, ENABLE);
	CAN_ITConfig(CAN_IT_BOF, ENABLE);
	CAN_ITConfig(CAN_IT_LEC, ENABLE);
	CAN_ITConfig(CAN_IT_ERR, ENABLE);
	CAN_ITConfig(CAN_IT_WKU, ENABLE);
	CAN_ITConfig(CAN_IT_SLK, ENABLE);*/
}
发布了34 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/fuhanga123/article/details/97394782