CAN过滤器组配置

2019-07-20 09:12发布

本CAN过滤器组配置代替原例程,可以方便的配置CAN的过滤器组

在CAN.C 中:
/*********************************************************************************************************************************
* 函数名称:u8 CAN1_Mode_Init(u32 tsjw, u32 tbs2, u32 tbs1, u16 brp, u32 mode)
* 函数功能:CAN初始化
* 入口参数:tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1TQ~CAN_SJW_4TQ
*                        tbs2:时间段2的时间单元.   范围:CAN_BS2_1TQ~CAN_BS2_8TQ;
*                        tbs1:时间段1的时间单元.   范围:CAN_BS1_1TQ~CAN_BS1_16TQ
*                        brp :波特率分频器.范围:1~1024; tq=(brp)*tpclk1
*                                 波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
*                        mode:CAN_MODE_NORMAL,普通模式;CAN_MODE_LOOPBACK,回环模式;
* 出口参数:0,初始化OK;其他,初始化失败;
* 说    明:Fpclk1的时钟在初始化的时候设置为54M,如果设置CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_11tq,6,CAN_MODE_LOOPBACK);
*                        则波特率为:54M/((6+11+1)*6)=500Kbps
**********************************************************************************************************************************/
u8 CAN1_Mode_Init(u32 tsjw, u32 tbs2, u32 tbs1, u16 brp, u32 mode)
{
        CAN1_Handler.Instance = CAN1;
        CAN1_Handler.pTxMsg = &TxMessage;                             //发送消息
        CAN1_Handler.pRxMsg = &RxMessage;                             //接收消息
        CAN1_Handler.Init.Prescaler = brp;                                    //分频系数(Fdiv)为brp+1
        CAN1_Handler.Init.Mode = mode;                                        //模式设置
        CAN1_Handler.Init.SJW = tsjw;                                         //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1TQ~CAN_SJW_4TQ
        CAN1_Handler.Init.BS1 = tbs1;                                         //tbs1范围CAN_BS1_1TQ~CAN_BS1_16TQ
        CAN1_Handler.Init.BS2 = tbs2;                                         //tbs2范围CAN_BS2_1TQ~CAN_BS2_8TQ
        CAN1_Handler.Init.TTCM = DISABLE;                                     //非时间触发通信模式
        CAN1_Handler.Init.ABOM = DISABLE;                                     //软件自动离线管理
        CAN1_Handler.Init.AWUM = DISABLE;                             //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
        CAN1_Handler.Init.NART = ENABLE;                                      //禁止报文自动传送
        CAN1_Handler.Init.RFLM = DISABLE;                                     //报文不锁定,新的覆盖旧的
        CAN1_Handler.Init.TXFP = DISABLE;                                     //优先级由报文标识符决定
        if (HAL_CAN_Init(&CAN1_Handler) != HAL_OK) return 1;     //初始化

        return 0;
}


/*****************************************************************
* 函数名称:u8 CAN1_Filer16_Conf(void)
* 函数功能:CAN1 过滤器配置(16位过滤)
*
* 入口参数:IdH:                        ID过滤器高位       
*                        IdL:                        ID过滤器低位
*                        MaskIdH:                ID屏蔽字高位
*                        MaskIdL:                ID屏蔽字低位
*                        FIFOAssignment:        过滤器关联到的FIFO
*                        Number:                        过滤器组号
*                        Mode:                        屏蔽模式或者列表模式
*                        Scale:                        过滤器深度(32BIT或者16BIT)
*                       
* 出口参数:0,配置OK;其他,配置失败;
* 说    明:
******************************************************************/
u8 CAN1_Filer_Conf(u16 IdH, u16 IdL, u16 MaskIdH, u16 MaskIdL,u8 FIFOAssignment,u8 Number,u8 Mode,u8 Scale)
{
        CAN_FilterConfTypeDef  CAN1_FilerConf;
       
        CAN1_FilerConf.FilterIdHigh = IdH<<5;                                                                            // 16位 ID
        CAN1_FilerConf.FilterIdLow = IdL<<5;
        CAN1_FilerConf.FilterMaskIdHigh =  MaskIdH<<5;                                                                // 16位MASK
        CAN1_FilerConf.FilterMaskIdLow = MaskIdL<<5;
        CAN1_FilerConf.FilterFIFOAssignment = FIFOAssignment;                                                        // 过滤器0关联到FIFO0
        CAN1_FilerConf.FilterNumber = Number;                                                                          // 过滤器0
        CAN1_FilerConf.FilterMode = Mode;                                                                                        // 屏蔽位模式(另一种是列表模式)
        CAN1_FilerConf.FilterScale = Scale;                                                                                        // 过滤深度16 或者 32
        CAN1_FilerConf.FilterActivation = ENABLE;                                                                         // 激活滤波器0
        CAN1_FilerConf.BankNumber = 14;
        if (HAL_CAN_ConfigFilter(&CAN1_Handler, &CAN1_FilerConf) != HAL_OK) return 2;        // 滤波器初始化
        return 0;
}
       

在主程序中:
    CAN1_Mode_Init        (        CAN_SJW_1TQ,
                                            CAN_BS2_6TQ,
                                            CAN_BS1_11TQ,6,
                                            CAN_MODE_NORMAL        );                                                // CAN初始化正常模式,波特率500Kbps

        CAN1_Filer_Conf        (                                                                                        // CAN1 16位标准帧过滤器组初始化
                                                0x702,                                                                 // FilterIdHigh
                                                0x703,                                                                 // FilterIdLow
                                                0x704,                                                                 // FilterMaskIdHigh
                                                0x706,                                                                // FilterMaskIdLow
                                                CAN_FILTER_FIFO0,                                                // 过滤器0关联到FIFO0或者FIFO1
                                                0,                                                                        // 过滤器0~24
                                                CAN_FILTERMODE_IDLIST,                                        // FilterMode(或者屏蔽模式 CAN_FILTERMODE_IDMASK)
                                                CAN_FILTERSCALE_16BIT        );                                // 过滤器深度( CAN_FILTERSCALE_32BIT或者CAN_FILTERSCALE_16BIT)





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。