N32使用CAN列表模式过滤指定ID报文
在CAN使用过程中,需要对总线上的报文做接收处理,但一般使用场景来说,总线上报文繁多,我们不会对总线上所有的报文全部接收,只需要接收我们需要的报文即可,下面小编通过典型实例来介绍一下如何配置过滤器来实现对特定ID报文的接收 例1:需要过滤一个ID为0x22A的数据标准帧,将过滤器初始化函数这样配置即可(以N32G45X为例):#define CAN_FILTER_STDID(STDID) ((STDID&0x7FF)<<5)#define CAN_STD_ID_H_MASK_DONT_CARE 0x0000#define CAN_STD_ID_L_MASK_DONT_CARE 0x0000void CAN_Filter_Init(void){ CAN_FilterInitType CAN_FilterInitStructure; CAN_FilterInitStructure.Filter_Num = CAN_FILTERNUM0; CAN_FilterInitStructure.Filter_Mode = CAN_Filter_IdListMode; CAN_FilterInitStructure.Filter_Scale = CAN_Filter_32bitScale; CAN_FilterInitStructure.Filter_HighId = CAN_FILTER_STDID(0x22A); CAN_FilterInitStructure.Filter_LowId = CAN_FILTER_STDID(0x22A); CAN_FilterInitStructure.FilterMask_HighId = CAN_STD_ID_H_MASK_DONT_CARE; CAN_FilterInitStructure.FilterMask_LowId = CAN_STD_ID_L_MASK_DONT_CARE; CAN_FilterInitStructure.Filter_FIFOAssignment = CAN_FIFO0; CAN_FilterInitStructure.Filter_Act = ENABLE; CAN1_InitFilter(&CAN_FilterInitStructure);}
例2:需要过滤一个ID为0x18FF0320的数据扩展帧,我们将过滤器初始化函数这样配置即可(以N32G45X为例):
#define CAN_FILTER_EXTID_H(EXTID) ((EXTID<<3)>>16)&0xffff#define CAN_FILTER_EXTID_L(EXTID) ((EXTID)<<3)&0xffff | CAN_ID_EXT#define CAN_STD_ID_H_MASK_DONT_CARE 0x0000#define CAN_STD_ID_L_MASK_DONT_CARE 0x0000void CAN_Filter_Init(void){ CAN_FilterInitType CAN_FilterInitStructure; CAN_FilterInitStructure.Filter_Num = CAN_FILTERNUM0; CAN_FilterInitStructure.Filter_Mode = CAN_Filter_IdListMode; CAN_FilterInitStructure.Filter_Scale = CAN_Filter_32bitScale; CAN_FilterInitStructure.Filter_HighId = CAN_FILTER_EXTID_H(0x18FF0320); CAN_FilterInitStructure.Filter_LowId = CAN_FILTER_EXTID_L(0x18FF0320); CAN_FilterInitStructure.FilterMask_HighId = CAN_STD_ID_H_MASK_DONT_CARE; CAN_FilterInitStructure.FilterMask_LowId = CAN_STD_ID_L_MASK_DONT_CARE; CAN_FilterInitStructure.Filter_FIFOAssignment = CAN_FIFO0; CAN_FilterInitStructure.Filter_Act = ENABLE; CAN1_InitFilter(&CAN_FilterInitStructure);
}
页:
[1]