STM 32 F 105 CAN通信フィルタ構成の問題

7217 ワード

CAN通信のフィルタ配置に対する最近のプロジェクトの理解をまとめます.
  • ここで私はSTM 32 F 105シリーズのチップを使っています.2ウェイCANがあります.私はCAN 2を使っています.フィルタは15から設定できます.もちろん、1からでも問題ありません.
  • CANフィルタが設定されている場合、指定されたIDのデータしか受信できないことを示し、他のIDから送信されたデータは、CAN割り込みをトリガーすることなく、システムの安定性をさらに向上させることができる.CANバスにデータが多い場合は必要です.具体的には、
  • 	CAN_SlaveStartBank(15); // can2     15   
    	CAN_FilterInitStructure.CAN_FilterNumber=15; 
    	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
    	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 
    	//         ID 0x11,   ID 0x14   ,       
    	CAN_FilterInitStructure.CAN_FilterIdHigh=0x1114; 
    	CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; 
    	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
    	CAN_FilterInit(&CAN_FilterInitStructure);
    

    複数のフィルタを設定する場合は、次のように構成します.
    	CAN_FilterInitStructure.CAN_FilterNumber=16; 
    	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
    	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 
    	CAN_FilterInitStructure.CAN_FilterIdHigh=0x1113; 
    	CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; 
    	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
    	CAN_FilterInit(&CAN_FilterInitStructure);
    

    このように推す.3.CAN 2を単独で使用する場合は、まずCAN 1のクロックをオンにしなければならない.そうしないと、データが受け取れない.CAN完全な初期化コード(F 105シリーズのCAN 2クロックイネーブル部分に注意):
    //CAN     
    //   tsjw :          .  :CAN_SJW_1tq~ CAN_SJW_4tq
    //   tbs2 :   2     .     :CAN_BS2_1tq~CAN_BS2_8tq;
    //   tbs1 :   1     .     :CAN_BS1_1tq ~CAN_BS1_16tq
    //   brp ;      .  :1~1024;  tq=(brp)*tpclk1
    //   =Fpclk1/((tbs1+1+tbs2+1+1)*brp);
    //  :Fpclk1             36M,     CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);
    //     :(pclk1/((tsjw+tbs2+tbs1)*brp)) = 36Mhz/18/4 = 500Kbits
    //   mode :    : mode:CAN_Mode_Normal,    ;CAN_Mode_LoopBack,    ; 
    //CAN       ,    500Kbps 
    //   :0,   OK;
    //      ,     ;
    //         ;CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_4tq,CAN_BS2_7tq,6,CAN_Mode_Normal);//    
    u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
    {
    	GPIO_InitTypeDef 		GPIO_InitStructure; //     
    	CAN_InitTypeDef        	CAN_InitStructure;
    	CAN_FilterInitTypeDef  	CAN_FilterInitStructure;
    	
    	NVIC_InitTypeDef  		NVIC_InitStructure;//CAN  RX0    
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//  PORTB  	                   											 
    
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); //     
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);//  CAN2  	 
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//      
    	GPIO_Init(GPIOB, &GPIO_InitStructure);			//   IO
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    //  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	//      
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
      GPIO_Init(GPIOB, &GPIO_InitStructure);			//   IO
    	
    	//CAN    
      CAN_InitStructure.CAN_TTCM = DISABLE;//          
    	CAN_InitStructure.CAN_ABOM = ENABLE; /*       ,    :       128 11    ,         。              */
    //  CAN_InitStructure.CAN_ABOM = DISABLE;//   CAN_MCR    INRQ    1  0 ,       128 11       ,       (        )
      CAN_InitStructure.CAN_AWUM = DISABLE;//          (  CAN->MCR SLEEP )???
      CAN_InitStructure.CAN_NART = DISABLE; /*     ,            ,       */
    //	CAN_InitStructure.CAN_NART = ENABLE;//         
      CAN_InitStructure.CAN_RFLM = DISABLE;//     ,        
    	CAN_InitStructure.CAN_TXFP = ENABLE;  /*        0---        1---         	*/
    //	CAN_InitStructure.CAN_TXFP = DISABLE;//  FIFO             
      CAN_InitStructure.CAN_Mode = mode;//    : mode:CAN_Mode_Normal,    ;CAN_Mode_LoopBack,    ; 
      
      //     
      CAN_InitStructure.CAN_SJW = tsjw;//        (Tsjw) tsjw+1       CAN_SJW_1tq  CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
      CAN_InitStructure.CAN_BS1 = tbs1;//Tbs1=tbs1+1     CAN_BS1_1tq ~CAN_BS1_16tq
      CAN_InitStructure.CAN_BS2 = tbs2;//Tbs2=tbs2+1     CAN_BS2_1tq ~	CAN_BS2_8tq
    	
    	//(pclk1/((1+8+9)*4)) = 36Mhz/18/4 = 500Kbits
    	//(pclk1/((1+4+7)*6)) = 36Mhz/18/4 = 500Kbits
      CAN_InitStructure.CAN_Prescaler = brp; 
            
      CAN_Init(CAN2, &CAN_InitStructure);
    	
    	#if 1
    	//   
    	CAN_SlaveStartBank(15); // can2     15   
    	CAN_FilterInitStructure.CAN_FilterNumber=15; 
    	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
    	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 
    	CAN_FilterInitStructure.CAN_FilterIdHigh=0x1114; 
    	CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; 
    	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
    	CAN_FilterInit(&CAN_FilterInitStructure);
    
    	CAN_FilterInitStructure.CAN_FilterNumber=16; 
    	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
    	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 
    	CAN_FilterInitStructure.CAN_FilterIdHigh=0x1113; 
    	CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; 
    	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
    	CAN_FilterInit(&CAN_FilterInitStructure);
    	
    	CAN_FilterInitStructure.CAN_FilterNumber=17; 
    	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
    	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 
    	CAN_FilterInitStructure.CAN_FilterIdHigh=0x1115; 
    	CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; 
    	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
    	CAN_FilterInit(&CAN_FilterInitStructure);
    	
    	CAN_FilterInitStructure.CAN_FilterNumber=18; 
    	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
    	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 
    	CAN_FilterInitStructure.CAN_FilterIdHigh=0x1116; 
    	CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff; 
    	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; 
    	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; 
    	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
    	CAN_FilterInit(&CAN_FilterInitStructure);
    	#endif
    	
    	CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);				//FIFO0        .		    
    
    	NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;    //     ,     	USB_LP_CAN1_RX0_IRQn
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;     //      1
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //      0
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/*     ,       fifo               */
    	NVIC_Init(&NVIC_InitStructure);
    	
    }