CAN communication list mode configuration analysis and source code in stm32

Insert picture description here
Choose two 32-bit filters. In the list mode, 14*2=28 CAN frames.
Suppose I want to filter a frame of 0x10f46601, its binary is:
0001 0000 1111 0100 0110 0110 0000 0001
and the filter is:
xxxx xxxx xxxx xxxx xxxx xxxx xxxx x100, the following 100 is because of the extended data frame,
that is, the above Get the frame to be filtered into the filtered X, that is:
1 0000 1111 0100 0110 0110 0000 0001 100, to sort it out:
1000 0111 1010 0011 0011 0000 0000 1100 == 0x87a3 300c
into the structure is

CAN_FilterInitStructure.CAN_FilterIdHigh= 0x87a3;		//授时帧0x10f46601//要过滤的ID高位 
    CAN_FilterInitStructure.CAN_FilterIdLow= 0x300c;

Observe the above: 0001 0000 1111 0100 011 // 0 0110 0000 0001
So CAN_FilterIdHigh=(0x10f46601>>13) & 0xffff
CAN_FilterIdLow= ((0x10f46601<<3) | 0x04) & 0xffff The
complete configuration is as follows, filter 3*2=6 Frames

static void CAN_Filter_Config()
{
	CAN_FilterInitTypeDef  CAN_FilterInitStructure;

	/*CAN过滤器初始化*/
	  CAN_FilterInitStructure.CAN_FilterNumber=0;						//过滤器组0
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;	   //工作在列表模式//工作在标识符屏蔽位模式
	  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;	//过滤器位宽为单个32位。
	/* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */

    CAN_FilterInitStructure.CAN_FilterIdHigh= 0x87a3;		//授时帧0x10f46601//要过滤的ID高位 
    CAN_FilterInitStructure.CAN_FilterIdLow= 0x300c;	 
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (((0x10f46602)>>13)&0xffff);    //授时帧0x10f46602
    CAN_FilterInitStructure.CAN_FilterMaskIdLow= (((((uint32_t)0x10f46602)<<3)|(0x00000004))&0xffff);
	  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;							//过滤器被关联到FIFO0
	  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;										//使能过滤器
	  CAN_FilterInit(&CAN_FilterInitStructure);
	
	  CAN_FilterInitStructure.CAN_FilterNumber=1;						//过滤器组1
	  CAN_FilterInitStructure.CAN_FilterIdHigh=((((0x08840001|(Derailment_Addr<<8) ))>>13)&0xffff);     //收到主机1给予的控制帧
	  CAN_FilterInitStructure.CAN_FilterIdLow=(((((uint32_t)(0x08840001|(Derailment_Addr<<8) ))<<3)|(0x00000004))&0xffff);
	  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=((((0x08840002|(Derailment_Addr<<8) ))>>13)&0xffff);     //收到主机2给予的控制帧
	  CAN_FilterInitStructure.CAN_FilterMaskIdLow=(((((uint32_t)(0x08840002|(Derailment_Addr<<8) ))<<3)|(0x00000004))&0xffff);
	  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;							//过滤器被关联到FIFO0
	  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;										//使能过滤器
	  CAN_FilterInit(&CAN_FilterInitStructure);
	
	  CAN_FilterInitStructure.CAN_FilterNumber=2;						//过滤器组2
	  CAN_FilterInitStructure.CAN_FilterIdHigh= (((( 0x04780001|(Derailment_Addr<<8) ))>>13)&0xffff);     //收到主机1关于报警帧的响应
	  CAN_FilterInitStructure.CAN_FilterIdLow= (((((uint32_t)( 0x04780001|(Derailment_Addr<<8) ))<<3)|(0x00000004))&0xffff);
	  CAN_FilterInitStructure.CAN_FilterMaskIdHigh= (((( 0x04780002|(Derailment_Addr<<8) ))>>13)&0xffff);    //收到主机2关于报警帧的响应
    CAN_FilterInitStructure.CAN_FilterMaskIdLow= (((((uint32_t)( 0x04780002|(Derailment_Addr<<8) ))<<3)|(0x00000004))&0xffff);
	  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;							//过滤器被关联到FIFO0
	  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;										//使能过滤器
	  CAN_FilterInit(&CAN_FilterInitStructure);
	
  	CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);     /*CAN通信中断使能*/
}

Guess you like

Origin blog.csdn.net/qq_40831436/article/details/98763264