本人用的主控是是stm32f405芯片,这款芯片的滤波器CAN1、2是共用的,所以设置的时候要注意两个总线都使用哪类通信方式;
本人用的can1使用标准帧、数据帧,执行canopen标准通信方式,所以ID种类很少,所以就用了列表模式;只可以接收id=0x00000601 0x00000602 0x00000603 0x00000604 的数据;
//设置成列表滤波
sFilterConfig1.FilterBank = 0;
sFilterConfig1.FilterMode = CAN_FILTERMODE_IDLIST;
sFilterConfig1.FilterScale = CAN_FILTERSCALE_16BIT;
sFilterConfig1.FilterIdHigh = 0x00000601<<5; //设置过滤器ID高16位
sFilterConfig1.FilterIdLow = 0x00000602<<5; //设置过滤器ID低16位
sFilterConfig1.FilterMaskIdHigh = 0x00000603<<5; //设置过滤器掩码高16位
sFilterConfig1.FilterMaskIdLow = 0x00000604<<5; //设置过滤器掩码低16位
sFilterConfig1.FilterFIFOAssignment = CAN_RX_FIFO0;
sFilterConfig1.FilterActivation = ENABLE;
sFilterConfig1.SlaveStartFilterBank = 0;
can2通信采用扩展帧、数据帧,接一个控制一个标准模块,它有一个ID=1;因为他们共用滤波器,所以又设置了一个过滤扩展帧的滤波,使其can2能够接收扩展帧;
slave_id = 0x00000001;
//设置成只接受扩展帧slave_id
sFilterConfig2.FilterBank = 15;
sFilterConfig2.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig2.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig2.FilterIdHigh =(((u32)slave_id<<3)&0xFFFF0000)>>16;
sFilterConfig2.FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;
sFilterConfig2.FilterMaskIdHigh = 0x0000;//
sFilterConfig2.FilterMaskIdLow = 0x00FF;//只保证slave_id低8位一致就可以
sFilterConfig2.FilterFIFOAssignment = CAN_RX_FIFO0;
sFilterConfig2.FilterActivation = ENABLE;
sFilterConfig2.SlaveStartFilterBank = 0;
注意事项:
1、FilterMaskIdLow= 0x00FF;为了过滤标准模块的ID;若不对id滤波的话,CAN1的标准帧就会通过该滤波接收到,所以,必须要对ID滤波;
2、sFilterConfig2.FilterBank序号要不同;
3、第二个滤波器就是根据5、对扩展帧进行过滤:(扩展帧不会被过滤掉),改过来的;
u32 slave_id = 0x01 ;
CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;
该设置的意思是ID必须是0x00000001,才能接收到数据;
u32 slave_id = 0x01 ;
CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x00FF;
该设置的意思是ID最低字节必须是01,前面的不关心是多少;如果想接收其他的板id,再增加滤波器设置;
其他博主的设置,也分享一下:
三、滤波器的详细设置
u32 slave_id = 0x01 ;
1、对扩展数据帧进行过滤:(只接收扩展数据帧)
CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLo=(((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
(注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)
2、对扩展远程帧过滤:(只接收扩展远程帧)
CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
3、对标准远程帧过滤:(只接收标准远程帧)
CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<21)&0xffff0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
4、对标准数据帧过滤:(只接收标准数据帧)
CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<21)&0xffff0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
5、对扩展帧进行过滤:(扩展帧不会被过滤掉)
CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;
6、对标准帧进行过滤:(标准帧不会被过滤掉)
CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<21)&0xffff0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD)&0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;
注:slave_id为要过滤的id号。