大家先去看一个寄存器 CAN_TIxR(x=0~2) 发送邮箱标识寄存器
标准帧在 31~21 位 共11位 STID[10:0]
扩展帧在 20~3 位 共29位 EXID[17:0]+STID[10:0]
0~2 位分别为 TXRQ ,RTR ,IDE
uint16_t CAN_ID = 0x0101
uint32_t ExCAN_ID= 0x10001
所以设置标位帧ID过滤应该这样设:
CAN_FilterInitStructure.CAN_FilterIdHigh = CAN_ID<<5;
CAN_FilterInitStructure.CAN_FilterIdLow = 0;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC; //RTR 可以为数据帧也可以远帧
扩展帧ID过滤应该这样设:
CAN_FilterInitStructure.CAN_FilterIdHigh = (uint16_t)(ExCAN_ID>>(29-16)); //取高16位
CAN_FilterInitStructure.CAN_FilterIdLow = (uint16_t)(ExCAN_ID<<3)|CAN_ID_EXT;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC; //RTR 可以为数据帧也可以远帧
今天刚学会,大家有不懂可以问,不过一般官方资料里就有,仔细阅读就可以了,如果你想两种帧都接收,那就把IDE位也屏蔽掉
可以这样 CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC&(~CAN_ID_EXT);
标准帧在 31~21 位 共11位 STID[10:0]
扩展帧在 20~3 位 共29位 EXID[17:0]+STID[10:0]
0~2 位分别为 TXRQ ,RTR ,IDE
uint16_t CAN_ID = 0x0101
uint32_t ExCAN_ID= 0x10001
所以设置标位帧ID过滤应该这样设:
CAN_FilterInitStructure.CAN_FilterIdHigh = CAN_ID<<5;
CAN_FilterInitStructure.CAN_FilterIdLow = 0;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC; //RTR 可以为数据帧也可以远帧
扩展帧ID过滤应该这样设:
CAN_FilterInitStructure.CAN_FilterIdHigh = (uint16_t)(ExCAN_ID>>(29-16)); //取高16位
CAN_FilterInitStructure.CAN_FilterIdLow = (uint16_t)(ExCAN_ID<<3)|CAN_ID_EXT;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC; //RTR 可以为数据帧也可以远帧
今天刚学会,大家有不懂可以问,不过一般官方资料里就有,仔细阅读就可以了,如果你想两种帧都接收,那就把IDE位也屏蔽掉
可以这样 CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC&(~CAN_ID_EXT);