STM32单片机的CAN总线通讯,最难理解的地方就是过滤器和屏蔽器的配置。
最简单的配置:
void HAL_CAN1_Filter_Config(void)
{
CAN_FilterTypeDef CAN_FilterStructure;
CAN_FilterStructure.FilterActivation = ENABLE;
CAN_FilterStructure.FilterBank = 1;
CAN_FilterStructure.FilterMode = CAN_FILTERMODE_IDMASK;
CAN_FilterStructure.FilterScale = CAN_FILTERSCALE_32BIT;
CAN_FilterStructure.FilterFIFOAssignment = CAN_FILTER_FIFO0;
CAN_FilterStructure.FilterIdHigh = 0x0000;
CAN_FilterStructure.FilterIdLow = 0x0000;
CAN_FilterStructure.FilterMaskIdHigh = 0x0000;
CAN_FilterStructure.FilterMaskIdLow = 0x0000;
HAL_CAN_ConfigFilter(&hcan1,&CAN_FilterStructure);
}
解释:
FilterBank = 1,使用第1组屏蔽器和过滤器, 过滤器 F1R1(32bit),屏蔽器F1R2(32bit)
FilterIdHigh : F1R1(31-16bit) 高16位 ,包括 : STID10-STID0, EXID17-EXID13
FilterIdLow : F1R1(15-0bit) 低16位 ,EXID11-EXID0,IDE,RTR,0
FilterMaskIdHigh : F1R2(31-16bit)的 高16位
FilterMaskIdLow : F1R2(15-0bit) 的 低16位
帧格式:标准帧,帧类型:数据帧,帧ID:0x0000
屏蔽器设置:全部不屏蔽
按照上面的设置,上位机发送的数据包,只要波特率符合,全部都能接收,总线上的每个节点都会接收到同样的信息,这样就失去了CAN总线通讯的优势,与485通讯没有太大区别。合理设置过滤器和屏蔽器,不是发给本节点的信息,会被硬件屏蔽掉,软件根本“不知道”有信息发过来,只有确实发给本节点的信息,软件才能收到,提高了软件的效率。
|