打印
[STM32F1]

CAN总线过滤器,神一样的描述,哪个大侠可以给我描述清楚,谢谢

[复制链接]
2860|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
autooy|  楼主 | 2014-5-25 16:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我不知道是否真明白,反正我在编写过程中,现在碰见的问题是时而可以,时而不可以,所以,我越看相关帖子就是越不明白了。所以,请教各位大侠:
背景:
1、我的CAN总线上悬挂着9个驱动器,每个驱动器对应一个编号。对应6、7、8、9、10...14号。
2、我设置的过滤器组是0(这里我非常不理解,说是有0-13个32位的过滤器,那么为什么是只设置一个0,还是我有9个驱动器,需要设置为9??????????非常不理解中...不是只要通过其中一组就可以有效了嘛)
3、拓展帧EXID有可能是我第4点二中的对应的任何一个值;比如拓展ID = 0X01300071,0X013000F1,0X01380071,0X013800F1等等;
4、我的设置如下:
  一:过滤器设置:
        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)0x01FF00FF<<3)&0xFFFF0000)>>16;//0x0000;////32位ID
          CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x01FF00FF<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0XFFFF; //0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//0xFFFF;//32位MASK
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//0xFFFF;        使用全匹配方案;
          CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0

          CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化

二、我的接收模式:(可能问题就出在我的接收模式上,但是我又想不到更好的办法)
说明:我是想通过这个拓展ID的办法来匹配对应的ID号,同SX_1,SX_2,SX_3是开关量,是时刻都有可能变化的。



u8 Can_Receive_Msg(u8 *buf)
{                                     
        u32 i;
        CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;                //没有接收到数据,直接退出
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据       
  //以下对应6#信号;
    if(RxMessage.ExtId==0x01300071)//对应的是6号站点;
    {S6_1=1;}
    if(RxMessage.ExtId==0x013000F1)//对应的是6号站点;
    {S6_1=0;}
    if(RxMessage.ExtId==0x01300072)//对应的是6号站点;
    {S6_2=1;}
    if(RxMessage.ExtId==0x013000F2)//对应的是6号站点;
    {S6_2=0;}
    if(RxMessage.ExtId==0x01300073)//对应的是6号站点;
    {S6_3=1;}
    if(RxMessage.ExtId==0x013000F3)//对应的是6号站点;
    {S6_3=0;}
  //以下对应7#信号;
    if(RxMessage.ExtId==0x01380071)//对应的是7号站点;
    {S7_1=1;}
    if(RxMessage.ExtId==0x013800F1)//对应的是7号站点;
    {S7_1=0;}
    if(RxMessage.ExtId==0x01380072)//对应的是7号站点;
    {S7_2=1;}
    if(RxMessage.ExtId==0x013800F2)//对应的是7号站点;
    {S7_2=0;}
    if(RxMessage.ExtId==0x01380073)//对应的是7号站点;
    {S7_3=1;}
    if(RxMessage.ExtId==0x013800F3)//对应的是7号站点;
    {S7_3=0;}

  //以下对应8#信号;
    if(RxMessage.ExtId==0x01400071)//对应的是8号站点;
    {S8_1=1;}
    if(RxMessage.ExtId==0x014000F1)//对应的是8号站点;
    {S8_1=0;}
    if(RxMessage.ExtId==0x01400072)//对应的是8号站点;
    {S8_2=1;}
    if(RxMessage.ExtId==0x014000F2)//对应的是8号站点;
    {S8_2=0;}
    if(RxMessage.ExtId==0x01400073)//对应的是8号站点;
    {S8_3=1;}
    if(RxMessage.ExtId==0x014000F3)//对应的是8号站点;
    {S8_3=0;}
  //以下对应9#信号;
    if(RxMessage.ExtId==0x01480071)//对应的是9号站点;
    {S9_1=1;}
    if(RxMessage.ExtId==0x014800F1)//对应的是9号站点;
    {S9_1=0;}
    if(RxMessage.ExtId==0x01480072)//对应的是9号站点;
    {S9_2=1;}
    if(RxMessage.ExtId==0x014800F2)//对应的是9号站点;
    {S9_2=0;}
    if(RxMessage.ExtId==0x01480073)//对应的是9号站点;
    {S9_3=1;}
    if(RxMessage.ExtId==0x014800F3)//对应的是9号站点;
    {S9_3=0;}

  //以下对应10#信号;
    if(RxMessage.ExtId==0x01500071)//对应的是10号站点;
    {S10_1=1;}
    if(RxMessage.ExtId==0x015000F1)//对应的是10号站点;
    {S10_1=0;}
    if(RxMessage.ExtId==0x01500072)//对应的是10号站点;
    {S10_2=1;}
    if(RxMessage.ExtId==0x015000F2)//对应的是10号站点;
    {S10_2=0;}
    if(RxMessage.ExtId==0x01500073)//对应的是10号站点;
    {S10_3=1;}
    if(RxMessage.ExtId==0x015000F3)//对应的是10号站点;
    {S10_3=0;}
    for(i=0;i<4;i++)//目前最大的只有4个字节的数据,所以是4,不是8啦!
    buf[i]=RxMessage.Data[i];

    return RxMessage.DLC;
}

沙发
mmuuss586| | 2014-5-26 10:36 | 只看该作者
本帖最后由 mmuuss586 于 2014-5-26 10:38 编辑

这是我的CAN中断程序,你可以参考下;
我只测试过接了4个驱动器;

void CAN1_RX0_IRQHandler(void)
{
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
  
  if ((RxMessage.StdId == 0x321)&&(RxMessage.IDE == CAN_ID_STD) && (RxMessage.DLC == 8))
  {
        Run_Flag=1;
  }
}

使用特权

评论回复
板凳
autooy|  楼主 | 2014-5-26 18:21 | 只看该作者
谢谢您的回答,不过我这个问题也不大,我后来改为中断方式接受就没有问题了,而我这里是查询模式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

337

主题

684

帖子

8

粉丝