wozhishanggao9 2017-05-26 03:38 采纳率: 0%
浏览 2074

各位大侠,帮我看一下程序,stm32 CAN过滤器功能,过滤器组大于4就没有作用了,为什么?

GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure1,CAN_FilterInitStructure2,CAN_FilterInitStructure3,CAN_FilterInitStructure4;
CAN_FilterInitTypeDef CAN_FilterInitStructure5,CAN_FilterInitStructure6;

NVIC_InitTypeDef NVIC_InitStructure;
unsigned short mask;
unsigned short filter_data1[] = {0x500, 0x501, 0x502, 0x503, 0x504, 0x505, 0x506, 0x507, 0x508, 0x509, 0x50A, 0x50B, 0x50C, 0x50D, 0x50E, 0x50F};
unsigned short filter_data2[] = {0x510, 0x511, 0x512, 0x513, 0x514, 0x515, 0x516, 0x517, 0x518, 0x519, 0x51A, 0x51B, 0x51C, 0x51D, 0x51E, 0x51F};
unsigned short filter_data3[] = {0x520, 0x521, 0x522, 0x523, 0x524, 0x525, 0x526, 0x527, 0x528, 0x529, 0x52A, 0x52B, 0x52C, 0x52D, 0x52E, 0x52F};
unsigned short filter_data4[] = {0x530, 0x531, 0x532, 0x533, 0x534, 0x535, 0x536, 0x537, 0x538, 0x539, 0x53A, 0x53B, 0x53C, 0x53D, 0x53E, 0x53F};
unsigned short filter_data5[] = {0x4E0,0x4E3,0x5E8,0x540};
//使能相关时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟

//初始化GPIO
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
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(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12

      //引脚复用映射配置
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11复用为CAN1
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN1

      //CAN单元设置
       CAN_InitStructure.CAN_TTCM=DISABLE;        //非时间触发通信模式   
      CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理          
      CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
      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;        //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
      CAN_InitStructure.CAN_BS1=CAN_BS1_7tq; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
      CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;//Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq
      CAN_InitStructure.CAN_Prescaler=6;  //分频系数(Fdiv)为brp+1        
      CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1 

            //配置过滤器
      CAN_FilterInitStructure1.CAN_FilterNumber=0;          //过滤器0
      CAN_FilterInitStructure1.CAN_FilterMode=CAN_FilterMode_IdMask; 
      CAN_FilterInitStructure1.CAN_FilterScale=CAN_FilterScale_32bit; //32位 
      CAN_FilterInitStructure1.CAN_FilterIdHigh=filter_data1[0] << 5;////32位ID
      CAN_FilterInitStructure1.CAN_FilterIdLow=0x0000;

       mask =0xff0;                      // 

      CAN_FilterInitStructure1.CAN_FilterMaskIdHigh= (mask << 5);//32位MASK
      CAN_FilterInitStructure1.CAN_FilterMaskIdLow=0x0000 | 0x02;

       CAN_FilterInitStructure1.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
      CAN_FilterInitStructure1.CAN_FilterActivation=ENABLE; //激活过滤器0
      CAN_FilterInit(&CAN_FilterInitStructure1);//滤波器初始化

                    //配置过滤器
      CAN_FilterInitStructure2.CAN_FilterNumber=1;          //过滤器1
      CAN_FilterInitStructure2.CAN_FilterMode=CAN_FilterMode_IdMask; 
      CAN_FilterInitStructure2.CAN_FilterScale=CAN_FilterScale_32bit; //32位 
      CAN_FilterInitStructure2.CAN_FilterIdHigh=filter_data2[0] << 5;////32位ID
      CAN_FilterInitStructure2.CAN_FilterIdLow=0x0000;

       mask =0xff0;                      // 

      CAN_FilterInitStructure2.CAN_FilterMaskIdHigh= (mask << 5);//32位MASK
      CAN_FilterInitStructure2.CAN_FilterMaskIdLow=0x0000 | 0x02;

       CAN_FilterInitStructure2.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
      CAN_FilterInitStructure2.CAN_FilterActivation=ENABLE; //激活过滤器0
      CAN_FilterInit(&CAN_FilterInitStructure2);//滤波器初始化

                    //配置过滤器
      CAN_FilterInitStructure3.CAN_FilterNumber=2;          //过滤器2
      CAN_FilterInitStructure3.CAN_FilterMode=CAN_FilterMode_IdMask; 
      CAN_FilterInitStructure3.CAN_FilterScale=CAN_FilterScale_32bit; //32位 
      CAN_FilterInitStructure3.CAN_FilterIdHigh=filter_data3[0] << 5;////32位ID
      CAN_FilterInitStructure3.CAN_FilterIdLow=0x0000;

       mask =0xff0;                      // 

      CAN_FilterInitStructure3.CAN_FilterMaskIdHigh= (mask << 5);//32位MASK
      CAN_FilterInitStructure3.CAN_FilterMaskIdLow=0x0000 | 0x02;

       CAN_FilterInitStructure3.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
      CAN_FilterInitStructure3.CAN_FilterActivation=ENABLE; //激活过滤器0
      CAN_FilterInit(&CAN_FilterInitStructure3);//滤波器初始化

                                    //配置过滤器
      CAN_FilterInitStructure4.CAN_FilterNumber=3;          //过滤器3
      CAN_FilterInitStructure4.CAN_FilterMode=CAN_FilterMode_IdMask; 
      CAN_FilterInitStructure4.CAN_FilterScale=CAN_FilterScale_32bit; //32位 
      CAN_FilterInitStructure4.CAN_FilterIdHigh=filter_data4[0] << 5;////32位ID
      CAN_FilterInitStructure4.CAN_FilterIdLow=0x0000;

       mask =0xff0;                      // 

      CAN_FilterInitStructure4.CAN_FilterMaskIdHigh= (mask << 5);//32位MASK
      CAN_FilterInitStructure4.CAN_FilterMaskIdLow=0x0000 | 0x02;

       CAN_FilterInitStructure4.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
      CAN_FilterInitStructure4.CAN_FilterActivation=ENABLE; //激活过滤器0
      CAN_FilterInit(&CAN_FilterInitStructure4);//滤波器初始化

//

//配置过滤器
CAN_FilterInitStructure5.CAN_FilterNumber=4; //过滤器4
CAN_FilterInitStructure5.CAN_FilterMode=CAN_FilterMode_IdList;
CAN_FilterInitStructure5.CAN_FilterScale=CAN_FilterScale_16bit; //32位
CAN_FilterInitStructure5.CAN_FilterIdHigh=filter_data5[0] << 5;////32位ID
CAN_FilterInitStructure5.CAN_FilterIdLow=0x0000 | CAN_ID_STD;

      CAN_FilterInitStructure5.CAN_FilterMaskIdHigh= (filter_data5[2] << 5);//32位MASK
      CAN_FilterInitStructure5.CAN_FilterMaskIdLow=0x0000 | CAN_ID_STD;

       CAN_FilterInitStructure5.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
      CAN_FilterInitStructure5.CAN_FilterActivation=ENABLE; //激活过滤器0
      CAN_FilterInit(&CAN_FilterInitStructure5);//滤波器初始化

                                                                    //配置过滤器
      CAN_FilterInitStructure6.CAN_FilterNumber=5;          //过滤器5 只要过滤器组大于4,次滤波器组就没有作用了 ?????????????
      CAN_FilterInitStructure6.CAN_FilterMode=CAN_FilterMode_IdList; 
      CAN_FilterInitStructure6.CAN_FilterScale=CAN_FilterScale_32bit; //32位 
      CAN_FilterInitStructure6.CAN_FilterIdHigh=filter_data5[2] << 5;////32位ID
      CAN_FilterInitStructure6.CAN_FilterIdLow=0x0000 | CAN_ID_STD;

      CAN_FilterInitStructure6.CAN_FilterMaskIdHigh= (filter_data5[3] << 5);//32位MASK
      CAN_FilterInitStructure6.CAN_FilterMaskIdLow=0x0000 | CAN_ID_STD;

       CAN_FilterInitStructure6.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
      CAN_FilterInitStructure6.CAN_FilterActivation=ENABLE; //激活过滤器0
      CAN_FilterInit(&CAN_FilterInitStructure6);//滤波器初始化        

      CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                

      NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     // 主优先级为1
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;            // 次优先级为0
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
  • 写回答

2条回答 默认 最新

  • shen_wei 2017-05-26 07:40
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 我想在一个软件里添加一个优惠弹窗,应该怎么写代码
  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流