CAN 통신 목록 모드 구성 분석 및 stm32의 소스 코드

여기에 사진 설명 삽입
두 개의 32 비트 필터를 선택하십시오. 목록 모드에서 14 * 2 = 28 CAN 프레임.
0x10f46601 프레임을 필터링하려고하는데 바이너리는
0001 0000 1111 0100 0110 0110 0000 0001
이고 필터는 다음과 같습니다.
xxxx xxxx xxxx xxxx xxxx xxxx xxxx x100, 다음 100은 확장 데이터 프레임 때문입니다.
즉, 위의 필터링 된 X로 필터링 할 프레임을 가져옵니다. 즉,
1 0000 1111 0100 0110 0110 0000 0001 100, 정렬하려면
1000 0111 1010 0011 0011 0000 0000 1100 == 0x87a3 300c
구조로

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

위의 내용을 확인하십시오. 0001 0000 1111 0100 011 // 0 0110 0000 0001
So CAN_FilterIdHigh = (0x10f46601 >> 13) & 0xffff
CAN_FilterIdLow = ((0x10f46601 << 3) | 0x04) & 0xffff
전체 구성은 다음과 같습니다. 필터 3 * 2 = 6 프레임

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通信中断使能*/
}

추천

출처blog.csdn.net/qq_40831436/article/details/98763264