STM32F103VET6的CAN模块怎么接受2个不同ID或者更多的不同ID的扩展帧报文?

2019-07-20 23:55发布

微信图片_20190611154147.png 如图所示,我要发送3不同ID(报文编号就是前面打√的0,1,2)的报文给单片机,目前我只能实现选中1个发送,单片机正常接受,如果选中2个或全选则前面的会被后面的替代掉(选中0和2,0会被2替代掉),请问程序怎么处理才能将所有报文正常接受过来且能实现接受更多不同ID的报文?使用接受中断的方式,想就用FIFO1的消息挂号中断实现
void CAN1_RX1_IRQHandler(void)
{
        CanRxMsg RxMessage;
        IWDG_ReloadCounter();//喂狗
        CAN_Cnt_1=0;
        CAN_Receive(CAN1,CAN_FIFO1,&RxMessage);       
        if(0 == RxMessage.FMI)   YuRe_Data_OK=1; //采用检查过滤器匹配序号的方式检查是哪个ID的报文
        else               YuRe_Data_OK=0;
        if(1 == RxMessage.FMI)   Water_Data_OK=1;
        else               Water_Data_OK=0;
        if(2 == RxMessage.FMI)   ZhuanSu_Data_OK=1;
        else               ZhuanSu_Data_OK=0;

        if(YuRe_Data_OK)
           CAN_YuRe_Data=RxMessage.Data[3];
         else
                 YuRe_CAN_LED_Flag=0;
        if(Water_Data_OK)
           CAN_Water_Data=RxMessage.Data[0];
         else
           Task_TempWaterAD();
         if(ZhuanSu_Data_OK)
         {
           ZhuanSu_L = RxMessage.Data[3];
           ZhuanSu_H = RxMessage.Data[4];
         }
        else
                HR_Signal = 0;
        CAN_ClearITPendingBit(CAN1,CAN_IT_FMP1);  // 清除挂起的中断       
}




请教各位大神指点,谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
peng1554
1楼-- · 2019-07-21 00:09
帮顶~~
nashui_sx
2楼-- · 2019-07-21 01:46
 精彩回答 2  元偷偷看……
龙的心098611227
3楼-- · 2019-07-21 06:25
nashui_sx 发表于 2019-6-11 18:01
你不过滤都来着不拒呀,只要收的过来,都会收了

/***********************以下为存入FIFO1的报文的过滤器组***************/
         //待初始化的滤波器组:3,过滤器编号为0,按照初始化的顺序编号
   CAN_FilterInitStructure.CAN_FilterNumber=3;
   //屏蔽模式
   CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
   //32位寄存器
   CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
   //高16位,过滤器
   CAN_FilterInitStructure.CAN_FilterIdHigh=YuRe_ID>>13;
   //低16位,过滤器
   CAN_FilterInitStructure.CAN_FilterIdLow=((YuRe_ID<<3) | CAN_ID_EXT | CAN_RTR_DATA)&0x0000FFFF;
   //屏蔽位高16位
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;
   //屏蔽位低16位
   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;
   //过滤器 0 关联到 FIFO0
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO1;
   //使能过滤器
   CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
   //初始化过滤器
   CAN_FilterInit(&CAN_FilterInitStructure);
         
         //待初始化的滤波器组:4,过滤器编号为1,按照初始化的顺序编号
   CAN_FilterInitStructure.CAN_FilterNumber=4;
   //屏蔽模式
   CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
   //32位寄存器
   CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
   //高16位,过滤器
   CAN_FilterInitStructure.CAN_FilterIdHigh=Water_ID>>13;
   //低16位,过滤器
   CAN_FilterInitStructure.CAN_FilterIdLow = ((Water_ID<<3) | CAN_ID_EXT | CAN_RTR_DATA)&0x0000FFFF;
   //屏蔽位高16位
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;
   //屏蔽位低16位
   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;
   //过滤器 0 关联到 FIFO0
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO1;
   //使能过滤器
   CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
   //初始化过滤器
   CAN_FilterInit(&CAN_FilterInitStructure);
         
         //待初始化的滤波器组:5,过滤器编号为2,按照初始化的顺序编号
   CAN_FilterInitStructure.CAN_FilterNumber=5;
   //屏蔽模式
   CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
   //32位寄存器
   CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
   //高16位,过滤器
   CAN_FilterInitStructure.CAN_FilterIdHigh=ZhuanSu_ID>>13;
   //低16位,过滤器
   CAN_FilterInitStructure.CAN_FilterIdLow=((ZhuanSu_ID<<3) | CAN_ID_EXT | CAN_RTR_DATA)&0x0000FFFF;
   //屏蔽位高16位
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;
   //屏蔽位低16位
   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;
   //过滤器 0 关联到 FIFO0
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO1;
   //使能过滤器
   CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
   //初始化过滤器
   CAN_FilterInit(&CAN_FilterInitStructure);


有的,我只收这三个ID的报文,其他ID都不要
龙的心098611227
4楼-- · 2019-07-21 06:48
 精彩回答 2  元偷偷看……
nashui_sx
5楼-- · 2019-07-21 10:32
龙的心098611227 发表于 2019-6-11 20:19
3个都能正常接收,只能勾选1个,单片机才正常接收,勾选2个或3个,前面的就被最后面的覆盖掉了

先不过滤,上位机每帧发送间隔加大试试
龙的心098611227
6楼-- · 2019-07-21 14:09
nashui_sx 发表于 2019-6-11 22:49
先不过滤,上位机每帧发送间隔加大试试

试过的,间隔时间加的越大,越正常,不过我看过人家的产品在间隔设为0时,都能正常接受,我这个必须做到至少和人家一样

一周热门 更多>