我不知道是否真明白,反正我在编写过程中,现在碰见的问题是时而可以,时而不可以,所以,我越看相关帖子就是越不明白了。所以,请教各位大侠:
背景:
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;
}
|