CAN 过滤器多个配置
STM32H750 扩展帧多个过滤器配置示例
u8 FDCAN1_Mode_Init(u16 presc,u8 ntsjw,u16 ntsg1,u8 ntsg2,u32 mode) { FDCAN_ClkCalUnitTypeDef FDCAN1_ClkCalUnit; FDCAN_FilterTypeDef FDCAN1_RXFilter; FDCAN_FilterTypeDef FDCAN1_RXFilter1; //初始化FDCAN1 HAL_FDCAN_DeInit(&FDCAN1_Handler); //先清除以前的设置 FDCAN1_Handler.Instance=FDCAN1; FDCAN1_Handler.Init.FrameFormat=FDCAN_FRAME_CLASSIC; //传统模式 FDCAN1_Handler.Init.Mode=mode; //回环测试 FDCAN1_Handler.Init.AutoRetransmission=DISABLE; //关闭自动重传!传统模式下一定要关闭!!! FDCAN1_Handler.Init.TransmitPause=DISABLE; //关闭传输暂停 FDCAN1_Handler.Init.ProtocolException=DISABLE; //关闭协议异常处理 FDCAN1_Handler.Init.NominalPrescaler=presc; //分频系数 FDCAN1_Handler.Init.NominalSyncJumpWidth=ntsjw; //重新同步跳跃宽度 FDCAN1_Handler.Init.NominalTimeSeg1=ntsg1; //tsg1范围:2~256 FDCAN1_Handler.Init.NominalTimeSeg2=ntsg2; //tsg2范围:2~128 FDCAN1_Handler.Init.MessageRAMOffset=0; //信息RAM偏移 FDCAN1_Handler.Init.StdFiltersNbr=1; //标准信息ID滤波器编号,标准帧过滤器个数 0-128 FDCAN1_Handler.Init.ExtFiltersNbr=2; //扩展信息ID滤波器编号,扩展帧过滤器个数 0-64 FDCAN1_Handler.Init.RxFifo0ElmtsNbr=1; //接收FIFO0元素编号 FDCAN1_Handler.Init.RxFifo0ElmtSize=FDCAN_DATA_BYTES_8; //接收FIFO0元素大小:8字节 FDCAN1_Handler.Init.RxBuffersNbr=0; //接收缓冲编号 FDCAN1_Handler.Init.TxEventsNbr=0; //发送事件编号 FDCAN1_Handler.Init.TxBuffersNbr=0; //发送缓冲编号 FDCAN1_Handler.Init.TxFifoQueueElmtsNbr=1; //发送FIFO序列元素编号 FDCAN1_Handler.Init.TxFifoQueueMode=FDCAN_TX_FIFO_OPERATION; //发送FIFO序列模式 FDCAN1_Handler.Init.TxElmtSize=FDCAN_DATA_BYTES_8; //发送大小:8字节 if(HAL_FDCAN_Init(&FDCAN1_Handler)!=HAL_OK) return 1; //初始化FDCAN FDCAN1_ClkCalUnit.ClockCalibration=DISABLE; //关闭时钟校准 FDCAN1_ClkCalUnit.ClockDivider=FDCAN_CLOCK_DIV2; //时钟分频值 HAL_FDCAN_ConfigClockCalibration(&FDCAN1_Handler,&FDCAN1_ClkCalUnit);//设置分频 //配置RX滤波器 //过滤id 在 0CEACB00 和 0CEACBFF 之间的 FDCAN1_RXFilter.IdType=FDCAN_EXTENDED_ID; //标准ID FDCAN1_RXFilter.FilterIndex=0; //滤波器索引id FDCAN1_RXFilter.FilterType=FDCAN_FILTER_RANGE_NO_EIDM; //滤波器类型 FDCAN1_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0; //过滤器0关联到FIFO0 FDCAN1_RXFilter.FilterID1=0x0CEACB00; //32位ID FDCAN1_RXFilter.FilterID2=0x0CEACBFF; //如果FDCAN配置为传统模式的话,这里是32位掩码 if(HAL_FDCAN_ConfigFilter(&FDCAN1_Handler,&FDCAN1_RXFilter)!=HAL_OK) return 2;//滤波器初始化 //过滤id为 0CABCB68 和 0CACCB68 的 FDCAN1_RXFilter1.IdType=FDCAN_EXTENDED_ID; //标准ID FDCAN1_RXFilter1.FilterIndex=1; //滤波器索引id FDCAN1_RXFilter1.FilterType=FDCAN_FILTER_DUAL; //滤波器类型 FDCAN1_RXFilter1.FilterConfig=FDCAN_FILTER_TO_RXFIFO0; //过滤器0关联到FIFO0 FDCAN1_RXFilter1.FilterID1=0x0CABCB68; //32位ID FDCAN1_RXFilter1.FilterID2=0x0CACCB68; //如果FDCAN配置为传统模式的话,这里是32位掩码 if(HAL_FDCAN_ConfigFilter(&FDCAN1_Handler,&FDCAN1_RXFilter1)!=HAL_OK) return 2;//滤波器初始化 //拒绝所有帧,如果包含上述条件的帧则通过 HAL_FDCAN_ConfigGlobalFilter(&FDCAN1_Handler,FDCAN_REJECT, FDCAN_REJECT, DISABLE, ENABLE); //FDCAN_ACCEPT_IN_RX_FIFO0 HAL_FDCAN_Start(&FDCAN1_Handler); //开启FDCAN HAL_FDCAN_ActivateNotification(&FDCAN1_Handler,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0); return 0; }
最终实验结果,在can上位机当中只有id符合条件的,arm才能收到
本文来自博客园踩坑狭,作者:韩若明瞳,转载请注明原文链接:https://www.cnblogs.com/han-guang-xue/p/16805916.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)