祝各位道友念头通达
GitHub Gitee 语雀 打赏

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才能收到
image

image

posted @ 2022-10-19 13:21  韩若明瞳  阅读(1068)  评论(0)    收藏  举报