新手入门
- 积分
- 6
- 金钱
- 6
- 注册时间
- 2019-8-15
- 在线时间
- 0 小时
|
发表于 2019-8-15 15:06:26
|
显示全部楼层
根据实际实验,标准模式下,列出以下有两种工作模式的设置方法(屏蔽位模式、标识符模式),验证都能正常工作:
*假设希望通过CANID为0x0576的信息,滤波部分的配置如下:
方法一:使用屏蔽位模式 (该模式可通过多个CANID号)
CAN_FilterInitStructure.CAN_FilterNumber = 0; // CAN1滤波号选择0
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; // 屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; // 选择32位滤波器
CAN_FilterInitStructure.CAN_FilterIdHigh = ((0x0576<<21)&0xffff0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = ((0x0576<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; // 完全匹配
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; // 完全匹配
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; // Specifies the FIFO (0 or 1) which will be assigned to the filter.
*假设希望通过CANID为0x0576,0x0577的信息,滤波部分的配置如下:
方法二:使用标识符模式 (该模式可通过两个CANID号)
CAN_FilterInitStructure.CAN_FilterNumber = 0; // CAN1滤波号选择0
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; // 标识符模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; // 选择32位滤波器
CAN_FilterInitStructure.CAN_FilterIdHigh = ((0x0576<<21)&0xffff0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = ((0x0577<<21)&0xffff0000)>>16;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; // 完全匹配
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; // Specifies the FIFO (0 or 1) which will be assigned to the filter.
备注:测试结果两者均能工作,第一种模式中断会一直进入,尚未有时间排查,模式二有本标识符的信号过来即进入中断,正常,希望对大家有用。 |
|